前面我们介绍了Servlet的运行过程和生命周期以及生命周期内的三个方法,我们实现这个过程都是通过实现Servlet接口来做的。其实在Servlet中,一共有三个方法来实现创建Servlet类。这篇来介绍第二个方法,是通过继承GenericServlet类,这种方式也叫适配器模式。
1.查询GenericServlet类API文档
一开始描述内容太多,看不懂没关系,这里提到HttpServlet是我们说的第三个创建Servlet类的方法,后面来学习。由于HttpServlet是继承了GenericServlet类,所以本篇我们先学习GenericServlet类以及这个类下常用的几个方法。
常用方法
红圈这几个方法是我们前面学习过的生命周期内的方法,其中我们需要重写Service()方法,当我们自定义Servlet类继承GenericServlet类。上面蓝色圈内init()方法是GenericServlet类本身重写的一个方法,不带参数,下面带参数的是接口Servlet的方法。
2.写一个继承GenericServlet类的demo
2.1 创建一个Java类继承GenericServlet类, 重写service方法
package com.anthony.servlet;
import java.io.IOException;
import javax.servlet.GenericServlet;
import javax.servlet.ServletException;
import javax.servlet.ServletRequest;
import javax.servlet.ServletResponse;
public class ServletDemo2 extends GenericServlet {
@Override
public void service(ServletRequest arg0, ServletResponse arg1) throws ServletException, IOException {
System.out.println("ServletDemo2 run serice method.");
}
}
使用这个继承类,我们这里只需要重写service这个方法就行。
2.2 修改web.xml 添加servlet 映射
<?xml version="1.0" encoding="UTF-8"?>
<web-app xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns="http://xmlns.jcp.org/xml/ns/javaee" xsi:schemaLocation="http://xmlns.jcp.org/xml/ns/javaee http://xmlns.jcp.org/xml/ns/javaee/web-app_3_1.xsd" id="WebApp_ID" version="3.1">
<servlet>
<servlet-name>servletDemo1</servlet-name>
<servlet-class>com.anthony.servlet.ServletDemo1</servlet-class>
<load-on-startup>2</load-on-startup>
</servlet>
<servlet-mapping>
<servlet-name>servletDemo1</servlet-name>
<url-pattern>/demo</url-pattern>
</servlet-mapping>
<servlet>
<servlet-name>servletDemo2</servlet-name>
<servlet-class>com.anthony.servlet.ServletDemo2</servlet-class>
</servlet>
<servlet-mapping>
<servlet-name>servletDemo2</servlet-name>
<url-pattern>/demo2</url-pattern>
</servlet-mapping>
<welcome-file-list>
<welcome-file>index.html</welcome-file>
<welcome-file>index.htm</welcome-file>
<welcome-file>index.jsp</welcome-file>
<welcome-file>default.html</welcome-file>
<welcome-file>default.htm</welcome-file>
<welcome-file>default.jsp</welcome-file>
</welcome-file-list>
</web-app>
这里添加一个Servlet的映射到/demo2,然后部署到tomcat,浏览器输入http://localhost:8080/Servlet01/demo2
Eclipse上控制台应该打印出来这句话“ServletDemo2 run serice method.”,这个servie方法只要刷新一次浏览器就会执行一次service方法。
3.适配器模式源码
如果想在Eclipse中看到GenericServlet类的源码,我们需要tomcat官网下载一个源码zip包,例如apache-tomcat-8.5.40-src.zip,然后添加到Eclipse上,就可以看源码了。我们找到GenericServlet类实现servlet接口这块的代码
public abstract class GenericServlet implements Servlet, ServletConfig,
java.io.Serializable {
private static final long serialVersionUID = 1L;
private transient ServletConfig config;
我们只看上面几行代码,GenericServlet实现了三个接口,我们这里主要来看Servlet和ServletVConfig这两个。打开Eclipse中关于GenericServlet类的outline窗口,看看这些方法。
上面这些方法,带三角符号就是继承过来的方法,剔除我们熟悉的几个Servlet接口中五个方法,剩下的就是实现ServletVConfig相关的方法。所以GenericServlet实现了两个接口的方法,你需要那个接口的方法就用那个,这个机制就是适配器模式,这就是适配器模式的优点。