Presque toutes les réponses portaient sur ce problème sur le Web, mais je ne pouvais pas le comprendre dans mon code.
Voici ma page JSP.
<form:form method="POST" commandName="category" modelAttribute="category" action="search_category">
<form:input path="category_name" />
<input type="submit" value="Submit">
</form:form>
Quand je supprime
<form:input path="category_name" />
Ça fonctionne bien. Je peux communiquer avec mon contrôleur. Donc, le problème est lié à cette ligne.
@Controller
public class SearchCategory {
@Autowired
private CategoryService categoryService;
@RequestMapping(value = "/search_category", method = RequestMethod.POST)
public @ResponseBody String searchCategoryFromDatabase(@ModelAttribute("category") Category category, BindingResult result){
return "something";
}
}
Voici mon web.xml
<?xml version="1.0" encoding="UTF-8"?>
<web-app version="2.5" xmlns="http://Java.Sun.com/xml/ns/javaee"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://Java.Sun.com/xml/ns/javaee http://Java.Sun.com/xml/ns/javaee/web-app_2_5.xsd">
<!-- Processes application requests -->
<servlet>
<servlet-name>appServlet</servlet-name>
<servlet-class>org.springframework.web.servlet.DispatcherServlet</servlet-class>
<init-param>
<param-name>contextConfigLocation</param-name>
<param-value>/WEB-INF/servlet-context.xml</param-value>
</init-param>
<load-on-startup>1</load-on-startup>
</servlet>
<servlet-mapping>
<servlet-name>appServlet</servlet-name>
<url-pattern>/</url-pattern>
</servlet-mapping>
<!-- The definition of the Root Spring Container shared by all Servlets and Filters -->
<context-param>
<param-name>contextConfigLocation</param-name>
<param-value>/WEB-INF/applicationContext.xml</param-value>
</context-param>
<filter>
<filter-name>hibernateFilter</filter-name>
<filter-class>org.springframework.orm.hibernate4.support.OpenSessionInViewFilter</filter-class>
</filter>
<filter-mapping>
<filter-name>hibernateFilter</filter-name>
<url-pattern>/*</url-pattern>
</filter-mapping>
<listener>
<listener-class>org.springframework.web.context.ContextLoaderListener</listener-class>
</listener>
</web-app>
Ceci est mon servlet-context.xml
<!-- Set the default page as index.jsp -->
<mvc:view-controller path="/" view-name="index"/>
<!-- Map resources -->
<mvc:resources mapping="/resources/**" location="/, classpath:/META-INF/web-resources/" />
<!-- Map simple view name such as "test" into /WEB-INF/views/test.jsp -->
<bean class="org.springframework.web.servlet.view.InternalResourceViewResolver">
<property name="prefix" value="/WEB-INF/" />
<property name="suffix" value=".jsp" />
</bean>
Et mon applicationContext.xml
<!-- Enable @Controller annotation support -->
<mvc:annotation-driven />
<context:annotation-config/>
<!-- Set the default page as index.jsp -->
<mvc:view-controller path="/" view-name="index"/>
<!-- Map resources -->
<mvc:resources mapping="/resources/**" location="/, classpath:/META-INF/web-resources/" />
<!-- Map simple view name such as "test" into /WEB-INF/views/test.jsp -->
<bean class="org.springframework.web.servlet.view.InternalResourceViewResolver">
<property name="prefix" value="/WEB-INF/" />
<property name="suffix" value=".jsp" />
</bean>
<!-- Scan classpath for annotations (eg: @Service, @Repository etc) -->
<context:component-scan base-package="com.XXXX"/>
<!-- JDBC Data Source. It is assumed you have MySQL running on localhost port 3306 with
username root and blank password. Change below if it's not the case -->
<bean id="dataSource" class="org.Apache.commons.dbcp.BasicDataSource" destroy-method="close">
<property name="driverClassName" value="com.mysql.jdbc.Driver"/>
<property name="url" value="jdbc:mysql://localhost:3306/XXXX"/>
<property name="username" value="XXXX"/>
<property name="password" value="XXXX"/>
<property name="validationQuery" value="SELECT 1"/>
</bean>
<!-- Hibernate Session Factory -->
<bean id="sessionFactory" class="org.springframework.orm.hibernate4.LocalSessionFactoryBean">
<property name="dataSource" ref="dataSource"/>
<property name="configLocation">
<value>classpath:hibernate.cfg.xml</value>
</property>
<property name="packagesToScan">
<array>
<value>com.XXXX</value>
</array>
</property>
<property name="hibernateProperties">
<value>
hibernate.dialect=org.hibernate.dialect.MySQLDialect
</value>
</property>
</bean>
<!-- Hibernate Transaction Manager -->
<bean id="transactionManager" class="org.springframework.orm.hibernate4.HibernateTransactionManager">
<property name="sessionFactory" ref="sessionFactory"/>
</bean>
<!-- Activates annotation based transaction management -->
<tx:annotation-driven transaction-manager="transactionManager"/>
Je fais probablement quelque chose de mal dans mes fichiers XML. Je suis nouveau pour ce printemps - le personnel d'Hibernate attend votre aide. Merci..
Ceci est l'exception se jeter
Stacktrace:] with root cause
Java.lang.IllegalStateException: Neither BindingResult nor plain target object for bean name 'category' available as request attribute
at org.springframework.web.servlet.support.BindStatus.<init>(BindStatus.Java:141)
at org.springframework.web.servlet.tags.form.AbstractDataBoundFormElementTag.getBindStatus(AbstractDataBoundFormElementTag.Java:168)
at org.springframework.web.servlet.tags.form.AbstractDataBoundFormElementTag.getPropertyPath(AbstractDataBoundFormElementTag.Java:188)
at org.springframework.web.servlet.tags.form.AbstractDataBoundFormElementTag.getName(AbstractDataBoundFormElementTag.Java:154)
at org.springframework.web.servlet.tags.form.AbstractDataBoundFormElementTag.autogenerateId(AbstractDataBoundFormElementTag.Java:141)
at org.springframework.web.servlet.tags.form.AbstractDataBoundFormElementTag.resolveId(AbstractDataBoundFormElementTag.Java:132)
at org.springframework.web.servlet.tags.form.AbstractDataBoundFormElementTag.writeDefaultAttributes(AbstractDataBoundFormElementTag.Java:116)
at org.springframework.web.servlet.tags.form.AbstractHtmlElementTag.writeDefaultAttributes(AbstractHtmlElementTag.Java:422)
at org.springframework.web.servlet.tags.form.InputTag.writeTagContent(InputTag.Java:142)
at org.springframework.web.servlet.tags.form.AbstractFormTag.doStartTagInternal(AbstractFormTag.Java:84)
at org.springframework.web.servlet.tags.RequestContextAwareTag.doStartTag(RequestContextAwareTag.Java:80)
at org.Apache.jsp.index_jsp._jspx_meth_form_005finput_005f0(index_jsp.Java:208)
at org.Apache.jsp.index_jsp._jspx_meth_form_005fform_005f0(index_jsp.Java:168)
at org.Apache.jsp.index_jsp._jspService(index_jsp.Java:100)
at org.Apache.jasper.runtime.HttpJspBase.service(HttpJspBase.Java:70)
at javax.servlet.http.HttpServlet.service(HttpServlet.Java:728)
at org.Apache.jasper.servlet.JspServletWrapper.service(JspServletWrapper.Java:432)
at org.Apache.jasper.servlet.JspServlet.serviceJspFile(JspServlet.Java:390)
at org.Apache.jasper.servlet.JspServlet.service(JspServlet.Java:334)
at javax.servlet.http.HttpServlet.service(HttpServlet.Java:728)
at org.Apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.Java:305)
at org.Apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.Java:210)
at org.springframework.orm.hibernate4.support.OpenSessionInViewFilter.doFilterInternal(OpenSessionInViewFilter.Java:149)
at org.springframework.web.filter.OncePerRequestFilter.doFilter(OncePerRequestFilter.Java:108)
at org.Apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.Java:243)
at org.Apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.Java:210)
at org.Apache.catalina.core.StandardWrapperValve.invoke(StandardWrapperValve.Java:222)
at org.Apache.catalina.core.StandardContextValve.invoke(StandardContextValve.Java:123)
at org.Apache.catalina.authenticator.AuthenticatorBase.invoke(AuthenticatorBase.Java:502)
at org.Apache.catalina.core.StandardHostValve.invoke(StandardHostValve.Java:171)
at org.Apache.catalina.valves.ErrorReportValve.invoke(ErrorReportValve.Java:99)
at org.Apache.catalina.valves.AccessLogValve.invoke(AccessLogValve.Java:953)
at org.Apache.catalina.core.StandardEngineValve.invoke(StandardEngineValve.Java:118)
at org.Apache.catalina.connector.CoyoteAdapter.service(CoyoteAdapter.Java:408)
at org.Apache.coyote.http11.AbstractHttp11Processor.process(AbstractHttp11Processor.Java:1023)
at org.Apache.coyote.AbstractProtocol$AbstractConnectionHandler.process(AbstractProtocol.Java:589)
at org.Apache.Tomcat.util.net.JIoEndpoint$SocketProcessor.run(JIoEndpoint.Java:310)
at Java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.Java:1145)
at Java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.Java:615)
at Java.lang.Thread.run(Thread.Java:722)
Si vous atteignez index.jsp
par quelque chose comme http://localhost:8080/yourapp
, je suppose que vous avez un <welcome-file>
pour cela.
Cela signifie que index.jsp
génère le code HTML sans aucun traitement préalable par Spring. Vous essayez de rendre ceci
<form:form method="POST" commandName="category" modelAttribute="category" action="search_category">
<form:input path="category_name" />
<input type="submit" value="Submit">
</form:form>
où <form:form>
provient de la bibliothèque de balises de Spring. Tout d'abord, notez que vous utilisez à la fois commandName
et modelAttribute
. C'est redondant. Utilisez l'un ou l'autre, pas les deux. Deuxièmement, lorsque vous spécifiez l'une de ces options, l'implémentation de la balise recherche un attribut HttpServletRequest
avec le nom spécifié. Dans votre cas, aucun attribut de ce type n'a été ajouté aux attributs HttpServletRequest
. En effet, le conteneur Servlet a été transféré directement à votre index.jsp
.
Au lieu de cela, créez une nouvelle méthode de gestionnaire @Controller
qui ajoutera un attribut au modèle et la transmettra à la vue index.jsp
.
@RequestMapping(value = "/", method = RequestMethod.GET)
public String welcomePage(Model model) {
model.addAttribute("category", new Category()); // the Category object is used as a template to generate the form
return "index";
}
Vous pouvez vous en débarrasser
<!-- Set the default page as index.jsp -->
<mvc:view-controller path="/" view-name="index"/>
Déplacez également toute configuration mvc
de votre fichier applicationContext.xml
vers votre fichier servlet-context.xml
. C'est là que ça appartient. Voici pourquoi.
Cette erreur se produit généralement lorsque vos identifiants de saisie de formulaire ne sont pas liés correctement, ce qui signifie que le nom/identifiant utilisé dans les balises de formulaire est différent du bean.
Cela fonctionne pour moi!
<form method="POST" action="employee.do">
<table>
<tr>
<td>Name</td>
<td><input type="text" name="name" /></td>
</tr>
<tr>
<td>Age</td>
<td><input type="text" name="age" /></td>
</tr>
<tr>
<td colspan="2">
<input type="submit" value="Add Employee"/>
</td>
</tr>
</table>
</form>
Manette
@RequestMapping(value = "/employee", method = RequestMethod.POST)
private ModelAndView addemployee(Employee emp, ModelAndView model,
@RequestParam String name,
@RequestParam String age) {
emp.setAge(age);
emp.setName(name);
employeeService.persistEmployee(emp);
return new ModelAndView("redirect:/employee.do");
}