2016-07-25 15 views
0

に各フォームIは、JSPビューを有し、2は内部に、私は2つのコントローラ有する(1 - UserControllerで、2 - ホームコントローラ)スプリングJSPビュー - 切り抜いコントローラ

UserControllerでの - すべてのログインとregestrationに管理しますサイト ホームコントローラーは - 私は一つコントローラで動作するようにしようとしたとき、それはgreateの動作しますが、私はコントローラ(にHomeControllerを)spesificする方法を分割するとき、私はエラー を持つすべてのユーザーアクション

  • を管理します

    なぜですか? *家がUserControllerでにHomeController

    に送信するために必要なアクション内部から呼び出されたアップデート

    home.jspを - > "にHomeController" に署名する必要があるフォーム*それ2つの形式(1- "scanRequest"> UserControllerで、2- "scanForm">にHomeController)

    <form:form method="POST" action="${contextPath}/scanRequest" modelAttribute="scanForm" class="form-signin"> 
        <h2 class="form-signin-heading">Create new scan: </h2> 
        <table> 
         <tr> 
          <td> 
           <spring:bind path="seller_name"> 
            <div class="form-group ${status.error ? 'has-error' : ''}"> 
             <form:input type="text" path="seller_name" class="form-control" placeholder="Seller Name" autofocus="true"></form:input> 
             <form:errors path="seller_name"></form:errors> 
            </div> 
           </spring:bind> 
          </td> 
          <td> 
           <input type="hidden" name="scanForm" value="${UserRequestDTO}" /> 
           <button class="btn btn-lg btn-primary btn-block" type="submit">Scan</button> 
          </td> 
         </tr> 
        </table> 
    </form:form> 
    
    <form:form method="POST" action="${contextPath}/scanTest" modelAttribute="scanTestForm" class="form-signin"> 
        <h3>${msg}</h3> 
        <input type="hidden" name="scanTestForm" value="${UserRequestDTO}" /> 
        <button class="btn btn-lg btn-primary btn-block" type="submit">Test</button> 
    </form:form> 
    

    HomeControllを含みますER:

    @Controller 
    public class HomeController { 
    
        @ModelAttribute("scanTestForm") 
        public UserRequestDTO getScanForm(){ 
         return new UserRequestDTO(); 
        } 
    
        @RequestMapping(value = "/scanTest", method = RequestMethod.POST) 
        public String scanRequest(@ModelAttribute("scanTestForm")UserRequestDTO userRequestDTO, BindingResult bindingResult, Model model) { 
         String strMsg = "-----------scanTest---------- \r\n"; 
    
         if (bindingResult.hasErrors()) { 
    
          return "home"; 
         } 
    
    
         model.addAttribute("msg", strMsg); 
    
         return "home"; 
        } 
    } 
    

    UserControllerで

    @ModelAttribute("scanForm") 
        public UserRequestDTO getScanForm(){ 
         return new UserRequestDTO(); 
        } 
    
    
        @RequestMapping(value = "/scanRequest", method = RequestMethod.POST) 
        public String scanRequest(@ModelAttribute("scanForm")UserRequestDTO userRequestDTO, BindingResult bindingResult, Model model) { 
         logger.info("scanRequest():"); 
    
         String strMsg = "---------------------- \r\n" + userRequestDTO.getSeller_name() + "\r\n"; 
    
         // Checking if there is any errors with the seller 
         if (bindingResult.hasErrors()) { 
    
          return "home"; 
         } 
    
         model.addAttribute("msg", strMsg); 
    
         return "home"; 
        } 
    

    **それが動作するようにし、その後、私は私のコードを続けることができますだけで何I .. **更新:エラー - 私はcliced」テスト "ボタン**

    at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:617) 
        at org.apache.tomcat.util.threads.TaskThread$WrappingRunnable.run(TaskThread.java:61) 
        at java.lang.Thread.run(Thread.java:745) 
    
    יול 26, 2016 2:34:44 PM org.apache.catalina.core.StandardWrapperValve invoke 
    SEVERE: Servlet.service() for servlet [searcher] in context with path [/Searcher] threw exception [An exception occurred processing JSP page /WEB-INF/views/home.jsp at line 47 
    
    44:    <table> 
    45:     <tr> 
    46:      <td> 
    47:       <spring:bind path="seller_name"> 
    48:        <div class="form-group ${status.error ? 'has-error' : ''}"> 
    49:         <form:input type="text" path="seller_name" class="form-control" placeholder="Seller Name" autofocus="true"></form:input> 
    50:         <form:errors path="seller_name"></form:errors> 
    
    
    Stacktrace:] with root cause 
    javax.servlet.jsp.JspTagException: Neither BindingResult nor plain target object for bean name 'scanForm' available as request attribute 
        at org.springframework.web.servlet.tags.BindTag.doStartTagInternal(BindTag.java:120) 
        at org.springframework.web.servlet.tags.RequestContextAwareTag.doStartTag(RequestContextAw 
    
+0

*動作しない*または*エラーが発生し始める*は無力です。可能であれば、どのようなエラーを正確に述べ、スタックトレースを与えます。 –

+0

@SergeBallesta今すぐ追加しました – Guyb

+0

UserControllerの外観はどうですか?私は1つのフォームしか見ません。別のフォームはどこですか? – Tin

答えて

1

さらに詳しく説明すると、何が起こったのかが分かり易い - たとえまだ暗い面がある場合でもどのように最初にhome.jspを表示したように。しかし、ここで私たちは、次のとおりです。

  • あなたが
  • ブラウザは、コントローラはモデルANで見つけたHomeController.scanRequest
  • によって処理/scanTestにPOSTリクエストを送信しTestボタンをクリックしhome.jsp(どうやって?)
  • を表示するために管理しました属性scanTestFormがPOSTされたパラメータから構築され、msg属性を追加し、それをと仮定してに転送します。
  • tomcatはhome.jspを起動して、要求属性としてscanTestFormmsgを含む応答を作成しますが、コントローラーがモデルに追加していないため、scanFormはありません。
  • <form:form ... modelAttribute="scanForm" ...>は、要求の中scanForm属性を探しどれも見つからないとエラー

を提起する修正方法:

  • 間に合わせ:ちょうどコントローラでmodel.addAttribute("scanForm", userRequestDTO);を追加します。これはJSPで検出され、このエラーを過ぎるのに十分でなければなりません
  • より正確に:ポストの後のビューに転送するのではなく、最初にhome.jspを表示したコントローラーにリダイレクトします。これはpost-redirect-getパターンです。あなたもredirectAttributes

を使用して、モデルが他のコントローラに直接属性を渡すことができますしかし、あなたは2つの異なるモデルを使用して、彼らは応答構築時に同じ値を使用する必要がある場合は、同じページに属性名をなぜとにかく、私は理解することはできません。 modelAttribute名はその時点でのみ使用されるため、JSPがレスポンスをビルドするときで、ブラウザがPOSTリクエストを返すときではありません。

+0

このような完全な回答ありがとうございました。そうですね。私は、異なるコントローラに2つのアクションを同じビューで追加しようとしました。最初の提案は私の問題を解決したと思います。私が理解していないのは、Postメソッドの "redirectAttribute"です – Guyb

関連する問題