如何将jquery datepicker函数与底层java spring表单java.util.Date字段绑定?

我整天都在尝试将jQuery datepicker函数绑定到java.util.Date类型的底层java spring form日期字段的两个字段,但是我收到了一个错误。 我发布了所有文件和错误消息。

form.jspx(jquery从tile默认模板加载):

            $(function(){ $('#arrivalDate').datepicker({ dateFormat: 'yy-mm-dd', changeYear: true }); $('#departureDate').datepicker({ dateFormat: 'yy-mm-dd', changeYear: true }); });  

Enter search for hotel!

${message}
${cityLabel} ${selectCityLabel}
New York
Los Angeles
Chicago
Houston
Phoenix
${arrivalDateLabel}
${departureDateLabel}
${numberOfAdultsLabel}

FormData.java:

 package domain; import org.springframework.format.annotation.DateTimeFormat; import java.util.Date; public class FormData { private String stateCode; private String city; @DateTimeFormat(pattern = "yy-mm-dd") private Date arrivalDate; @DateTimeFormat(pattern = "yy-mm-dd") private Date departureDate; private Integer numberOfAdults; //getters and setters public String getCity() { return city; } public void setCity(String city) { this.city = city; } public Date getArrivalDate() { return arrivalDate; } public void setArrivalDate(Date arrivalDate) { this.arrivalDate = arrivalDate; } public Date getDepartureDate() { return departureDate; } public void setDepartureDate(Date departureDate) { this.departureDate = departureDate; } public Integer getNumberOfAdults() { return numberOfAdults; } public void setNumberOfAdults(Integer numberOfAdults) { this.numberOfAdults = numberOfAdults; } //other methods public String toString() { if (city.equals("New York")) stateCode = "NY"; else if(city.equals("Los Angeles")) stateCode = "CA"; else if(city.equals("Chicago")) stateCode = "IL"; else if(city.equals("Houston")) stateCode = "TX"; else if(city.equals("Phoenix")) stateCode = "AZ"; return "http://api.ean.com/ean" + "-" + "services/rs/hotel/v3/list?cid=55505&apiKey=97zvrux6eahgv64r3aarb7n2&locale=en_US&currencyCode=USD" + "&city=" + city + "&stateProvinceCode=" + stateCode + "&countryCode=US&supplierCacheTolerance=MED" + "&arrivalDate=" + arrivalDate.toString() + "&departureDate=" + departureDate.toString() + "&room1=" + numberOfAdults + "&numberOfResults=1"; } } 

SearchController.java:

 package web.search.controller; import domain.FormData; import org.slf4j.Logger; import org.slf4j.LoggerFactory; import org.springframework.stereotype.Controller; import org.springframework.ui.Model; import org.springframework.web.bind.annotation.ModelAttribute; import org.springframework.web.bind.annotation.RequestMapping; import org.springframework.web.bind.annotation.RequestMethod; import web.blogapp.controller.EntryController; @RequestMapping("/search") @Controller public class SearchController { final Logger logger = LoggerFactory.getLogger(EntryController.class); @RequestMapping(method = RequestMethod.GET) public String loadFormPage(Model uiModel) { logger.info("Listing blog entries"); uiModel.addAttribute("formdata", new FormData()); return "search/form"; } @RequestMapping(method = RequestMethod.POST) public String submitForm(@ModelAttribute FormData formdata, Model uiModel) { uiModel.addAttribute("message", "Successfully saved data: " + formdata.toString()); return "search/form"; } } 

按下提交后我得到的错误如下:

 java.lang.IllegalStateException: Neither BindingResult nor plain target object for bean name 'formdata' available as request attribute org.springframework.web.servlet.support.BindStatus.(BindStatus.java:141) org.springframework.web.servlet.tags.form.AbstractDataBoundFormElementTag.getBindStatus(AbstractDataBoundFormElementTag.java:179) org.springframework.web.servlet.tags.form.AbstractDataBoundFormElementTag.getPropertyPath(AbstractDataBoundFormElementTag.java:199) org.springframework.web.servlet.tags.form.AbstractDataBoundFormElementTag.getName(AbstractDataBoundFormElementTag.java:165) org.springframework.web.servlet.tags.form.AbstractDataBoundFormElementTag.writeDefaultAttributes(AbstractDataBoundFormElementTag.java:128) org.springframework.web.servlet.tags.form.AbstractHtmlElementTag.writeDefaultAttributes(AbstractHtmlElementTag.java:421) org.springframework.web.servlet.tags.form.SelectTag.writeTagContent(SelectTag.java:200) org.springframework.web.servlet.tags.form.AbstractFormTag.doStartTagInternal(AbstractFormTag.java:103) org.springframework.web.servlet.tags.RequestContextAwareTag.doStartTag(RequestContextAwareTag.java:80) org.apache.jsp.WEB_002dINF.views.search.form_jspx._jspService(form_jspx.java:145) org.apache.jasper.runtime.HttpJspBase.service(HttpJspBase.java:70) javax.servlet.http.HttpServlet.service(HttpServlet.java:728) org.apache.jasper.servlet.JspServletWrapper.service(JspServletWrapper.java:432) org.apache.jasper.servlet.JspServlet.serviceJspFile(JspServlet.java:390) org.apache.jasper.servlet.JspServlet.service(JspServlet.java:334) javax.servlet.http.HttpServlet.service(HttpServlet.java:728) org.apache.jasper.runtime.JspRuntimeLibrary.include(JspRuntimeLibrary.java:954) org.apache.jasper.runtime.PageContextImpl.doInclude(PageContextImpl.java:684) org.apache.jasper.runtime.PageContextImpl.include(PageContextImpl.java:678) org.apache.tiles.request.jsp.JspRequest.doInclude(JspRequest.java:123) org.apache.tiles.request.AbstractViewRequest.dispatch(AbstractViewRequest.java:47) org.apache.tiles.request.render.DispatchRenderer.render(DispatchRenderer.java:45) org.apache.tiles.request.render.ChainedDelegateRenderer.render(ChainedDelegateRenderer.java:68) org.apache.tiles.impl.BasicTilesContainer.render(BasicTilesContainer.java:259) org.apache.tiles.template.InsertAttributeModel.renderAttribute(InsertAttributeModel.java:188) org.apache.tiles.template.InsertAttributeModel.execute(InsertAttributeModel.java:132) org.apache.tiles.jsp.taglib.InsertAttributeTag.doTag(InsertAttributeTag.java:299) org.apache.jsp.WEB_002dINF.layouts.default_jspx._jspx_meth_tiles_005finsertAttribute_005f2(default_jspx.java:619) org.apache.jsp.WEB_002dINF.layouts.default_jspx._jspService(default_jspx.java:140) org.apache.jasper.runtime.HttpJspBase.service(HttpJspBase.java:70) javax.servlet.http.HttpServlet.service(HttpServlet.java:728) org.apache.jasper.servlet.JspServletWrapper.service(JspServletWrapper.java:432) org.apache.jasper.servlet.JspServlet.serviceJspFile(JspServlet.java:390) org.apache.jasper.servlet.JspServlet.service(JspServlet.java:334) javax.servlet.http.HttpServlet.service(HttpServlet.java:728) org.apache.tiles.request.servlet.ServletRequest.forward(ServletRequest.java:265) org.apache.tiles.request.servlet.ServletRequest.doForward(ServletRequest.java:228) org.apache.tiles.request.AbstractClientRequest.dispatch(AbstractClientRequest.java:57) org.apache.tiles.request.render.DispatchRenderer.render(DispatchRenderer.java:45) org.apache.tiles.impl.BasicTilesContainer.render(BasicTilesContainer.java:259) org.apache.tiles.impl.BasicTilesContainer.render(BasicTilesContainer.java:397) org.apache.tiles.impl.BasicTilesContainer.render(BasicTilesContainer.java:238) org.apache.tiles.impl.BasicTilesContainer.render(BasicTilesContainer.java:221) org.apache.tiles.renderer.DefinitionRenderer.render(DefinitionRenderer.java:59) org.springframework.web.servlet.view.tiles3.TilesView.renderMergedOutputModel(TilesView.java:145) org.springframework.web.servlet.view.AbstractView.render(AbstractView.java:263) org.springframework.web.servlet.DispatcherServlet.render(DispatcherServlet.java:1208) org.springframework.web.servlet.DispatcherServlet.processDispatchResult(DispatcherServlet.java:992) org.springframework.web.servlet.DispatcherServlet.doDispatch(DispatcherServlet.java:939) org.springframework.web.servlet.DispatcherServlet.doService(DispatcherServlet.java:856) org.springframework.web.servlet.FrameworkServlet.processRequest(FrameworkServlet.java:936) org.springframework.web.servlet.FrameworkServlet.doPost(FrameworkServlet.java:838) javax.servlet.http.HttpServlet.service(HttpServlet.java:647) org.springframework.web.servlet.FrameworkServlet.service(FrameworkServlet.java:812) javax.servlet.http.HttpServlet.service(HttpServlet.java:728) org.springframework.orm.jpa.support.OpenEntityManagerInViewFilter.doFilterInternal(OpenEntityManagerInViewFilter.java:180) org.springframework.web.filter.OncePerRequestFilter.doFilter(OncePerRequestFilter.java:107) org.springframework.web.filter.HiddenHttpMethodFilter.doFilterInternal(HiddenHttpMethodFilter.java:77) org.springframework.web.filter.OncePerRequestFilter.doFilter(OncePerRequestFilter.java:107) org.springframework.web.filter.CharacterEncodingFilter.doFilterInternal(CharacterEncodingFilter.java:88) org.springframework.web.filter.OncePerRequestFilter.doFilter(OncePerRequestFilter.java:107) org.springframework.security.web.FilterChainProxy$VirtualFilterChain.doFilter(FilterChainProxy.java:330) org.springframework.security.web.access.intercept.FilterSecurityInterceptor.invoke(FilterSecurityInterceptor.java:118) org.springframework.security.web.access.intercept.FilterSecurityInterceptor.doFilter(FilterSecurityInterceptor.java:84) org.springframework.security.web.FilterChainProxy$VirtualFilterChain.doFilter(FilterChainProxy.java:342) org.springframework.security.web.access.ExceptionTranslationFilter.doFilter(ExceptionTranslationFilter.java:113) org.springframework.security.web.FilterChainProxy$VirtualFilterChain.doFilter(FilterChainProxy.java:342) org.springframework.security.web.session.SessionManagementFilter.doFilter(SessionManagementFilter.java:103) org.springframework.security.web.FilterChainProxy$VirtualFilterChain.doFilter(FilterChainProxy.java:342) org.springframework.security.web.authentication.AnonymousAuthenticationFilter.doFilter(AnonymousAuthenticationFilter.java:113) org.springframework.security.web.FilterChainProxy$VirtualFilterChain.doFilter(FilterChainProxy.java:342) org.springframework.security.web.servletapi.SecurityContextHolderAwareRequestFilter.doFilter(SecurityContextHolderAwareRequestFilter.java:54) org.springframework.security.web.FilterChainProxy$VirtualFilterChain.doFilter(FilterChainProxy.java:342) org.springframework.security.web.savedrequest.RequestCacheAwareFilter.doFilter(RequestCacheAwareFilter.java:45) org.springframework.security.web.FilterChainProxy$VirtualFilterChain.doFilter(FilterChainProxy.java:342) org.springframework.security.web.authentication.AbstractAuthenticationProcessingFilter.doFilter(AbstractAuthenticationProcessingFilter.java:183) org.springframework.security.web.FilterChainProxy$VirtualFilterChain.doFilter(FilterChainProxy.java:342) org.springframework.security.web.authentication.logout.LogoutFilter.doFilter(LogoutFilter.java:105) org.springframework.security.web.FilterChainProxy$VirtualFilterChain.doFilter(FilterChainProxy.java:342) org.springframework.security.web.context.SecurityContextPersistenceFilter.doFilter(SecurityContextPersistenceFilter.java:87) org.springframework.security.web.FilterChainProxy$VirtualFilterChain.doFilter(FilterChainProxy.java:342) org.springframework.security.web.FilterChainProxy.doFilterInternal(FilterChainProxy.java:192) org.springframework.security.web.FilterChainProxy.doFilter(FilterChainProxy.java:160) org.springframework.web.filter.DelegatingFilterProxy.invokeDelegate(DelegatingFilterProxy.java:346) org.springframework.web.filter.DelegatingFilterProxy.doFilter(DelegatingFilterProxy.java:259) 

调试应用程序并在submitForm方法内停止我有以下值
stateCode:TX
城市:休斯顿
arrivalDate:Mon 1月21日00:07:00 EET 2013
departureDate:1月30日星期三00:07:00 EET 2013
numberOfAdults:1