一个sevlet的例子,调试跟踪的时候出了问题

qwa 2017-12-04 09:46:28
我记得看到的资料都说,调用servlet的时候,会进入HttpServlet中,然后用public void service(ServletRequest req, ServletResponse res)
throws ServletException, IOException来判断method方法,然后根据方法调用doGet和doPost,但是我在跟踪调试的时候,却发现,竟然是先进入doGet或者doPost,然后才进入Service,并且在 Service的if语句中就跳出了,并进入了NoBodyResponse的setHeader,不知道怎么回事。请高手给解释解释。是不是配置有问题?我用的的是idea16 + maven
if (!(req instanceof HttpServletRequest &&
res instanceof HttpServletResponse)) {
throw new ServletException("non-HTTP request or response");
}

以下是我的代码
/**
* Created by ShenLiang on 2017/11/30.
*/
package servlet;

import javax.servlet.ServletException;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import java.io.IOException;
import java.io.PrintWriter;

public class FirstServlet extends HttpServlet {

private static final long serialVersionUID = 1L;

private int serial = 0;
@Override
public void doGet(HttpServletRequest req, HttpServletResponse resp)
throws ServletException, IOException {
this.log("序号:"+serial + "======doGet");
serial++;
execute(req,resp);
}

@Override
public void doPost(HttpServletRequest req, HttpServletResponse resp)
throws ServletException, IOException {
this.log("序号:"+serial + "======doPost");
serial++;
execute(req,resp);
}

private void execute(HttpServletRequest req, HttpServletResponse resp)
throws ServletException, IOException{
resp.setCharacterEncoding("UTF-8");
req.setCharacterEncoding("UTF-8");

String requestURI = req.getRequestURI();

String method = req.getMethod();

String param = req.getParameter("param");
resp.setContentType("text/html");

PrintWriter out = resp.getWriter();

//输出到客户端浏览器
out.println("<!DOCTYPE HTML PUBLIC \"-//W3C//DTD HTML 4.01 Transitional//EN\">");
out.println("<HTML>");
out.println(" <HEAD><TITLE>A Servlet</TITLE></HEAD>");
out.println(" <BODY>");
out.println(" 以 " + method + " 方式访问该页面。取到的 param 参数为:" + param + "<br/>");

out.println(" <form action='" + requestURI + "' method='get'><input type='text' name='param' value=''><input type='submit' value='以 GET 方式访问 RequestServlet'></form>");
out.println(" <form action='" + requestURI + "' method='post'><input type='text' name='param' value=''><input type='submit' value='以 POST 方式访问 RequestServlet'></form>");

// 由客户端浏览器读取该文档的更新时间
out.println(" <script>document.write('本页面最后更新时间:' + document.lastModified + '<br />'); </script>");
out.println(" <script>document.write('本页面URL:' + location + '<br/>' ); </script>");

out.println(" </BODY>");
out.println("</HTML>");
out.flush();
out.close();
}

@Override
protected long getLastModified(HttpServletRequest req) {
this.log("序号:" + serial + "======getLastModified");
serial++;
return 1;
}

@Override
public void init() throws ServletException {
this.log("序号:"+serial + "======init()");
serial++;
}

@Override
public void destroy() {
this.log("序号:" + serial + "======destroy()");
serial++;
}
}
...全文
204 4 打赏 收藏 转发到动态 举报
写回复
用AI写文章
4 条回复
切换为时间正序
请发表友善的回复…
发表回复
qwa 2017-12-04
  • 打赏
  • 举报
回复
奇怪的是,我重写service方法后,倒是正常了,不明其因
qwa 2017-12-04
  • 打赏
  • 举报
回复
引用 1 楼 yanghaimingg 的回复:
没看到你重写的service方法,默认调用的是httpServlet的service方法,由它负责调用你写的servlet的doget或者dopost方法
我没有重写service方法,但我在调试的时候,进入的是HttpServlet的,结果却是doGet和doPost在先,不知道是怎么回事。
mtian2020 2017-12-04
  • 打赏
  • 举报
回复
没看到你重写的service方法,默认调用的是httpServlet的service方法,由它负责调用你写的servlet的doget或者dopost方法
自由自在_Yu 2017-12-04
  • 打赏
  • 举报
回复
引用 3 楼 qwa 的回复:
奇怪的是,我重写service方法后,倒是正常了,不明其因
你不重写,执行的是父类HttpServlet类中的service()方法,重写的话就是执行当前类的service() 不会因为你重写了就改变执行顺序的

81,092

社区成员

发帖
与我相关
我的任务
社区描述
Java Web 开发
社区管理员
  • Web 开发社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧