Generic-汉语意思:类的adj

GenericServlet是一个抽象类,它的源码很容易看懂,继承Servlet接口和ServletConfig接口

所有它里面有父接口里面的方法,所以它就是在Servlet的基础上把一些功能给封装起来了(省的我们手写了)。把ServletConfig给保存下来,以便使用它可以获得其他值。

它里面有这些方法(部分)

void  destroy()

String  getInitParameter(string name)

Enumeration  getInitParameterNames()

ServletConfig  getServletConfig()

ServletContext  getServletContext()

...

 

模拟GenericServlet抽象类

 package one.servlet;

 import java.io.IOException;

 import javax.servlet.Servlet;
import javax.servlet.ServletConfig;
import javax.servlet.ServletContext;
import javax.servlet.ServletException;
import javax.servlet.ServletRequest;
import javax.servlet.ServletResponse; //模拟GenericServlet类
public class BServlet implements Servlet{
private ServletConfig config;//一个成员 @Override
public void destroy() {
System.out.println("啊,我要死了!");
}
//这个方法一定会在init()方法之后被调用!
//init()被调用后,本类的成员this.config已经有值了!
@Override
public ServletConfig getServletConfig() {
return this.config;
}
//没有用的东西
@Override
public String getServletInfo() {
return "用字符串简单描述Servlet";
}
/*
* 由Tomcat来调用,并且调用一次
* 它是这些方法中第一个被调用的,它会在构造器之后马上被调用(先创建对象,再调用方法)!
* */
@Override
public void init(ServletConfig config) throws ServletException {
//把Tomcat传递的ServletConfig赋值给本类的一个成员,其实就是把它保存起来,方便在其他地方用
this.config=config;
} @Override
public void service(ServletRequest req, ServletResponse res)
throws ServletException, IOException {
System.out.println("每次处理请求都会被调用!");
} public ServletContext getServletContext(){
return config.getServletContext();
} public String getInitParameter(String name){
return config.getInitParameter(name);
}
//等等方法都可以模拟GenericServlet里的方法
}

其他Servlet可以继承上述的模拟GenericServlet(也就是继承BServlet),但是如果重写init()方法,就会覆盖父类中的this.config=config;然后该类中的部分其他方法将不能使用。

解决方案:

父类BServlet

 @Override
public void init(ServletConfig config) throws ServletException {
//把Tomcat传递的ServletConfig赋值给本类的一个成员,其实就是把它保存起来,方便在其他地方用
this.config=config;
init();
}
//本类定义的方法,不是Servlet接口中的方法。
public void init(){ }

子类CServlet

 package one.servlet;

 public class CServlet extends BServlet{

     //服务器不会调用这个方法,但是会调用父类有参的init方法,然后再去掉用父类的init无参的方法
@Override
public void init() {
System.out.println("子类的CServlet重载之后的方法");
}
}

从而在请求CServlet的时候,就会执行重写过后init方法中的代码。

也就是子类继承了父类有参的init()方法,服务器调用有参的之后,然后再去调用init();这个调用

总结:解决了数据库所给的config的保存问题,以及子类重写init()方法后的问题。这就是GenericServlet的原理。

使用GenericServlet

DServlet.java

 package one.servlet;

 import java.io.IOException;

 import javax.servlet.GenericServlet;
import javax.servlet.ServletException;
import javax.servlet.ServletRequest;
import javax.servlet.ServletResponse; public class DServlet extends GenericServlet {
//要想在出生时笑一笑,覆盖无参的init() @Override
public void init() throws ServletException {
System.out.println("哈哈,我出生了!");
} @Override
public void service(ServletRequest arg0, ServletResponse arg1)
throws ServletException, IOException {
System.out.println("hello world!");
} //死的時候留遺言
@Override
public void destroy() {
System.out.println("我走了");
}
}

web.xml配置

//部分配置
<servlet>
<servlet-name>xx</servlet-name>
<servlet-class>one.servlet.DServlet</servlet-class>
</servlet>
<servlet-mapping>
<servlet-name>xx</servlet-name>
<url-pattern>/DServlet</url-pattern>
</servlet-mapping>  

请求DServlet--http://localhost:8080/XJS_Servlet1/DServlet

哈哈,我出生了!
hello world!

  

05-11 11:17