当前位置:网站首页>Servlet三种实现方式
Servlet三种实现方式
2022-07-29 01:52:00 【枸杞泡茶*】
文章目录
前言
Servlet是JavaWeb的 三大组件之一 ,它属于动态资源。Servlet的作用是处理请求,服务器会把接收到的请求交给Servlet来处理,在Servlet中通常需要:
接收请求数据;
处理请求;
完成响应。
例如客户端发出登录请求,或者输出注册请求,这些请求都应该由Servlet来完成处理!Servlet需要我们自己来编写,每个Servlet必须实现javax.servlet.Servlet接口。
提示:以下是本篇文章正文内容,下面案例可供参考
一、Servlet生命周期
Servlet默认创建的时间: 在第一次请求的时候创建 第一次惩罚
init():服务器启动时执行
service : 服务方法,更新开启服务器都会执行。
destroy: 摧毁方法,仅在服务器正常关闭时执行一次 。
getServletConfig():获取servlet的配置信息。
getServletInfo():获取servlet的一些基本信息,比如作者,版权等等
- 注意:内存中只存在一个servlet对象,但它可被多个类引用,存在安全问题,所以尽量不要在它的方法中定义成员变量。
二、实现Servlet三种方式?
实现Servlet有三种方式:
实现javax.servlet.Servlet接口;
继承javax.servlet.GenericServlet类;
继承javax.servlet.http.HttpServlet类;
通常我们会去继承HttpServlet类来完成我们的Servlet,但学习Servlet还要从javax.servlet.Servlet接口开始学习。
public interface Servlet {
public void init(ServletConfig config) throws ServletException;
public ServletConfig getServletConfig();
public void service(ServletRequest req, ServletResponse res) throws ServletException, IOException;
public String getServletInfo();
public void destroy();
}
三、GenericServlet
概述:GenericServlet是Servlet接口的实现类,我们可以通过继承GenericServlet来编写自己的Servlet。下面是GenericServlet类的源代码:
public abstract class GenericServlet implements Servlet, ServletConfig, java.io.Serializable {
private static final long serialVersionUID = 1L;
private transient ServletConfig config;
public GenericServlet() {
}
@Override
public void destroy() {
}
@Override
public String getInitParameter(String name) {
return getServletConfig().getInitParameter(name);
}
@Override
public Enumeration<String> getInitParameterNames() {
return getServletConfig().getInitParameterNames();
}
@Override
public ServletConfig getServletConfig() {
return config;
}
@Override
public ServletContext getServletContext() {
return getServletConfig().getServletContext();
}
@Override
public String getServletInfo() {
return "";
}
@Override
public void init(ServletConfig config) throws ServletException {
this.config = config;
this.init();
}
public void init()throws ServletException {
}
public void log(String msg) {
getServletContext().log(getServletName() + ": " + msg);
}
public void log(String message, Throwable t) {
getServletContext().log(getServletName() + ": " + message, t);
}
@Override
public abstract void service(ServletRequest req, ServletResponse res) throws ServletException, IOException;
@Override
public String getServletName() {
return config.getServletName();
}
}
实现了Servlet的init(ServletConfig)方法,把参数config赋给了本类的成员config,然后再调用本类自己的无参的init()方法。
init()这个方法是GenericServlet自己的方法,而不是从Servlet继承下来的。当我们自定义Servlet时,如果想完成初始化作用就不要再重复init(ServletConfig)方法了,而是应该去重写init()方法。因为在GenericServlet中的init(ServletConfig)方法中保存了ServletConfig对象,如果覆盖了保存ServletConfig的代码,那么就不能再使用ServletConfig了。在GenericServlet中,定义了一个ServletConfig config实例变量,并在init(ServletConfig)方法中把参数ServletConfig赋给了实例变量。然后在该类的很多方法中使用了实例变量config。
3.1GenericServlet中的init()
- 如果子类覆盖了GenericServlet的init(StringConfig)方法,那么this.config=config这一条语句就会被覆盖了,也就是说GenericServlet的实例变量config的值为null,那么所有依赖config的方法都不能使用了。如果真的希望完成一些初始化操作,那么去覆盖GenericServlet提供的init()方法,它是没有参数的init()方法,它会在init(ServletConfig)方法中被调用。
3.2实现了ServletConfig接口
- GenericServlet还实现了ServletConfig接口,所以可以直接调用getInitParameter()、getServletContext()等ServletConfig的方法。
2.3.3 实现了ServletConfig接口
四、HttpServlet
概述:HttpServlet类是GenericServlet的子类,它提供了对HTTP请求的特殊支持,所以通常我们都会通过继承HttpServlet来完成自定义的Servlet。
4.1
HttpServlet类中提供了service(HttpServletRequest,HttpServletResponse)方法,这个方法是HttpServlet自己的方法,不是从Servlet继承来的。在HttpServlet的service(ServletRequest,ServletResponse)方法中会把ServletRequest和ServletResponse强转成HttpServletRequest和HttpServletResponse,然后调用service(HttpServletRequest,HttpServletResponse)方法,这说明子类可以去覆盖service(HttpServletRequest,HttpServletResponse)方法即可,这就不用自己去强转请求和响应对象了。
其实子类也不用去覆盖service(HttpServletRequest,HttpServletResponse)方法,因为HttpServlet还要做另一步简化操作,下面会介绍。
4.2实现代码
public abstract class HttpServlet extends GenericServlet {
protected void service(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
//...代码省略
}
@Override
public void service(ServletRequest req, ServletResponse res) throws ServletException, IOException {
HttpServletRequest request;
HttpServletResponse response;
try{
//强转
request = (HttpServletRequest) req;
response = (HttpServletResponse) res;
}catch(ClassCastException e) {
throw new ServletException("non-HTTP request or response");
}
//调用service(HttpServletRequest,HttpServletResponse)方法
service(request, response);
}
//其他方法省略……
}
4.3 doGet()和doPost()
在HttpServlet的service(HttpServletRequest,HttpServletResponse)方法会去判断当前请求是GET还是POST,如果是GET请求,那么会去调用本类的doGet()方法,如果是POST请求会去调用doPost()方法,这说明我们在子类中去覆盖doGet()或doPost()方法即可。
public class AServlet extends HttpServlet {
public void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
System.out.println("hello doGet()...");
}
}
public class BServlet extends HttpServlet {
public void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
System.out.println("hello doPost()...");
}
}
边栏推荐
- Summarize in the middle of the year | talk to yourself, live in the present, and count every step
- [upload picture 2-cropable]
- 响应式织梦模板家装建材类网站
- [golang learning notes 2.2] map, structure and interface
- ES6 event binding (v-on usage)
- 【golang学习笔记2.2】 Map、结构体和接口
- Jmeter之BeanShell生成MD5加密数据写入数据库
- Work queue_ queue
- fopen、_ Wfopen reads Unicode encoded files
- Explain the four asynchronous solutions of JS in detail: callback function, promise, generator, async/await
猜你喜欢

当我看源码的时候,我在想什么?

Esbuild Bundler HMR

The outsourcing company "mixed" for two years, and I only did five things seriously. Now I get byte offer smoothly.

发布融资需求1.29亿元,大科城项目路演持续浇灌科创“好苗子”

Explain asynchronous tasks in detail: task status and lifecycle management

Control buzzer based on C51
[email protected] The localization rate reaches 100%"/>Quanzhi t3/a40i industrial core board, 4-core [email protected] The localization rate reaches 100%

Interprocess communication - detailed explanation of the pipeline (explanation of graphic cases)

The problem of modifying the coordinate system of point cloud image loaded by ndtmatching function in autoware

第3章业务功能开发(线索备注的删除和修改)
随机推荐
Day 15 (VLAN related knowledge)
JVM memory overflow online analysis dump file and online analysis open.Hprof file to get JVM operation report how jvisualvm online analysis
Control buzzer based on C51
STM32 DMA receives serial port data
即时通讯场景下安全合规的实践和经验
一文搞懂 Redis 架构演化之路
3D模型格式全解|含RVT、3DS、DWG、FBX、IFC、OSGB、OBJ等70余种
防止重复点击
Jmeter之BeanShell生成MD5加密数据写入数据库
6年测试经验,教大家测试~如何把控项目
MySQL之数据查询(多表查询)
What is scope and scope chain
Meeting notice of meeting OA
Kubesphere-多节点安装
NPM install reports an error: eperm: operation not permitted, rename
指针——黄金阶段
fopen、_ Wfopen reads Unicode encoded files
Navigation -- realize data transmission and data sharing between fragments
高效使用浏览器的5个小技巧,第1个技巧最实用
Excel 打开包含汉字的 csv 文件出现乱码该怎么办?