2016-08-05 91 views
0

我有一個接收數據的servlet,如果數據正常,它仍然存在。我可以強制Java方法在某個點返回嗎?

到目前爲止,我試過如下:

public class ListenerServlet extends HttpServlet { 

protected void doGet(HttpServletRequest request, HttpServletResponse response) { 

    if(!check1()) 
    handleErroneousRequest(response, "Error 1"); 

    if(!check2()) 
    handleErroneousRequest(response, "Error 2"); 

    persist(); 

} 

private void handleErroneousRequest(HttpServletResponse response, String errorMessage) { 
     response.setStatus(HttpServletResponse.SC_BAD_REQUEST); 
     response.setContentType("text/xml"); 
     PrintWriter out = response.getWriter(); 
     out.flush(); 
     out.close(); 
     log.error("Error : " + errorMessage); 
    } 
} 

正如你可以想像,這並沒有如我所料工作。 是否有比其他系列更優雅的解決方案?我可以強制該方法返回,因爲我試圖做?

到目前爲止,我在淘選做這樣的事情:

boolean isOK = true; 
if(!check1()) { 
    isOK = false; 
    error = "bla"; 
} 

if(!check2()) { 
    isOK = false; 
    error = "bla"; 
} 

if(isOK){ 
    doStuff() 
} 
+0

如果你打算低估我,至少要有禮貌來解釋爲什麼... – Tim

+1

什麼能阻止你在需要時使用「return」? – Polygnome

+0

這是一個非常好的主意。讓我嘗試。 – Tim

回答

0

爲了從Java中的方法,您可以使用return聲明。

protected void doGet(HttpServletRequest request, HttpServletResponse response) { 

    if (!check1()) { 
     handleErroneousRequest(response, "Error 1"); 
     return; 
    } 

    if (!check2()) { 
     handleErroneousRequest(response, "Error 2"); 
     return; 
    } 

    persist(); 

} 

有,但是,至少有兩個甚至更好的方法來解決這個特殊的任務:IF-THEN-ELSE例外

使用IF-THEN-ELSE否則,如果,你可以寫整個方法如下:

protected void doGet(HttpServletRequest request, HttpServletResponse response) { 

    if (!check1()) { 
     handleErroneousRequest(response, "Error 1"); 
    } else if (!check2()) { 
     handleErroneousRequest(response, "Error 2"); 
    } else { 
     persist(); 
    } 
} 

括號是可選的單語句塊,但是我包括他們明晰。

解決該問題的另一種方法是使用例外。在這種情況下,check1check2方法應該拋出異常。任何未捕獲的異常立即停止方法執行,這也適用於try - 塊中的其餘語句。 異常也可以用來控制程序的流程。

但是,例外應該使用,如果行爲是,以及例外驗證東西預計驗證失敗,所以從架構的角度來看,應該返回明智的驗證結果。

但是,如果您選擇使用異常,一個方法使用起來會如下(假設check1和「CHECK2」拋出異常):

protected void doGet(HttpServletRequest request, HttpServletResponse response) { 

    try { 
     check1(); 
     check2(); 
     persist(); 
    } catch (MyAwesomeException e) { 
     handleErroneousRequest(response, e.getMessage()); 
    } 
} 

您也可以選擇處理自己例外(省略try-catch塊),讓Exception跳出堆棧返回到Calee - 容器 - 並將其配置爲@mikibrv在他的答案中發佈以向用戶顯示錯誤消息。如果您無法從程序內部的異常中恢復,這是特別有用的,唯一明智的做法是通知用戶。

但是,在很多情況下,您可以從異常中正常恢復,而不需要通知用戶相關信息。

+0

謝謝。我知道所有這些,但我從來沒有想過在Servlets中使用返回(誰知道爲什麼) – Tim

1

這將是一個想法在你的支票使用異常。你可以拋出一些擴展ServletException的異常異常(這是servlet中拋出的標準異常)。

您可以在可以顯示自定義內容的處理程序中捕獲該異常。不需要if/else,並且您將對異常處理和您的實際代碼有很好的分離。

這裏是一個教程,可以幫助你和你想要達到的目標:http://www.journaldev.com/1973/servlet-exception-and-error-handling-example-tutorial

檢查在web.xml配置:

<error-page> 
    <exception-type>javax.servlet.ServletException</exception-type> 
    <location>/AppExceptionHandler</location> 
    </error-page> 
+0

謝謝,這個工程,但我沒有狀態代碼的來電者。該servlet沒有在瀏覽器中被調用,而是被另一個程序調用。如果發生異常,我無法設置響應狀態碼,我可以嗎? – Tim

+0

封裝您用於在try塊中檢查數據的代碼。數據無效時拋出異常。然後,在catch塊中處理異常,並根據需要設置響應。 – Ephi

+0

但是,我仍然需要返回,否則代碼將繼續。或者我錯過了什麼? – Tim

相關問題