一个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++;
}
}
...全文
208 4 打赏 收藏 转发到动态 举报
AI 作业
写回复
用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() 不会因为你重写了就改变执行顺序的
JSP初学者用书 很不错的一本书 第1章 servlet和jsp技术概述 1.1 servlet的功用 1.2 要动态构建网页的原因 1.3 servlet代码初探 1.4 servlet相对于“传统”cgi的优点 1.5 jsp的作用 第1部分 servlet技术 第2章 服务器的安装和配置 2.1 下载和安装java软件开发工具包 2.2 为桌面计算机下载服务器 2.3 服务器的配置 2.4 配置apachetomcat 2.5 配置macromediajrun 2.6 配置cauchoresin 2.7 建立开发环境 2.8 测试系统的设置 2.9 实现简化的部署方法 2.10 默认web应用的部署目录:汇总 2.11 web应用:预览 第3章 servlet基础 .3.1 servlet的基本结构 3.2 生成纯文本的servlet 3.3 生成html的servlet 3.4 servlet的打包 3.5 简单的html构建工具 3.6 servlet的生命周期 3.7 singlethreadmodel接口 3.8 servlet的调试 第4章 客户请求的处理:表单数据 4.1 表单数据的作用 4.2 在servlet中读取表单数据 4.3 示例:读取3个参数 4.4 示例:读取所有参数 4.5 参数缺失或异常时默认值的应用 4.6 过滤字符串中的html特殊字符 4.7 根据请求参数自动填充java对象:表单bean 4.8 当参数缺失或异常时重新显示输入表单 第5章 客户请求的处理:http请求报头 5.1 请求报头的读取 5.2 制作所有请求报头的表格 5.3 了解http1.1请求报头 5. 4 发送压缩web页面 5.5 区分不同的浏览器类型 5.6 依据客户的到达方式定制页面 5.7 标准cgi变量的访问 第6章 服务器响应的生成:http状态代码 6.1 状态代码的指定 6.2 http1.1状态代码 6.3 将用户重定向到浏览器相关页面的servlet 6.4 各种搜索引擎的一个前端 第7章 服务器响应的生成:htip响应报头 7.1 在servlet中设置响应报头 7.2 理解http1.1响应报头 7.3 构建excel电子表格 7.4 servlet状态的持续以及页面的自动重载 7.5 使用servlet生成jpeg图像 第8章 cookie管理 8.1 cookie的优点 8.2 cookie存在的一些问题 8.3 cookie的删除 8.4 cookie的发送和接收 8.5 使用cookie检测初访者 8.6 使用cookie属性 8.7 区分会话cookie与持续性cookie 8.8 基本的cookie实用程序 8.9 实际使用cookie实用程序 8.10 修改cookie的值:记录用户的访问计数 8.11 使用cookie记录用户的偏好 第9章 会话跟踪 9.1 会话跟踪的需求 9.2 会话跟踪基础 9.3 会话跟踪api 9.4 浏览器会话与服务器会话 9.5 对发往客户的url进行编码 9.6 显示客户访问计数的servlet 9.7 累计用户数据的列表 9.8 拥有购物车和会话跟踪功能的在线商店 第ii部分 jsp技术 第10章 jsp技术概述 10.1 对jsp的需求 10.2 jsp的好处 10.3 jsp相对于竞争技术的优势 10.4 对jsp的误解 10.5 jsp页面的安装 10.6 基本语法 第11章 用jsp脚本元素调用java代码 11.1 模板文本的创建 11.2 在jsp中调用java代码 11.3 限制jsp页面中java代码的量 11.4 jsp表达式的应用 11.5 示例:jsp表达式 11.6 servlet和jsp页面的对比 11.7 编写scriptlet 11.8 scriptlet示例 11.9 使用scriptlet将jsp页面的某些部分条件化 11.10 使用声明 11.11 声明的例子 11.12 使用预定义变量 11.13 jsp表达式、scriptlet和声明的比较 第12章 控制所生成的servlet的结构:jsppage指令 12.1 import属性 12.2 contenttype和pageencoding属性 12.3 条件性地生成excel电子表格 12.4 session属性 12.5 iselignored属性 12.6 buffer和autoflush属性 12.7 info属性 12.8 errorpage和iserrorpage属性 12.9 isthreadsafe属性 12.10 extends属性 12.11 language属性 12.12 指令的xml语法 第13章 在jsp页面中包含文件和applet 13.1 在请求期间包含页面:jsp:include动作 13.2 在页面转换期间包含文件:include指令 13.3 使用jsp:forward转发请求 13.4 包含使用java插件的applet 第14章 javabean组件在jsp文档中的应用 14.1 使用bean的原因 14.2 bean是什么 14.3 bean的应用:基本任务 14.4 示例:stringbean 14.5 设置bean的属性:高级技术 14.6 共享bean 14.7 共享bean的4种方式:示例 第15章 servlet和jsp的集成:模型—视图—控制器构架 15.1 mvc的需求 15.2 用request dispatcher实现mvc 15.3 mvc代码汇总 15.4 目的页面中相对url的解释 15.5 mvc的应用:银行账户余额 15.6 3种数据共享方式的对比 15.7 从jsp页面转发请求 15.8 包含页面 第16章 简化对java代码的访问:jsp 2.0表达式语言 16.1 应用el的驱动力 16.2 表达式语言的调用 16.3 阻止表达式语言的求值 16.4 阻止标准脚本元素的使用 16.5 访问作用域变量 16.6 访问bean的属性 16.7 访问集合 16.8 引用隐式对象 16.9 表达式语言中运算符的应用 16.10 表达式的条件求值 16.11 表达式语言其他功能概览 第ⅲ部分 支持技术 第17章 数据库访问:jdbc 17.1 jdbc应用概述 17.2 基本jdbc示例 17.3 用jdbc实用工具简化数据库访问 17.4 使用预备语句 17.5 创建可调用语句 17.6 使用数据库事务 17.7 使用orm框架将数据映射到对象 第18章 配置msaccess,mysql和oracle9i 18.1 配置microsoftaccess与jdbc的使用 18.2 mysql的安装和配置 18.3 oracle9i数据库的安装和配置 18.4 通过jdbc连接来测试数据库 18.5 建立music表 第19章 html表单的创建和处理 19.1 html表单如何传输数据 19.2 form元素 19.3 文本控件 19.4 按钮 19.5 复选框和单选按钮 19.6 组合框和列表框 19.7 文件上载控件 19.8 服务器端图像映射 19.9 隐藏域 19.10 控件组 19.11 制表次序 19.12 用于调试的web服务器 附录 服务器的组织与结构

81,122

社区成员

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

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