如何停止servlet?

时间:2011-03-09 10:29:33

标签: java jsp servlets java-ee

我有一个看起来像这样的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()会结束这个过程,但我试图避免从{返回任何值} {1}} validateInput()只是为了结束这个过程。我个人认为这种方式更具可读性,而不是将doPost()true返回false并在那里调用doPost()。有办法吗?或者这根本不可能?

7 个答案:

答案 0 :(得分: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 :(得分:4)

doPost运行后,控件将始终返回validateInput,除非您抛出异常(在这种情况下是未经检查的异常或IOException)。

因此,如果您没有从validateInput返回doPost的任何值,即使您提交了响应,doPost仍将继续执行它应该执行的任何操作。 (当然,如果提交了响应,浏览器将完全不知道服务器端的任何进一步活动。)

您将需要返回一个值,抛出一个异常(doPost可能会捕获)设置doPost检查的全局值(这只是一个混乱)。

答案 2 :(得分:1)

更复杂的方式是。

  • validate和setAttributes请求发现错误并转发请求到jsp
  • on jsp检查错误属性,如果有任何显示它们

另见

答案 3 :(得分:1)

你在说什么叫“过程”?那个单一的请求?如果是,那么发回消息将结束servlet的职责。 HTTP是请求/响应协议。

如果你的意思是停止servlet,那就不对了。 servlet在容器中运行,它仍在运行。它等待下一个请求。

我没有看到任何值得停止的东西。验证和返回错误是很常见的。

答案 4 :(得分:1)

试试这个:

我更改了您的validate以返回布尔值,因此您可以在doPost方法中对其运行if语句。我也让它恢复成功而不是失败,这样一旦你回来,检查就更有意义了。

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;
}

答案 5 :(得分:0)

听起来你想要引用OutputStream来将HTML写回客户端?

您可以使用会返回response.getOutputStream()的{​​{1}}。

一旦你写了这个流,你需要完成。完成后,您必须ServletOutputStreamclose()

您写入此流的任何内容都将发送到浏览器。还记得打电话给 flush()所以浏览器知道它处理HTML。

答案 6 :(得分:-1)

您是否尝试过以下任一项

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

(或)

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