質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.35%
JSP

JSP(Java Server Pages)とは、ウェブアプリケーションの表示レイヤーに使われるサーバーサイドの技術のことです。

Spring

Spring Framework は、Javaプラットフォーム向けのオープンソースアプリケーションフレームワークです。 Java Platform上に、 Web ベースのアプリケーションを設計するための拡張機能が数多く用意されています。

servlet

Servletとは、Webページの動的な生成やデータ処理などをサーバ上で実行するために、Javaで作成されたプログラムです。 ショッピングサイトやオンラインバンキングといった、動的なウェブサイトの構築に用いられています。

Q&A

1回答

10329閲覧

1つのページに複数のフォームを置くには?

Y.Yoshida

総合スコア4

JSP

JSP(Java Server Pages)とは、ウェブアプリケーションの表示レイヤーに使われるサーバーサイドの技術のことです。

Spring

Spring Framework は、Javaプラットフォーム向けのオープンソースアプリケーションフレームワークです。 Java Platform上に、 Web ベースのアプリケーションを設計するための拡張機能が数多く用意されています。

servlet

Servletとは、Webページの動的な生成やデータ処理などをサーバ上で実行するために、Javaで作成されたプログラムです。 ショッピングサイトやオンラインバンキングといった、動的なウェブサイトの構築に用いられています。

0グッド

0クリップ

投稿2020/02/11 02:32

前提・実現したいこと

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

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

guest

回答1

0

フォームを分けるのは解決しました。

@RequestMapping(method=RequestMethod.GET) public String toTop(Model model) { LoginModel loginModel = new LoginModel(); model.addAttribute("loginModel", loginModel); NewsModel newsModel = new NewsModel(); model.addAttribute("newsModel", newsModel); String media = "All"; List<Title> newRelease = titleDAO.newRelease(media); model.addAttribute("newRelease", newRelease); List<Title> newRegist = titleDAO.newRegist(media); model.addAttribute("newRegist", newRegist); SelectTitleModel selectTitleModel = new SelectTitleModel(); model.addAttribute("selectTitleModel", selectTitleModel); return "top"; }

と1つのGETメソッドの中で3つのフォームModelをセットしていたのを、

@ModelAttribute("memberModel") public MemberModel setUpMemberModel() { return new MemberModel(); } @ModelAttribute("loginModel") public LoginModel setUpLoginModel() { return new LoginModel(); } @ModelAttribute("newsModel") public NewsModel setUpNewsModel() { return new NewsModel(); } @ModelAttribute("selectTitleModel") public SelectTitleModel setUpSelectTitleModel() { return new SelectTitleModel(); } @RequestMapping(method=RequestMethod.GET) public String toTop(Model model) { String media = "All"; List<Title> newRelease = titleDAO.newRelease(media); model.addAttribute("newRelease", newRelease); List<Title> newRegist = titleDAO.newRegist(media); model.addAttribute("newRegist", newRegist); return "top"; }

とGETメソッドの外で別々にセットしたら、フォームが絡まなくなりました。

しかし、2つ目のフォームのボタンを押しても値が入らないので、
(newsModelのgetMedia()がNullのまま)
(form:button) を (input type="submit") と (form:hidden) に変えてみます。

投稿2020/02/11 07:28

Y.Yoshida

総合スコア4

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

まだベストアンサーが選ばれていません

会員登録して回答してみよう

アカウントをお持ちの方は

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.35%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問