前提・実現したいこと
Spring MVCで3つの入力フォーム(@ModelAttribute)を入れたページをつくっているのですが、
2つ目のフォームでボタンを押しても、該当するモデルに値が入らなかったり、
3つ目のフォームでsubmitすると、1つ目のフォームが反応してエラーが発生したりします。
paramsやnameを使って仕切っているのですが上手くいきません。どうすればよろしいのでしょうか?
発生している問題・エラーメッセージ
org.apache.jasper.JasperException: An exception occurred processing JSP page /WEB-INF/views/top.jsp at line 32 30: <form:form modelAttribute="loginModel" name="login"> 31: <table><tr> 32: <td>メールアドレス:<form:input name="login" path="mail" size="30" /></td> 33: <td class="error"><form:errors path="mail" />${mailError }</td> 34: </tr></table> Stacktrace: org.apache.jasper.servlet.JspServletWrapper.handleJspException(JspServletWrapper.java:574) 原因 java.lang.IllegalStateException: Neither BindingResult nor plain target object for bean name 'loginModel' available as request attribute org.springframework.web.servlet.support.BindStatus.<init>(BindStatus.java:144) org.springframework.web.servlet.tags.form.AbstractDataBoundFormElementTag.getBindStatus(AbstractDataBoundFormElementTag.java:168) org.springframework.web.servlet.tags.form.AbstractDataBoundFormElementTag.getPropertyPath(AbstractDataBoundFormElementTag.java:188) org.springframework.web.servlet.tags.form.AbstractDataBoundFormElementTag.getName(AbstractDataBoundFormElementTag.java:154) org.springframework.web.servlet.tags.form.AbstractDataBoundFormElementTag.autogenerateId(AbstractDataBoundFormElementTag.java:141) org.springframework.web.servlet.tags.form.AbstractDataBoundFormElementTag.resolveId(AbstractDataBoundFormElementTag.java:132) org.springframework.web.servlet.tags.form.AbstractDataBoundFormElementTag.writeDefaultAttributes(AbstractDataBoundFormElementTag.java:116) org.springframework.web.servlet.tags.form.AbstractHtmlElementTag.writeDefaultAttributes(AbstractHtmlElementTag.java:422) org.springframework.web.servlet.tags.form.InputTag.writeTagContent(InputTag.java:142) org.springframework.web.servlet.tags.form.AbstractFormTag.doStartTagInternal(AbstractFormTag.java:84) org.springframework.web.servlet.tags.RequestContextAwareTag.doStartTag(RequestContextAwareTag.java:80) org.apache.jsp.WEB_002dINF.views.top_jsp._jspx_meth_form_005finput_005f0(top_jsp.java:408) org.apache.jsp.WEB_002dINF.views.top_jsp._jspService(top_jsp.java:196) org.apache.jasper.runtime.HttpJspBase.service(HttpJspBase.java:70) javax.servlet.http.HttpServlet.service(HttpServlet.java:729) org.apache.jasper.servlet.JspServletWrapper.service(JspServletWrapper.java:438) org.apache.jasper.servlet.JspServlet.serviceJspFile(JspServlet.java:396) org.apache.jasper.servlet.JspServlet.service(JspServlet.java:340) javax.servlet.http.HttpServlet.service(HttpServlet.java:729) org.apache.tomcat.websocket.server.WsFilter.doFilter(WsFilter.java:52) org.springframework.web.servlet.view.InternalResourceView.renderMergedOutputModel(InternalResourceView.java:209) org.springframework.web.servlet.view.AbstractView.render(AbstractView.java:267) org.springframework.web.servlet.DispatcherServlet.render(DispatcherServlet.java:1217) org.springframework.web.servlet.DispatcherServlet.processDispatchResult(DispatcherServlet.java:1005) org.springframework.web.servlet.DispatcherServlet.doDispatch(DispatcherServlet.java:952) org.springframework.web.servlet.DispatcherServlet.doService(DispatcherServlet.java:870) org.springframework.web.servlet.FrameworkServlet.processRequest(FrameworkServlet.java:961) org.springframework.web.servlet.FrameworkServlet.doPost(FrameworkServlet.java:863) javax.servlet.http.HttpServlet.service(HttpServlet.java:648) org.springframework.web.servlet.FrameworkServlet.service(FrameworkServlet.java:837) javax.servlet.http.HttpServlet.service(HttpServlet.java:729) org.apache.tomcat.websocket.server.WsFilter.doFilter(WsFilter.java:52) org.springframework.web.filter.CharacterEncodingFilter.doFilterInternal(CharacterEncodingFilter.java:88) org.springframework.web.filter.OncePerRequestFilter.doFilter(OncePerRequestFilter.java:108)
該当のソースコード
JSP
1 <form:form modelAttribute="loginModel" name="login"> 2 <table><tr> 3 <td>メールアドレス:<form:input name="login" path="mail" size="30" /></td> 4 <td class="error"><form:errors path="mail" />${mailError }</td> 5 </tr></table> 6 <table><tr> 7 <td>パスワード:<form:password name="login" path="password" size="20" /></td> 8 <td class="error"><form:errors path="password" />${passwordError }</td> 9 </tr></table> 10 <p> 11 <input type="submit" name="login" value="ログイン" /> 12 </p> 13 <p class="error">${loginError }</p> 14 </form:form> 15 <hr /> 16 <form:form modelAttribute="newsModel" name="news" > 17 <table><tr><td> 18 <form:button name="news" path="media" value="All">全種類</form:button> 19 <form:button name="news" path="media" value="DVD">DVD</form:button> 20 <form:button name="news" path="media" value="Blu-ray">ブルーレイ</form:button> 21 <form:button name="news" path="media" value="CD">CD</form:button> 22 <form:button name="news" path="media" value="Book">本</form:button> 23 </td></tr></table> 24 </form:form> 25 <hr /> 26 <form:form modelAttribute="selectTitleModel" name="selectTitle"> 27 <table> 28 <tr><th colspan="3">タイトル検索</th></tr> 29 <tr> 30 <td><form:input name="selectTitle" path="title_name" size="50" placeholder="キーワードを1つ入力して下さい。" /></td> 31 <td> 32 <form:select name="selectTitle" path="media"> 33 <option value="All" selected="selected">全種類</option> 34 <option value="DVD">DVD</option> 35 <option value="Blu-ray">ブルーレイ</option> 36 <option value="CD">CD</option> 37 <option value="Book">本</option> 38 </form:select> 39 </td> 40 <td><input type="submit" name="selectTitle" value="検索" /></td> 41 </tr> 42 <tr><td><form:errors path="title_name" cssClass="error" /></td></tr> 43 </table> 44 </form:form>
Servlet
1@Controller 2@RequestMapping("top") 3@SessionAttributes("memberModel") 4@SuppressWarnings("unchecked") 5public class TopController { 6 private static ApplicationContext context = new ClassPathXmlApplicationContext("spring.xml"); 7 private static MemberDAO<Member> memberDAO = (MemberDAO<Member>)context.getBean("memberDAO"); 8 private static TitleDAO<Title> titleDAO = (TitleDAO<Title>)context.getBean("titleDAO"); 9 10 @ModelAttribute("memberModel") 11 public MemberModel setUpMemberModel() { 12 return new MemberModel(); 13 } 14 15 @RequestMapping(method=RequestMethod.GET) 16 public String toTop(Model model) { 17 LoginModel loginModel = new LoginModel(); 18 model.addAttribute("loginModel", loginModel); 19 20 NewsModel newsModel = new NewsModel(); 21 model.addAttribute("newsModel", newsModel); 22 String media = "All"; 23 List<Title> newRelease = titleDAO.newRelease(media); 24 model.addAttribute("newRelease", newRelease); 25 List<Title> newRegist = titleDAO.newRegist(media); 26 model.addAttribute("newRegist", newRegist); 27 28 SelectTitleModel selectTitleModel = new SelectTitleModel(); 29 model.addAttribute("selectTitleModel", selectTitleModel); 30 return "top"; 31 } 32 33 @RequestMapping(method=RequestMethod.POST, params="login") 34 public String login(@Validated(GroupOrder.class) @ModelAttribute("loginModel") LoginModel loginModel, BindingResult result, Model model) { 35 if (result.hasErrors()) { 36 model.addAttribute("loginModel", loginModel); 37 return "top"; 38 } else { 39 String password = memberDAO.checkPassword(loginModel.getMail()); 40 if (password.isEmpty()) { 41 model.addAttribute("mailError", "会員情報は登録されておりません。"); 42 return "top"; 43 } else { 44 Date out_date = memberDAO.checkOut_date(loginModel.getMail()); 45 if (out_date != null) { 46 model.addAttribute("loginError", "退会されておりますので、ログインできません。"); 47 return "top"; 48 } else if (!loginModel.getPassword().equals(password)) { 49 model.addAttribute("passwordError", "パスワードが違います。"); 50 return "top"; 51 } else { 52 Member member = memberDAO.getData(loginModel.getMail(), loginModel.getPassword()); 53 MemberModel memberModel = new MemberModel(); 54 BeanUtils.copyProperties(member, memberModel); 55 model.addAttribute("memberModel", memberModel); 56 return "redirect:/mypage"; 57 } 58 } 59 } 60 } 61 62 @RequestMapping(method=RequestMethod.POST, params="news") 63 public String news(@ModelAttribute("newsModel") NewsModel newsModel, Model model) { 64 String media = newsModel.getMedia(); 65 List<Title> newRelease = titleDAO.newRelease(media); 66 model.addAttribute("newRelease", newRelease); 67 List<Title> newRegist = titleDAO.newRegist(media); 68 model.addAttribute("newRegist", newRegist); 69 return "top"; 70 } 71 72 @RequestMapping(method=RequestMethod.POST, params="selectTitle") 73 public String selectTitle(@Validated(GroupOrder.class) @ModelAttribute("selectTitleModel") SelectTitleModel selectTitleModel, BindingResult result, Model model) { 74 if (result.hasErrors()) { 75 model.addAttribute("selectTitleModel", selectTitleModel); 76 } else { 77 String title_name = selectTitleModel.getTitle_name(); 78 String media = selectTitleModel.getMedia(); 79 List<Title> selectTitle = titleDAO.selectTitle(title_name, media); 80 model.addAttribute("selectTitle", selectTitle); 81 } 82 return "top"; 83 } 84 85}
試したこと
・paramsとnameでフォームを切ってみました。
・フォーム別でコメントアウトして実行しても直りませんでした。
補足情報(FW/ツールのバージョンなど)
Eclipse:Oxygen.3a Release (4.7.3a)
java-version:1.6
org.springframework-version:4.0.3.RELEASE
org.aspectj-version:1.6.10
org.slf4j-version:1.6.6
hibernate.version:4.3.6.Final
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。