前言:

项目的实际应用中,我们往往为了方便去继承GenericServlet类,而不是去实现Servlet接口,是什么原因呢?下面进行简单的实践操作。

一. 准备工作


1.首先看GenericServlet的API:

GenericServlet

javax.servlet

Class GenericServlet

All Implemented Interfaces:
Serializable,Servlet,ServletConfig
Direct Known Subclasses:

HttpServlet

Method Summary
 void destroy()

          Called by the servlet container to indicate to a servlet that the servlet is being taken out of service.
 String getInitParameter(String name)

          Returns a String containing the value of the named initialization parameter, ornull if the parameter does not exist.
 Enumeration getInitParameterNames()

          Returns the names of the servlet's initialization parameters as an
Enumeration
of String objects, or an empty Enumeration if the servlet has no initialization parameters.
 ServletConfig getServletConfig()

          Returns this servlet's ServletConfig object.
 ServletContext getServletContext()

          Returns a reference to the ServletContext in which this servlet is running.
 String getServletInfo()

          Returns information about the servlet, such as author, version, and copyright.
 String getServletName()

          Returns the name of this servlet instance.
 void init()

          A convenience method which can be overridden so that there's no need to callsuper.init(config).
 void init(ServletConfig config)

          Called by the servlet container to indicate to a servlet that the servlet is being placed into service.
 void log(String msg)

          Writes the specified message to a servlet log file, prepended by the servlet's name.
 void log(String message,Throwable t)

          Writes an explanatory message and a stack trace for a given Throwable exception to the servlet log file, prepended by the servlet's name.
abstract  void service(ServletRequest req,ServletResponse res)

          Called by the servlet container to allow the servlet to respond to a request.

可以看出:GenericServlet共有两个实现类Servlet和ServletConfig,还有一个子类HttpServlet.

二. 项目实践


实验目标:在web.xml中分别定义当前web应用的参数和当前servlet的参数,并在java类当中获取,控制台中打印出来。

2.1 只实现servlet的方式:

(a)项目目录结构:

(b)web.xml

  1. <?xml version="1.0" encoding="UTF-8"?>
  2. <web-app xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns="http://java.sun.com/xml/ns/javaee" xsi:schemaLocation="http://java.sun.com/xml/ns/javaee http://java.sun.com/xml/ns/javaee/web-app_3_0.xsd" id="WebApp_ID" version="3.0">
  3. <display-name>javaWeb_08</display-name>
  4.  
  5. <!-- 当前web应用的参数 -->
  6. <context-param>
  7. <param-name>user1</param-name>
  8. <param-value>admin</param-value>
  9. </context-param>
  10. <context-param>
  11. <param-name>password1</param-name>
  12. <param-value>123456</param-value>
  13. </context-param>
  14.  
  15. <servlet>
  16. <!-- 当前servlet的参数 -->
  17. <init-param>
  18. <param-name>user2</param-name>
  19. <param-value>admin</param-value>
  20. </init-param>
  21. <init-param>
  22. <param-name>password2</param-name>
  23. <param-value>123456</param-value>
  24. </init-param>
  25.  
  26. <servlet-name>MyGenericServlet</servlet-name>
  27. <servlet-class>com.dao.chu.MyGenericServlet</servlet-class>
  28. </servlet>
  29.  
  30. <servlet-mapping>
  31. <servlet-name>MyGenericServlet</servlet-name>
  32. <url-pattern>/MyGenericServlet</url-pattern>
  33. </servlet-mapping>
  34.  
  35. </web-app>

(c) MyGenericServlet.java

  1. package com.dao.chu;
  2.  
  3. import java.io.IOException;
  4.  
  5. import javax.servlet.Servlet;
  6. import javax.servlet.ServletConfig;
  7. import javax.servlet.ServletContext;
  8. import javax.servlet.ServletException;
  9. import javax.servlet.ServletRequest;
  10. import javax.servlet.ServletResponse;
  11.  
  12. /**
  13. *
  14. * <p>Title: MyGenericServlet</p>
  15. * <p>Description: 自定义MyGenericServlet</p>
  16. */
  17. public class MyGenericServlet implements Servlet{
  18.  
  19. //ServletConfig对象,在init方法执行后赋值
  20. private ServletConfig servletConfig;
  21.  
  22. @Override
  23. public void destroy() {
  24. // TODO Auto-generated method stub
  25.  
  26. }
  27.  
  28. //ServletConfig对象的get方法
  29. @Override
  30. public ServletConfig getServletConfig() {
  31. return servletConfig;
  32. }
  33.  
  34. @Override
  35. public String getServletInfo() {
  36. // TODO Auto-generated method stub
  37. return null;
  38. }
  39.  
  40. @Override
  41. public void init(ServletConfig servletConfig) throws ServletException {
  42.  
  43. System.out.println("init...");
  44. this.servletConfig=servletConfig;
  45.  
  46. }
  47.  
  48. @Override
  49. public void service(ServletRequest servletRequest, ServletResponse servletResponse)
  50. throws ServletException, IOException {
  51.  
  52. //得到servletContext对象
  53. ServletContext servletContext = servletConfig.getServletContext();
  54.  
  55. //当前web应用的参数
  56. String user1 = servletContext.getInitParameter("user1");
  57. String password1 = servletContext.getInitParameter("password1");
  58.  
  59. String user2 = servletConfig.getInitParameter("user2");
  60. String password2 = servletConfig.getInitParameter("password2");
  61.  
  62. System.out.println("user1 is: "+user1);
  63. System.out.println("passwrod1 is: "+password1);
  64. System.out.println("user2 is: "+user2);
  65. System.out.println("passwrod2 is: "+password2);
  66. }
  67.  
  68. }

(d) 运行结果

(e)小结:我们首先需要获取servletConfig对象,而servletConfig对象在init方法中,方法却写在service方法中,所以我们定义了私有的servletConfig对象,并在init方法中把参数传给我们定义的servletConfig对象,写好servletConfig的get方法。

2.2 将MyGenericServlet作为父类,其他类来继承这个类

(a)项目结构:

(b) web.xml

  1. <?xml version="1.0" encoding="UTF-8"?>
  2. <web-app xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns="http://java.sun.com/xml/ns/javaee" xsi:schemaLocation="http://java.sun.com/xml/ns/javaee http://java.sun.com/xml/ns/javaee/web-app_3_0.xsd" id="WebApp_ID" version="3.0">
  3. <display-name>javaWeb_08</display-name>
  4.  
  5. <!-- 当前web应用的参数 -->
  6. <context-param>
  7. <param-name>user1</param-name>
  8. <param-value>admin</param-value>
  9. </context-param>
  10. <context-param>
  11. <param-name>password1</param-name>
  12. <param-value>123456</param-value>
  13. </context-param>
  14.  
  15. <servlet>
  16. <!-- 当前servlet的参数 -->
  17. <init-param>
  18. <param-name>user2</param-name>
  19. <param-value>admin</param-value>
  20. </init-param>
  21. <init-param>
  22. <param-name>password2</param-name>
  23. <param-value>123456</param-value>
  24. </init-param>
  25.  
  26. <servlet-name>myGenericServletExtends</servlet-name>
  27. <servlet-class>com.dao.chu.MyGenericServletExtends</servlet-class>
  28. </servlet>
  29.  
  30. <servlet-mapping>
  31. <servlet-name>myGenericServletExtends</servlet-name>
  32. <url-pattern>/myGenericServletExtends</url-pattern>
  33. </servlet-mapping>
  34.  
  35. </web-app>

(c) MyGenericServlet

  1. package com.dao.chu;
  2.  
  3. import javax.servlet.Servlet;
  4. import javax.servlet.ServletConfig;
  5. import javax.servlet.ServletException;
  6. import javax.servlet.ServletRequest;
  7. import javax.servlet.ServletResponse;
  8.  
  9. /**
  10. *
  11. * <p>Title: MyGenericServlet</p>
  12. * <p>Description: 自定义MyGenericServlet</p>
  13. */
  14. public abstract class MyGenericServlet implements Servlet{
  15.  
  16. //ServletConfig对象,在init方法执行后赋值
  17. private ServletConfig servletConfig;
  18.  
  19. @Override
  20. public void destroy() {
  21. // TODO Auto-generated method stub
  22.  
  23. }
  24.  
  25. //ServletConfig对象的get方法
  26. @Override
  27. public ServletConfig getServletConfig() {
  28. return servletConfig;
  29. }
  30.  
  31. @Override
  32. public String getServletInfo() {
  33. // TODO Auto-generated method stub
  34. return null;
  35. }
  36.  
  37. @Override
  38. public void init(ServletConfig servletConfig) throws ServletException {
  39.  
  40. System.out.println("init...");
  41. this.servletConfig=servletConfig;
  42.  
  43. }
  44.  
  45. /**
  46. * 抽象方法,必需被子类实现
  47. */
  48. @Override
  49. public abstract void service(ServletRequest servletRequest, ServletResponse servletResponse);
  50.  
  51. }

(d) MyGenericServletExtends

  1. package com.dao.chu;
  2.  
  3. import javax.servlet.ServletRequest;
  4. import javax.servlet.ServletResponse;
  5.  
  6. /**
  7. *
  8. * <p>Title: MyGenericServletExtends</p>
  9. * <p>Description: MyGenericServlet的子类</p>
  10. */
  11. public class MyGenericServletExtends extends MyGenericServlet{
  12.  
  13. @Override
  14. public void service(ServletRequest srvletRequest,
  15. ServletResponse servletResponse) {
  16.  
  17. String user1 = getServletConfig().getServletContext().getInitParameter("user1");
  18. String password1 = getServletConfig().getServletContext().getInitParameter("password1");
  19.  
  20. String user2 = getServletConfig().getInitParameter("user2");
  21. String password2 = getServletConfig().getInitParameter("password2");
  22.  
  23. System.out.println("user1:"+user1);
  24. System.out.println("user2:"+user2);
  25. System.out.println("password1:"+password1);
  26. System.out.println("password2:"+password2);
  27.  
  28. }
  29.  
  30. }

(e) 运行结果:

(f)小结:我们大多的业务操作都在service里面,虽然servlet当中的方法很多,也不需要所有都去实现,我们定义的MyGenericServlet只需让他的子类必需实现service方法就可以,所以MyGenericServlet定义为抽象类,service方法定义为抽象方法。

2.3 和API中一致,加入实现ServletConfig

(a) 目录结构:

(b)web.xml

  1. <?xml version="1.0" encoding="UTF-8"?>
  2. <web-app xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns="http://java.sun.com/xml/ns/javaee" xsi:schemaLocation="http://java.sun.com/xml/ns/javaee http://java.sun.com/xml/ns/javaee/web-app_3_0.xsd" id="WebApp_ID" version="3.0">
  3. <display-name>javaWeb_08</display-name>
  4.  
  5. <!-- 当前web应用的参数 -->
  6. <context-param>
  7. <param-name>user1</param-name>
  8. <param-value>admin</param-value>
  9. </context-param>
  10. <context-param>
  11. <param-name>password1</param-name>
  12. <param-value>123456</param-value>
  13. </context-param>
  14.  
  15. <servlet>
  16. <!-- 当前servlet的参数 -->
  17. <init-param>
  18. <param-name>user2</param-name>
  19. <param-value>admin</param-value>
  20. </init-param>
  21. <init-param>
  22. <param-name>password2</param-name>
  23. <param-value>123456</param-value>
  24. </init-param>
  25.  
  26. <servlet-name>myGenericServletExtends</servlet-name>
  27. <servlet-class>com.dao.chu.MyGenericServletExtends</servlet-class>
  28. </servlet>
  29.  
  30. <servlet-mapping>
  31. <servlet-name>myGenericServletExtends</servlet-name>
  32. <url-pattern>/myGenericServletExtends</url-pattern>
  33. </servlet-mapping>
  34.  
  35. </web-app>

(c) MyGenericServlet

  1. package com.dao.chu;
  2.  
  3. import java.util.Enumeration;
  4.  
  5. import javax.servlet.Servlet;
  6. import javax.servlet.ServletConfig;
  7. import javax.servlet.ServletContext;
  8. import javax.servlet.ServletException;
  9. import javax.servlet.ServletRequest;
  10. import javax.servlet.ServletResponse;
  11.  
  12. /**
  13. *
  14. * <p>Title: MyGenericServlet</p>
  15. * <p>Description: 自定义MyGenericServlet</p>
  16. */
  17. public abstract class MyGenericServlet implements Servlet,ServletConfig{
  18.  
  19. //ServletConfig对象,在init方法执行后赋值
  20. private ServletConfig servletConfig;
  21.  
  22. @Override
  23. public void destroy() {
  24. // TODO Auto-generated method stub
  25.  
  26. }
  27.  
  28. //ServletConfig对象的get方法
  29. @Override
  30. public ServletConfig getServletConfig() {
  31. return servletConfig;
  32. }
  33.  
  34. @Override
  35. public String getServletInfo() {
  36. return null;
  37. }
  38.  
  39. @Override
  40. public void init(ServletConfig servletConfig) throws ServletException {
  41.  
  42. System.out.println("init...");
  43. this.servletConfig=servletConfig;
  44.  
  45. }
  46.  
  47. /**
  48. * 抽象方法,必需被子类实现
  49. */
  50. @Override
  51. public abstract void service(ServletRequest servletRequest, ServletResponse servletResponse);
  52.  
  53. //实现ServletConfig的方法
  54. @Override
  55. public String getServletName() {
  56. return getServletConfig().getServletName();
  57. }
  58.  
  59. @Override
  60. public ServletContext getServletContext() {
  61. return getServletConfig().getServletContext();
  62. }
  63.  
  64. @Override
  65. public String getInitParameter(String paramString) {
  66. return getServletConfig().getInitParameter(paramString);
  67. }
  68.  
  69. @Override
  70. public Enumeration<String> getInitParameterNames() {
  71. return getServletConfig().getInitParameterNames();
  72. }
  73.  
  74. }

(d) MyGenericServletExtends

  1. package com.dao.chu;
  2.  
  3. import javax.servlet.ServletRequest;
  4. import javax.servlet.ServletResponse;
  5.  
  6. /**
  7. *
  8. * <p>Title: MyGenericServletExtends</p>
  9. * <p>Description: MyGenericServlet的子类</p>
  10. */
  11. public class MyGenericServletExtends extends MyGenericServlet{
  12.  
  13. @Override
  14. public void service(ServletRequest srvletRequest,
  15. ServletResponse servletResponse) {
  16.  
  17. String user1 = getServletContext().getInitParameter("user1");
  18. String password1 = getServletContext().getInitParameter("password1");
  19.  
  20. String user2 = getInitParameter("user2");
  21. String password2 = getInitParameter("password2");
  22.  
  23. System.out.println("user1:"+user1);
  24. System.out.println("user2:"+user2);
  25. System.out.println("password1:"+password1);
  26. System.out.println("password2:"+password2);
  27.  
  28. }
  29.  
  30. }

(e) 控制台输出:

(f)小结:我们已经得到了servletConfig对象,又实现了servletConfig的接口,所以可以直接调用里面的方法,代码也变得更加简洁。

三 为了防止子类覆盖MyGenericServlet中init(ServletConfig servletConfig)的方法出现的错误,自定义MyGenericServlet修改如下:

  1. package com.dao.chu;
  2.  
  3. import java.util.Enumeration;
  4.  
  5. import javax.servlet.Servlet;
  6. import javax.servlet.ServletConfig;
  7. import javax.servlet.ServletContext;
  8. import javax.servlet.ServletException;
  9. import javax.servlet.ServletRequest;
  10. import javax.servlet.ServletResponse;
  11.  
  12. /**
  13. *
  14. * <p>
  15. * Title: MyGenericServlet
  16. * </p>
  17. * <p>
  18. * Description: 自定义MyGenericServlet
  19. * </p>
  20. */
  21. public abstract class MyGenericServlet implements Servlet, ServletConfig {
  22.  
  23. // ServletConfig对象,在init方法执行后赋值
  24. private ServletConfig servletConfig;
  25.  
  26. /**
  27. * 实现Servlet的方法
  28. */
  29.  
  30. @Override
  31. public void destroy() {
  32.  
  33. }
  34.  
  35. @Override
  36. public String getServletInfo() {
  37. return "";
  38. }
  39.  
  40. // ServletConfig对象的get方法
  41. @Override
  42. public ServletConfig getServletConfig() {
  43. return servletConfig;
  44. }
  45.  
  46. @Override
  47. public void init(ServletConfig servletConfig) throws ServletException {
  48.  
  49. this.servletConfig = servletConfig;
  50. init();
  51.  
  52. }
  53.  
  54. // 空的init函数,用来给子类继承,防止覆盖init(ServletConfig servletConfig)方法引起的错误
  55. public void init() {
  56.  
  57. }
  58.  
  59. //抽象方法,必需被子类实现
  60. @Override
  61. public abstract void service(ServletRequest servletRequest,
  62. ServletResponse servletResponse);
  63.  
  64. /**
  65. * 实现ServletConfig的方法
  66. */
  67.  
  68. @Override
  69. public String getServletName() {
  70. return getServletConfig().getServletName();
  71. }
  72.  
  73. @Override
  74. public ServletContext getServletContext() {
  75. return getServletConfig().getServletContext();
  76. }
  77.  
  78. @Override
  79. public String getInitParameter(String paramString) {
  80. return getServletConfig().getInitParameter(paramString);
  81. }
  82.  
  83. @Override
  84. public Enumeration<String> getInitParameterNames() {
  85. return getServletConfig().getInitParameterNames();
  86. }
  87.  
  88. }

基本还原API中的一些方法。

附:

本次项目代码:点击打开链接

javaWEB总结(8):自定义GenericServlet的更多相关文章

  1. 编写自定义GenericServlet

    用途: 编写自定义GenericServlet类后,子类只需继承这个类,就可以直接使用ServletConfig的config对象和ServletConfig接口的方法,而不需要init()方法获取c ...

  2. 超全面的JavaWeb笔记day09<Servlet&GenericServlet&HttpServlet&ServletContext>

    1.Servlet概述 2.Servlet接口 3.GenericServlet 4.HttpServlet 5.Servlet细节 6.ServletContext(重要) Servlet概述 生命 ...

  3. javaweb学习6——自定义标签

    声明:本文只是自学过程中,记录自己不会的知识点的摘要,如果想详细学习JavaWeb,请到孤傲苍狼博客学习,JavaWeb学习点此跳转 本文链接:https://www.cnblogs.com/xdp- ...

  4. javaweb之EL自定义函数

    1.什么是EL自定义函数 EL自定义函数是在EL表达式中调用的某个java类的静态方法,这个静态方法需在web应用程序中进行配置才可以被EL表达式调用.EL自定义函数可以扩展EL表达式的功能,让EL表 ...

  5. javaWEB总结(9):自定义HttpServlet

    前言:我们知道 MyHttpServlet是MyGenericServlet的子类,MyHttpServlet会继承父类的方法,可是却很少去追问MyHttpServlet中的doGet方法和doPos ...

  6. JavaWeb基础—JSP自定义标签入门

    自定义标签的作用:替换JSP页面的java代码 步骤:1.标签处理类(标签是一个对象,那也就需要先有类) 2.tld文件 它是一个xml(可以向c标签里借),一般放到WEB-INF下,不让客户端浏览器 ...

  7. javaWeb项目配置自定义404错误页

        1.情景展示 为了隐藏tomcat版本信息以及显示更友好的错误信息提示,如何将404的错误跳转到指定页面? 2.解决方案 第一步:修改项目的web.xml 将如下代码添加到</web-a ...

  8. javaweb回顾第八篇如何创建自定义标签

    前言:在javaweb开发中自定义标签的用处还是挺多的.今天和大家一起看自定义标签是如何实现的. 1:什么是标签 标签是一种XML元素,通过标签可以使JSP页面变得简介易用,而且标签具有很好的复用性. ...

  9. EL表达式 EL函数 自定义el函数 《黑马程序员_超全面的JavaWeb视频教程vedio》

    \JavaWeb视频教程_day12_自定义标签JSTL标签库,java web之设计模式\day12_avi\12.EL入门.avi; EL表达式 1. EL是JSP内置的表达式语言! * jsp2 ...

随机推荐

  1. Cocos2d-x 3.x事件分发机制总结

    在2.x中处理事件需要用到委托代理(delegate),相信学过2.x的触摸事件的同学,都知道创建和移除的流程十分繁琐.而在3.x中由于加入了C++11的特性,而对事件的分发机制通过事件分发器Even ...

  2. jQuery 之玩转 checkbox

    <!DOCTYPE html> <html> <head> <title></title> <meta charset="u ...

  3. [coding horror] 1 - sum 2

    sum 2 描述 输入一个递增排序的数组和一个数字S,在数组中查找两个数,是的他们的和正好是S,如果有多对数字的和等于S,输出两个数的乘积最小的. 对应每个测试案例,输出两个数,小的先输出. codi ...

  4. U31网管配置

    1.新建网元和子架配置: 在拓扑图空白处新建对象-创建承载传输网元-选择设备-填写网元名称(A).网元类型.IP(查询出SNP的),网关IP会自动在此基础上加2.如果数据库为空先选离线- 机架子架配置 ...

  5. 敏捷开发(七)- SCRUM评估会议

    本文主要是为了检测你对SCRUM 评估会议的了解和使用程度, 通过本文你可以检测一下     1.你们的SCRUM 评估会议的过程和步骤    2.SCRUM 评估的输出结果一.会议目的      1 ...

  6. CodeForces 712D Memory and Scores

    $dp$,前缀和. 记$dp[i][j]$表示$i$轮结束之后,两人差值为$j$的方案数. 转移很容易想到,但是转移的复杂度是$O(2*k)$的,需要优化,观察一下可以发现可以用过前缀和来优化. 我把 ...

  7. [SQL基础教程] 3-4 对查询结果进行排序/ORDER BY

    [SQL基础教程] 3-4 对查询结果进行排序/ORDER BY ORDER BY SELECT <列名1>,<列名2>,<列名2>... FROM ORDER B ...

  8. [Q]升级/重新获取授权步骤

    若因需要升级或授权文件失效(重装系统或其他原因),在服务期内可通过下面的步骤操作. 注:168元版提供2年升级及售后支持,118元版的提供1升级及售后支持. 步骤如下: 1. 重新获取CAD批量打图精 ...

  9. Gentoo网络管理方法总结

    OpenRC/netifrc Netifrc is a collection of modules created to configure and manage network interfaces ...

  10. spring 四种依赖注入方式以及注解注入方式

    平常的java开发中,程序员在某个类中需要依赖其它类的方法,则通常是new一个依赖类再调用类实例的方法,这种开发存在的问题是new的类实例不好统一管理,spring提出了依赖注入的思想,即依赖类不由程 ...