2017-12-12 13 views
0

最初に "/WEB-INF/views/searchResult.jsp"というビューに転送してから、Calculator.lookUp(Type、Place)をバックグラウンドで処理します。JSP - 最初にビューに転送し、その後バックグラウンドで処理メソッドを続行する方法?

現在、Calculator.lookUp(Type、Place)が最初に処理され、このメソッドが終了すると、ユーザーは「/WEB-INF/views/searchResult.jsp」に転送されます。 助けてくれてありがとう!

@WebServlet(urlPatterns="/search.do") 
public class SrchServlet extends HttpServlet{ 

     protected void doPost(HttpServletRequest request, 
       HttpServletResponse response) 
      throws ServletException, IOException { 

      String Type = request.getParameter("Type"); 
      String Place = request.getParameter("Place"); 


      request.setAttribute("Type", Type); 
      request.setAttribute("Place", Place); 

      //I want the forward to searchResult.jsp to occur 
      request.getRequestDispatcher("/WEB-INF/views/searchResult.jsp").forward(
        request, response); 

      //and then in backend for the below method to run 
      Calculator.lookUp(Type, Place); 

      } 
} 
+1

非同期要求によって、目的の結果が得られます。 [同期と非同期を理解する](https://www.javatpoint.com/understanding-synchronous-vs-asynchronous)を参照してください。 –

+0

ありがとう、それは理にかなっていますが、私は上記の非同期要求コード。 – Padoga

答えて

1

非同期要求が気に入らない場合は、いくつかの注意点があります。まず、フォワードが決定的です。あなたは手を他のサーブレットに渡し、次の命令(もしあれば)は決して実行されません。シーケンスを進めたい場合は、には JSPが必要です。また、トリックでは、サーブレットでの処理を可能にしながら、応答をクライアントにすぐに送信させることができます。レスポンス出力ライターまたはストリームを閉じるだけです。

あなたのコードは、単純になる可能性:

 //I want the include searchResult.jsp 
     request.getRequestDispatcher("/WEB-INF/views/searchResult.jsp").include(
       request, response); 

     // cause the response to be sent to the client 
     try { 
      response.getOutputStream().close(); // if the OutputStream was used 
     } 
     catch(IllegalStateException e) { 
      response.getWriter().close();  // if the Writer was used 
     } 

     //and then in backend for the below method to run 
     Calculator.lookUp(Type, Place); 

     } 

私はTomcatがそれをサポートしていることを確認することができますで、これは明示的に、サーブレット仕様ごとに許可されたかどうかを見つけることができませんでした。

@Asinc ...

0

(ジャストポイントで変数名が小文字で始まる必要があります)、両方の変数が最終である必要があり、あなたのメソッドの非同期が、種類や場所を作るために、コードの下に使用してみてください:

Runnable task = new Runnable() { 
    @Override 
    public void run() { 
     try { 
     Calculator.lookUp(Type, Place);// here Place and Type both variable should be final 
     } catch (Exception ex) { 
     // handle error which cannot be thrown back 
     } 
    } 
    }; 
    new Thread(task, "ServiceThread").start(); 
0

私の知る限りでは、あなたの問題を解決するより良い方法は以下のとおりです。

  • あなたにメソッドを宣言することによって、非同期方式では、バックグラウンド・プロセスの一部として実行する必要がロジックを宣言し、

@Asynchronous/@Async

覚えておいてください、非同期メソッドは戻り値の型がvoidであることを意味するものを返しません。いくつかの値を返す必要がある場合は、Futureを返すことができます。 Asynchronousプロセスの詳細については、こちらをご覧ください。

関連する問題