编写自定义GenericServlet
用途:
编写自定义GenericServlet类后,子类只需继承这个类,就可以直接使用ServletConfig的config对象和ServletConfig接口的方法,而不需要init()方法获取config对象,也不需要通过config对象调用ServletConfig接口的方法,直接通过方法名()就可以调用
具体步骤如下:
1、新建类MyGenericServlet,实现Servlet,ServletConfig接口
2、重写父类的相关方法
3、将service()方法定义为抽象(abstract)方法,将类定义为抽象类,以便在子类予以service()方法新的实现
4、定义MyGenericServlet的成员变量protected ServletConfig config,并通过初始化方法init(ServletConfig config)赋值this.config=config;
5、重载init()的无参方法,当子类需要在初始化时执行某些操作时调用,并通过init(ServletConfig config)方法调用init()无参方法
具体代码如下:
1 public abstract class MyGenericServlet implements Servlet,ServletConfig { 2 3 protected ServletConfig config; //定义成员变量 4 @Override 5 public void init(ServletConfig config) throws ServletException { 6 this.config=config; //config赋值 7 init(); 8 } 9 10 public void init(){ //为了子类重写,创建无参方法init() 11 12 } 13 14 @Override 15 public ServletConfig getServletConfig() { 16 return config; //返回config 17 } 18 19 @Override 20 public abstract void service(ServletRequest req, ServletResponse res) 21 throws ServletException, IOException ; //抽象方法 22 23 @Override 24 public String getServletInfo() { 25 return null; 26 } 27 28 @Override 29 public void destroy() { 30 31 } 32 33 @Override 34 public String getServletName() { 35 return config.getServletName(); //返回config.getServletName()的结果,子类直接调用该方法相当于调用config.getServletName() 36 } 37 38 @Override 39 public ServletContext getServletContext() { 40 return config.getServletContext(); 41 } 42 43 @Override 44 public String getInitParameter(String name) { 45 return config.getInitParameter(name); 46 } 47 48 @Override 49 public Enumeration<String> getInitParameterNames() { 50 return config.getInitParameterNames(); 51 } 52 }
子类只需继承GenericServlet类,就可以通过方法名直接调用方法
1 public class MyServlet1 extends MyGenericServlet { 2 3 @Override 4 public void service(ServletRequest req, ServletResponse res) 5 throws ServletException, IOException { 6 String name = getServletName(); //直接调用,不需要config.getServletName() 7 System.out.println(name); 8 } 9 10 }