2016-08-05 39 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

相关问题