GenericServlet抽象类:
这个抽象类其实是一种扩展类,与Servlet接口没有很大区别,但是又有所不同。
API:
https://docs.oracle.com/javaee/5/api/
public abstract class GenericServlet
extends java.lang.Object
implements Servlet, ServletConfig, java.io.Serializable
模拟GenericServlet抽象类:
新建一个BServlet类并实现Servlet接口:
package cn.mlcd.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
*
* @author CDU_LM
*
*/
public class BServlet implements Servlet {
private ServletConfig config;
private int userNumber;
@Override
public void destroy() {
System.out.print("即将死亡。。。");
}
/**
* 这个方法必定会在init()方法之后被调用,那么config必定已经被赋值,不为空
*/
@Override
public ServletConfig getServletConfig() {
return this.config;
}
// 重载一个无参的init()方法提供给子类使用,避免使用原始init()方法导致config为空
public void init() {}
/**
* 没啥用的方法,返回的是一个字符串,对本Servlet的一段描述
*/
@Override
public String getServletInfo() {
return "这是BServlet";
}
/**
* 由服务器调用,第一个被调用并只调用一次
*/
@Override
public void init(ServletConfig config) throws ServletException {
// 把服务器传递的ServletConfig赋值给本类的一个ServletConfig对象,就是将其存储起来方便其它方法使用
this.config = config;
}
@Override
public void service(ServletRequest req, ServletResponse res) throws ServletException, IOException {
userNumber = 0;
System.out.print("第" + (userNumber + 1) + "次被调用!");
userNumber++;
}
public ServletContext getServletContext() {
return this.config.getServletContext();
}
public String getServletName() {
return this.config.getServletName();
}
}
再新建一个CServlet类继承BServlet:
package cn.mlcd.servlet;
import java.io.IOException;
import javax.servlet.ServletException;
import javax.servlet.ServletRequest;
import javax.servlet.ServletResponse;
public class CServlet extends BServlet {
/**
* 使用重载的无参init()方法避免使用原本的方法导致config为空
*/
@Override
public void init() {
System.out.print("CServlet 出生!!");
}
@Override
public void service(ServletRequest req, ServletResponse res) throws ServletException, IOException {
System.out.print(getServletName());
}
}
上面主要是理解GenericServlet接口的内部实现原理,比如自定义config,重载无参的init()等;
下面就创建一个类继承GenericServlet抽象类并重写其中的方法:
package cn.mlcd.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 {
@Override
public void init() throws ServletException {
System.out.print("来了!!");
super.init();
}
@Override
public void service(ServletRequest arg0, ServletResponse arg1) throws ServletException, IOException {
System.out.print("Hi!DServlet!");
}
@Override
public void destroy() {
System.out.print("死了!");
}
}
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 分享4款.NET开源、免费、实用的商城系统
· 全程不用写代码,我用AI程序员写了一个飞机大战
· MongoDB 8.0这个新功能碉堡了,比商业数据库还牛
· 白话解读 Dapr 1.15:你的「微服务管家」又秀新绝活了
· 上周热点回顾(2.24-3.2)