我有一个看起来像这样的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
}
}
我的想法是,我想将param1
和param2
传递给函数validateInput()
,以验证输入是否有效。如果输入无效,请写回消息然后结束该过程。我的问题是如何结束这个过程?我知道在return;
中调用doPost()
会结束这个过程,但我试图避免从{返回任何值} {1}} validateInput()
只是为了结束这个过程。我个人认为这种方式更具可读性,而不是将doPost()
或true
返回false
并在那里调用doPost()
。有办法吗?或者这根本不可能?
答案 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)
更复杂的方式是。
另见
答案 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}}。
一旦你写了这个流,你需要完成。完成后,您必须ServletOutputStream
和close()
。
您写入此流的任何内容都将发送到浏览器。还记得打电话给
flush()
所以浏览器知道它处理HTML。
答案 6 :(得分:-1)
您是否尝试过以下任一项
response.sendRedirect("some view.jsp");
(或)
System.exit(0); // which exits from the program