我有一个接收数据的servlet,如果数据没问题,它会持续存在。
到目前为止,我尝试了以下内容:
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 :(得分: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>
答案 1 :(得分: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 和 else-if ,您可以按如下方式编写整个方法:
protected void doGet(HttpServletRequest request, HttpServletResponse response) {
if (!check1()) {
handleErroneousRequest(response, "Error 1");
} else if (!check2()) {
handleErroneousRequest(response, "Error 2");
} else {
persist();
}
}
对于单语句块,括号是可选的,但为了清楚起见,我将它们包括在内。
解决问题的另一种方法是使用 Exceptions 。在这种情况下,check1
或check2
方法应该抛出异常。任何未捕获的异常都会立即停止方法执行,这也适用于try
- 块中的其余语句。因此,异常也可用于控制程序的流程。
但是,如果行为是例外,则应使用异常。 验证东西期望验证失败,因此从架构的角度来看,应该返回合理的验证结果。
但是,如果您选择使用Exceptions,则使用它们的一种方法如下(假设check1
和'check2'抛出异常):
protected void doGet(HttpServletRequest request, HttpServletResponse response) {
try {
check1();
check2();
persist();
} catch (MyAwesomeException e) {
handleErroneousRequest(response, e.getMessage());
}
}
你也可以选择不来自己处理异常(省略try-catch块)并让异常将堆栈冒泡回到calee - 容器 - 并将其配置为@mikibrv已经在他的回答中发布了向用户显示错误消息。如果您无法从程序中的异常中恢复,那么这是特别有用的,唯一明智的做法就是通知用户。
但是,在许多情况下,您可以从异常中优雅地恢复,并且永远不需要通知用户。