1. GenericServlet:

1). 是一个 Serlvet. 是 Servlet 接口和 ServletConfig 接口的实现类. 但是一个抽象类. 其中的 service 方法为抽象方法

2). 如果新建的 Servlet 程序直接继承 GenericSerlvet 会使开发更简洁.

3). 具体实现:

①. 在 GenericServlet 中声明了一个 SerlvetConfig 类型的成员变量, 在 init(ServletConfig) 方法中对其进行了初始化
②. 利用 servletConfig 成员变量的方法实现了 ServletConfig 接口的方法
③. 还定义了一个 init() 方法, 在 init(SerlvetConfig) 方法中对其进行调用, 子类可以直接覆盖 init() 在其中实现对 Servlet 的初始化.

④. 不建议直接覆盖 init(ServletConfig), 因为如果忘记编写 super.init(config); 而还是用了 SerlvetConfig 接口的方法,则会出现空指针异常.

⑤. 新建的 init(){} 并非 Serlvet 的生命周期方法. 而 init(ServletConfig) 是生命周期相关的方法.

public abstract class GenericServlet implements Servlet, ServletConfig {

/** 以下方法为 Servlet 接口的方法 **/
@Override
public void destroy() {} @Override
public ServletConfig getServletConfig() {
return servletConfig;
} @Override
public String getServletInfo() {
return null;
} private ServletConfig servletConfig; @Override
public void init(ServletConfig arg0) throws ServletException {
this.servletConfig = arg0;
init();
} public void init() throws ServletException{} @Override
public abstract void service(ServletRequest arg0, ServletResponse arg1)
throws ServletException, IOException; /** 以下方法为 ServletConfig 接口的方法 **/
@Override
public String getInitParameter(String arg0) {
return servletConfig.getInitParameter(arg0);
} @Override
public Enumeration getInitParameterNames() {
return servletConfig.getInitParameterNames();
} @Override
public ServletContext getServletContext() {
return servletConfig.getServletContext();
} @Override
public String getServletName() {
return servletConfig.getServletName();
} }

2. HttpServlet:

1). 是一个 Servlet, 继承自 GenericServlet. 针对于 HTTP 协议所定制.

2). 在 service() 方法中直接把 ServletReuqest 和 ServletResponse 转为 HttpServletRequest 和 HttpServletResponse.
并调用了重载的 service(HttpServletRequest, HttpServletResponse)

在 service(HttpServletRequest, HttpServletResponse) 获取了请求方式: request.getMethod(). 根据请求方式有创建了
doXxx() 方法(xxx 为具体的请求方式, 比如 doGet, doPost)

@Override
public void service(ServletRequest req, ServletResponse res)
throws ServletException, IOException { HttpServletRequest request;
HttpServletResponse response; try {
request = (HttpServletRequest) req;
response = (HttpServletResponse) res;
} catch (ClassCastException e) {
throw new ServletException("non-HTTP request or response");
}
service(request, response);
} public void service(HttpServletRequest request, HttpServletResponse response)
throws ServletException, IOException {
//1. 获取请求方式.
String method = request.getMethod(); //2. 根据请求方式再调用对应的处理方法
if("GET".equalsIgnoreCase(method)){
doGet(request, response);
}else if("POST".equalsIgnoreCase(method)){
doPost(request, response);
}
} public void doPost(HttpServletRequest request, HttpServletResponse response)
throws ServletException, IOException{
// TODO Auto-generated method stub } public void doGet(HttpServletRequest request, HttpServletResponse response)
throws ServletException, IOException {
// TODO Auto-generated method stub }

3). 实际开发中, 直接继承 HttpServlet, 并根据请求方式复写 doXxx() 方法即可.

4). 好处: 直接由针对性的覆盖 doXxx() 方法; 直接使用 HttpServletRequest 和 HttpServletResponse, 不再需要强转.

最新文章

  1. App Store
  2. 【leetcode】Candy(hard) 自己做出来了 但别人的更好
  3. Dialog+NumberPicker
  4. Ubuntu 中软件的安装、卸载以及查看的方法总结
  5. Silverlight页面通过继承扩展实现
  6. 搭建 MPICH3 并行计算环境
  7. 数据结构(三)实现AVL树
  8. JS时间处理,获取天时分秒
  9. zepto源码研究 - ajax.js(请求过程中的各个事件分析)
  10. RIAidea – Focus on Flash/Flex/AIR » About Me
  11. 11.巨坑,注意了,关于显示不正常的问题,localstorage的存储问题
  12. Mybatis中#与$区别
  13. Spring Boot——Linux 启动方式
  14. npm安装插件
  15. 通讯录设计ver1.0版本
  16. Sqoop入门
  17. C++泛型线性查找算法——find
  18. 6.4 C++提取子字符串及字符串的比较
  19. java数组排序(插入排序、冒泡排序、选择排序)与递归 代码示例
  20. day17-函数装饰器

热门文章

  1. 6.MySQL优化---高级进阶之表的设计及优化
  2. 如何去除Linux文件的^M字符
  3. C8051F340 USB Fn hacking
  4. UVA - 11019 Matrix Matcher (二维字符串哈希)
  5. C#面向对象(二):封装和继承
  6. webpack 单页面应用实战
  7. 学习动态性能表(16)--v$rowcache
  8. MySQL 5.7.10 自动备份、自动清理旧备份集(转)
  9. asp.net给按钮添加删除确认
  10. Common 通用类库