Help me please, with Spring tag
This is my first experience with Spring. When I was reading the “Spring Live” all worked Ok. :) Equinox works well too. But in my project I have strange problem with binding. And I don’t see the difference between book example and my project.
There is filePersonList.jsp with one and very easy form which contains one input tag only:
Code:
<form method="post" action="<c:url value="/filePersonList.html"/>" name="searchParametersForm">
<table class="search-panel-form" width="100%" cellpadding="0" cellspacing="0">
<tr>
<th>Text:</th>
<td>
<spring:bind path="searchParameters.field">
<input type="text" name="field" id="field" value="${status.value}"/>
<span class="fieldError">${status.errorMessage}</span>
</spring:bind>
</td>
</tr>
<tr>
<td class="search-panel-button-cell">
<input name="start" class="panel-button" type="submit" value="Start">
</td>
<td class="search-panel-button-cell">
<input name="clear" class="panel-button" type="submit" value="Clear">
</td>
</tr>
</table>
</form>
I use the “searchParameters” as command object for the form. The class SearchParameters has all needed fields:
Code:
public class SearchParameters extends BaseObject
{
private String field;
public String getField()
{
return field;
}
public void setField( String field )
{
this.field = field;
}
}
There is information about it in the action-servlet.xml
Code:
<bean id="filePersonListController"class="com.company.web.FilePersonListController">
<property name="commandName"><value>searchParameters</value></property>
<property name="commandClass"><value> com.company.web.SearchParameters</value></property>
<property name="formView"><value>filePersonList</value></property>
<property name="successView"><value>redirect:filePersonList.html</value></property>
</bean>
And sure, I have the class FilePersonListController with implemented formBackingObject method
Code:
public class FilePersonListController extends SimpleFormController
{
private static Log log = LogFactory.getLog( FilePersonListController.class );
public ModelAndView onSubmit{...};
protected Object formBackingObject( HttpServletRequest request ) throws ServletException
{
log.debug( "CALL - new SearchParameters()" );
return new SearchParameters();
}
}
I can see my form well while I don’t use the spring:bind. Something like that:
Code:
<input type="text" name="field" id="field" value="111"/>
When I add the binding I have exception:
The exception is:
Code:
javax.servlet.jsp.JspTagException: Neither Errors instance nor plain target object for bean name 'searchParameters' available as request attribute at org.springframework.web.servlet.tags.BindTag.doStartTagInternal(BindTag.java:108)
at org.springframework.web.servlet.tags.RequestContextAwareTag.doStartTag(RequestContextAwareTag.java:71)
at org.apache.jsp.filePersonList_jsp._jspService(org.apache.jsp.filePersonList_jsp:101)
at org.apache.jasper.runtime.HttpJspBase.service(HttpJspBase.java:97)
at javax.servlet.http.HttpServlet.service(HttpServlet.java:802)
at org.apache.jasper.servlet.JspServletWrapper.service(JspServletWrapper.java:322)
at org.apache.jasper.servlet.JspServlet.serviceJspFile(JspServlet.java:291)
at org.apache.jasper.servlet.JspServlet.service(JspServlet.java:241)
at javax.servlet.http.HttpServlet.service(HttpServlet.java:802)
at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:252)
at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:173)
at com.opensymphony.module.sitemesh.filter.PageFilter.doFilter(PageFilter.java:39)
at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:202)
at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:173)
at com.company.web.MessageFilter.doFilter(MessageFilter.java:36)
at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:202)
at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:173)
at org.apache.catalina.core.ApplicationDispatcher.invoke(ApplicationDispatcher.java:672)
at org.apache.catalina.core.ApplicationDispatcher.processRequest(ApplicationDispatcher.java:463)
at org.apache.catalina.core.ApplicationDispatcher.doForward(ApplicationDispatcher.java:398)
at org.apache.catalina.core.ApplicationDispatcher.forward(ApplicationDispatcher.java:301)
at org.springframework.web.servlet.view.InternalResourceView.renderMergedOutputModel(InternalResourceView.java:97)
at org.springframework.web.servlet.view.AbstractView.render(AbstractView.java:247)
at org.springframework.web.servlet.DispatcherServlet.render(DispatcherServlet.java:839)
at org.springframework.web.servlet.DispatcherServlet.doDispatch(DispatcherServlet.java:616)
at org.springframework.web.servlet.DispatcherServlet.doService(DispatcherServlet.java:543)
at org.springframework.web.servlet.FrameworkServlet.serviceWrapper(FrameworkServlet.java:390)
at org.springframework.web.servlet.FrameworkServlet.doPost(FrameworkServlet.java:350)
at javax.servlet.http.HttpServlet.service(HttpServlet.java:709)
at javax.servlet.http.HttpServlet.service(HttpServlet.java:802)
at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:252)
at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:173)
at org.displaytag.filter.ResponseOverrideFilter.doFilter(ResponseOverrideFilter.java:125)
at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:202)
at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:173)
at com.opensymphony.module.sitemesh.filter.PageFilter.parsePage(PageFilter.java:118)
at com.opensymphony.module.sitemesh.filter.PageFilter.doFilter(PageFilter.java:52)
at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:202)
at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:173)
at com.company.web.MessageFilter.doFilter(MessageFilter.java:36)
at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:202)
at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:173)
at org.apache.catalina.core.StandardWrapperValve.invoke(StandardWrapperValve.java:213)
at org.apache.catalina.core.StandardContextValve.invoke(StandardContextValve.java:178)
at org.apache.catalina.core.StandardHostValve.invoke(StandardHostValve.java:126)
at org.apache.catalina.valves.ErrorReportValve.invoke(ErrorReportValve.java:105)
at org.apache.catalina.core.StandardEngineValve.invoke(StandardEngineValve.java:107)
at org.apache.catalina.connector.CoyoteAdapter.service(CoyoteAdapter.java:148)
at org.apache.coyote.http11.Http11Processor.process(Http11Processor.java:856)
at org.apache.coyote.http11.Http11Protocol$Http11ConnectionHandler.processConnection(Http11Protocol.java:744)
at org.apache.tomcat.util.net.PoolTcpEndpoint.processSocket(PoolTcpEndpoint.java:527)
at org.apache.tomcat.util.net.LeaderFollowerWorkerThread.runIt(LeaderFollowerWorkerThread.java:80)
at org.apache.tomcat.util.threads.ThreadPool$ControlRunnable.run(ThreadPool.java:684)
at java.lang.Thread.run(Thread.java:595)
Could you help me? What I did wrong? I use JDK 1.5, Spring 1.1.4, Tomcat 5.5.9
Thanks in advance.
Try adding setCommandName("searchParameters"); to your FilePersonListController constructor.
Thank you, katentim, for your answer.
I found out where was a problem. The problem was with relation between jsp and controller. According to my scenario I need to go from formOne to formTwo (after submission). In my method onSubmit for formOne’s controller I used:
Code:
return new ModelAndView( getSuccessView(), model );
According to examples I should use (to avoid doubling submit):
Code:
return new ModelAndView( new RedirectView( getSuccessView() ), model );
When I tune my urlMapping it starts to work. Unfortunately, with RedirectView I can’t use 'model' in my next step JSP directly. I have to pass arguments by using request parameter and it is not so good for some object. It looks like I should use method formTwo-formBackingObject to process some operations and use command object to prepare JSP. May be there are other ways?
The “return new ModelAndView( getSuccessView(), model );” works fine if I go to the same form only. I feel, I don’t understand Spring’s mechanic well yet.