Java 如何停止servlet?
我有一个如下所示的servlet:Java 如何停止servlet?,java,jsp,servlets,jakarta-ee,Java,Jsp,Servlets,Jakarta Ee,我有一个如下所示的servlet: public void doPost(HttpServletRequest request, HttpServletResponse response) throws IOException{ String param1 = request.getParameter("param1"); String param2 = request.getParameter("param2"); validateInput(param1, para
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()
,以验证输入是否有效。如果输入无效,请写回消息,然后结束该过程。我的问题是如何结束这个过程?我知道调用返回doPost()
中的code>将结束进程,但我试图避免仅为了结束进程而将任何值从validateInput()
返回到doPost()
。我个人觉得这样比将true
或false
返回doPost()
并调用return更具可读性代码>那里。有办法吗?还是根本不可能?更复杂的方法是
- 如果发现错误,验证并设置请求属性,并将请求转发给jsp
- 在jsp上检查错误属性(如果存在)是否显示它们
另请参见
您是否尝试过以下任一方法
response.sendRedirect(“some view.jsp”)代码>
(或)
System.exit(0);//哪个退出程序
听起来您想获取对输出流的引用,以便将HTML写回客户端
您可以使用response.getOutputStream()
返回ServletOutputStream
一旦写入此流,就需要完成。完成后,您必须close()
和flush()
您写入此流的任何内容都将发送到浏览器。还记得打电话给
response.setContentType(“text/html”)代码>这样浏览器就知道它在处理HTML了。你称之为“过程”是什么?那一个请求?如果是的话,那么发送一条消息就结束了servlet的责任。HTTP是一种请求/响应协议
如果你的意思是停止servlet,那是不对的。servlet在容器中运行,容器仍在运行。它等待下一个请求
我看没有什么值得停下来的。验证和带错误的路由返回是常见的。在运行validateInput
之后,控件将始终返回到doPost
,除非您抛出异常(在这种情况下是未检查的异常或IOException
)
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
}
因此,如果您没有从validateInput
返回任何值到doPost
,即使您提交了响应,doPost
仍将继续执行它应该执行的任何操作。(当然,如果提交了响应,浏览器将完全不知道服务器端的任何进一步活动)
您将需要返回一个值、抛出一个异常(可能会捕获该异常)或设置一个全局值,该全局值由doPost
检查(这很混乱)。尝试以下操作:
我将validate更改为返回布尔值,因此可以在doPost方法中对其运行if语句。我还让它返回成功而不是失败,只是为了让支票在您返回后更有意义
response.sendError将允许您执行一般错误页面(请参见:)而不是输出。如果您想要,您将需要setStatus(同样,请参阅链接)
返回应该终止执行并阻止其余的执行,但它不会像system.exit(0)那样关闭servlet
返回布尔值正是您应该做的。你应该回来!失败并让doPost处理写入和终止操作。@dtech:如果在validateInput()
中无法结束请求,则是。。那是唯一的办法。是的,我指的是那一个请求。我想要的只是验证输入。如果失败,请使用该out.write()
编写一些消息,并结束该请求。通过只调用out.write()
,请求不会就此停止。它将继续执行其余的代码(如果有的话)。System.exit(0)
将结束JVM,而不仅仅是单个请求。我不能使用sendRedirect()
,因为我这里没有使用.jsp。我使用的是html和javascript。换句话说,你的意思是,如果不抛出异常(这里不可取)或从validateInput()返回任何值,就无法停止单个请求吗
?我真的不想仅仅为了结束请求而返回任何值。我想让它变得干净。:(是的,这就是我要说的。没有什么“不干净的”“关于返回真/假值的验证方法。这是其函数的输出。我不使用JSP。我使用简单的HTML和JavaScript通过ajax请求。获取消息并显示它
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;
}