2011-03-09 158 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; 
}