2011-03-09 40 views
4

我有一個servlet,看起來像這樣:如何停止servlet?

public void doPost(HttpServletRequest request, HttpServletResponse response) throws IOException{ 
    String param1 = request.getParameter("param1"); 
    String param2 = request.getParameter("param2"); 

    validateInput(param1, param2, request, response); 

    //if nothing's wrong with the input, do this and that 
} 


private void validateInput(String param1, String param2, HttpServletRequest request, HttpServletResponse response) throws IOException{ 
    boolean fail = false; 

    //validate input blah blah blah 

    if (fail){ 
     PrintWriter out = response.getWriter(); 
     out.write("invalid input"); 
     //end process or servlet 
    } 
} 

的想法是,我想通過param1param2運作validateInput()驗證輸入是否是有效的。如果輸入無效,請寫回一條消息,然後結束該過程。我的問題是如何結束這個過程?我知道return;doPost()會結束這個過程,但我試圖避免返回任何值從validateInput()doPost()只是爲了結束這個過程。我個人覺得這樣更具可讀性,而不是返回truefalsedoPost(),並且在那裏調用return;。有沒有辦法做到這一點?或者它根本不可能?

+0

氣味像家庭作業。 – Nishant 2011-03-09 10:32:30

+0

返回一個布爾值正是你應該做的。你應該回來!失敗,讓doPost處理寫作和終止。 – dtech 2011-03-09 10:34:17

+0

@dtech:如果無法在'validateInput()'中結束請求,那麼是的..這是唯一的方法。 – Davuth 2011-03-10 01:18:47

回答

4

控制總是返回到doPostvalidateInput運行,除非你(在這種情況下,無論是一個未經檢查的異常或IOException)拋出異常。

所以,如果你不從validateInput任何值返回doPost,即使你犯了迴應,doPost仍然會繼續做什麼它應該做的。 (當然,如果響應被提交,瀏覽器將完全不知道服務器端的任何進一步活動)。

您將需要返回值,拋出一個異常(這doPost可能趕上)設置全局值doPost檢查(這只是雜亂)。

+0

換句話說,你是否意味着沒有辦法停止這個單一的請求而不拋出異常(這在這裏不是可取的)或從'validateInput()'返回任何值?我真的不想爲了結束請求而返回任何價值,我想把它弄乾淨。:( – Davuth 2011-03-10 01:14:15

+2

是的,這就是我所說的。關於驗證方法沒有什麼「不潔」的東西返回true/false值,這是它的函數的輸出。 – Kris 2011-03-10 12:55:01

1

更復雜的方式是。

  • 驗證和setAttributes請求如果錯誤發現,向前請求對JSP支票的jsp
  • 爲錯誤屬性如果任何本顯示它們

另請參見

+0

我沒有使用JSP。我使用簡單的HTML和JavaScript來請求。 – Davuth 2011-03-10 01:15:37

+0

比你如何顯示錯誤信息? – 2011-03-10 05:25:29

+0

通過ajax獲取消息並顯示它 – Davuth 2011-03-10 05:51:07

0

有你試着用以下

response.sendRedirect("some view.jsp");

一方(或)

System.exit(0); // which exits from the program

+0

'System.exit(0)'將結束JVM,而不僅僅是單個請求。我不能使用'sendRedirect()',因爲我在這裏沒有使用.jsp,我正在使用html和javascript。 – Davuth 2011-03-10 01:08:54

0

這聽起來像你想獲得一個參考OutputStream將HTML寫回客戶端?您可以使用response.getOutputStream()返回ServletOutputStream

一旦你寫了這個流,你需要完成。一旦你完成,你將不得不close()flush()

無論你寫入這個流將被髮送到瀏覽器。還請記得致電 response.setContentType("text/html");,以便瀏覽器知道它處理HTML。

1

你叫什麼「過程」?那個單一的要求?如果是,那麼發回消息會結束servlet的責任。 HTTP是一個請求/響應協議。

如果你的意思是停止servlet,那是不對的。該servlet在容器中運行,該容器仍在運行。它等待下一個請求。

我沒有看到任何值得停止的事情。驗證和路由返回錯誤很常見。

+0

是的,我指的是單個請求,我想要的只是驗證輸入如果失敗,使用'out.write()'寫出一些消息並結束該單個請求,只調用'out.write()',請求不會在那裏停止,它將繼續執行其餘的代碼如果有的話。 – Davuth 2011-03-10 01:07:56

9
public void doPost(HttpServletRequest request, HttpServletResponse response) throws IOException{ 
    String param1 = request.getParameter("param1"); 
    String param2 = request.getParameter("param2"); 

    if(!isValidInput(param1, param2)){ 
     PrintWriter out = response.getWriter(); 
     out.write("invalid input"); 
     return; 
    } 

    //if nothing's wrong with the input, do this and that 

} 


private boolean isValidInput(String param1, String param2){ 
    boolean fail = false; 
    //validate input and return true/false 

} 
+1

簡單和華麗,到處都是=) – 2014-04-13 18:00:03

1

試試這個:

我改變你的驗證返回一個布爾值,這樣你就可以運行如果doPost方法就可以了聲明。我也讓它取得了成功,而不是失敗,只是讓你在返回後更有意義。

response.sendError將允許您執行通用錯誤頁面(請參閱:http://blogs.atlassian.com/2007/07/responsesenderror_vs_responses/)而不是您的輸出。如果你想要,你會想要setStatus(再次,請參閱鏈接)。

返回應該終止執行並阻止其他事件發生,但不會像system.exit(0)那樣關閉servlet。

public void doPost(HttpServletRequest request, HttpServletResponse response) throws IOException{ 
    String param1 = request.getParameter("param1"); 
    String param2 = request.getParameter("param2"); 

    if (! validateInput(param1, param2, request, response)){ 
     response.sendError(HttpServletResponse.SC_INTERNAL_SERVER_ERROR); 
     //Or you can use this instead... 
     //response.setStatus(HttpServletResponse.SC_INTERNAL_SERVER_ERROR); 
     //PrintWriter out = response.getWriter(); 
     //out.write("invalid input"); 
     return; 
    } 
    //if nothing's wrong with the input, do this and that 
} 




private boolean validateInput(String param1, String param2, HttpServletRequest request, HttpServletResponse response) throws IOException{ 
    boolean success = false; 

    //validate input blah blah blah 

    return success; 
}