2017-12-12 3 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

비동기 요청이 마음에 들지 않는다면 몇 가지 언급이 있습니다. 첫째, 포워드가 결정적입니다. 다른 서블릿에 손을 넣으면 다음 명령 (있는 경우)이 실행되지 않습니다. 순서대로 진행하려면 을 포함시켜야합니다. 트릭을 사용하면 서블릿에서 처리를 허용하면서 응답을 클라이언트에 즉시 보내도록 할 수 있습니다. 응답 출력 작성자 또는 스트림을 닫는 것만으로 끝납니다.

코드는 간단하게 될 수 :

 //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

기억, 비동기 메소드는 반환 유형이 무효라는 것을 반환하지 않습니다. 일부 값을 반환해야하는 경우 Future를 반환 할 수 있습니다. Asynchronous 절차에 대해 자세히 알아보십시오.

관련 문제