JavaWeb系列教程
JavaWeb—Servlet
模拟Servlet本质
使用IDEA开发Servlet程序
Servlet对象的生命周期
适配器(GenericServlet)改造Servlet
ServletConfig
Servlet–ServletContext
HttpServlet源码分析
web站点欢迎页
一篇学会HttpServletRequest
如果大家觉得有帮助的话,不妨动动小手,点赞收藏一波,也方便后面的复习哈

我们发现在编写一个Servlet类的时候,要实现它的所有方法,但是事实上,我们一般只是使用service方法,这样就会让代码看着很丑陋,那么我们要怎么解决呢?
我们在说解决问题之前,先来看看这样的一个例子

适配器设计模式Adapter

  • 手机直接插到220V的电压上,手机直接就报废了。怎么办?可以找一个充电器。这个充电器就是一个适配器。手机连接适配器。适配器连接220V的电压。这样问题就解决了。
    同样的道理,我们也可以使用这样的思想,来解决这个问题
  • 编写一个GenericServlet类,这个类是一个抽象类,其中有一个抽象方法service。

    GenericServlet实现Servlet接口。
    GenericServlet是一个适配器。
    以后编写的所有Servlet类继承GenericServlet,重写service方法即可。

package com.bjpowernode.servlet;import jakarta.servlet.*;import java.io.IOException;
import java.io.PrintWriter;/*** @author zengyihong* @create 2022--03--06 20:08*/
public class AServlet extends GenericServlet {@Overridepublic void service(ServletRequest request, ServletResponse response) throws ServletException, IOException {response.setContentType("text/html");PrintWriter out = response.getWriter();//获取ServletContext对象ServletConfig config = this.getServletConfig();ServletContext context = config.getServletContext();out.print(context);}
}

思考:GenericServlet类是否需要改造一下?怎么改造?更利于子类程序的编写?

  • 思考第一个问题:我们提供了一个GenericServlet之后,init方法还会执行吗?

    • 还会执行。会执行GenericServlet类中的init方法。
    • 很明显,子类中如果这个方法,它就会去父类找相应的方法
  • 思考第二个问题:init方法是谁调用的?

    • Tomcat服务器调用的。
  • 思考第三个问题:init方法中的ServletConfig对象是谁创建的?是谁传过来的?

    • 都是Tomcat干的。
    • Tomcat服务器先创建了ServletConfig对象,然后调用init方法,将ServletConfig对象传给了init方法。
    • 如果对上面几个问题不大理解的话,大家可以先去看看servlet的生命周期
  • 思考一下Tomcat服务器伪代码:

public class Tomcat {public static void main(String[] args){// .....// Tomcat服务器伪代码// 创建LoginServlet对象(通过反射机制,调用无参数构造方法来实例化LoginServlet对象)Class clazz = Class.forName("com.bjpowernode.javaweb.servlet.LoginServlet");Object obj = clazz.newInstance();// 向下转型Servlet servlet = (Servlet)obj;// 创建ServletConfig对象// Tomcat服务器负责将ServletConfig对象实例化出来。// 多态(Tomcat服务器完全实现了Servlet规范)ServletConfig servletConfig = new org.apache.catalina.core.StandardWrapperFacade();// 调用Servlet的init方法servlet.init(servletConfig);// 调用Servlet的service方法// ....}
}

但是ServletConfig对象以后肯定是要在service方法中使用的,那么怎么才可以保证ServletConfig对象在service方法中能够使用呢? 我们很容易就想到了成员变量

init方法中的ServletConfig对是Tomcat服务器创建好的

  • 这个ServletConfig对象目前在init方法的参数上,属于局部变量
  • 那么怎么才能使用呢?------成员变量
  • ServletConfig对象将来肯定是要用在service方法的,怎么保证ServletConfig对象在service方法中调用呢-----调用getServletConfig()方法

思考一下,还有一种可能,需要子类重写父类的init方法,但是这样就会导致父类的init方法不执行,那么ServletConfig对象就是null了,那么将来就会有很大的麻烦,我们就不要让这个方法被子类重写,可以在方法加上final修饰,但是如果子类就是想要重写呢? 但是这个时候子类没有办法重写,那到底要怎么办呢
解决办法:再GenericServlet类中添加一个无参的init方法,供子类进行重写。

上面那个过程都是我们自己一步一步根据需求推出来的,是不是感觉好麻烦,一会这样,一会那样的,不过好消息是,GenericServlet这个类不需要我们写,官方已经提供好了,而且官方写的代码考虑的肯定比我们周全

//
// Source code recreated from a .class file by IntelliJ IDEA
// (powered by FernFlower decompiler)
//package jakarta.servlet;import java.io.IOException;
import java.io.Serializable;
import java.util.Enumeration;public abstract class GenericServlet implements Servlet, ServletConfig, Serializable {private static final long serialVersionUID = 1L;private transient ServletConfig config;public GenericServlet() {}public void destroy() {}public String getInitParameter(String name) {return this.getServletConfig().getInitParameter(name);}public Enumeration<String> getInitParameterNames() {return this.getServletConfig().getInitParameterNames();}public ServletConfig getServletConfig() {return this.config;}public ServletContext getServletContext() {return this.getServletConfig().getServletContext();}public String getServletInfo() {return "";}public void init(ServletConfig config) throws ServletException {this.config = config;this.init();}public void init() throws ServletException {}public void log(String message) {this.getServletContext().log(this.getServletName() + ": " + message);}public void log(String message, Throwable t) {this.getServletContext().log(this.getServletName() + ": " + message, t);}public abstract void service(ServletRequest var1, ServletResponse var2) throws ServletException, IOException;public String getServletName() {return this.config.getServletName();}
}

大家看到我们所写和官网提供的思路其实是大同小异的。

希望得到大家的支持

适配器(GenericServlet)改造Servlet相关推荐

  1. 适配器改造Servlet并优化

    适配器改造Servlet并优化 为什么要用适配器改造并Servlet: 先看一下默认实现Servlet接口的代码: package com.example.Java_Servlet;import ja ...

  2. 关于 HttpServlet、GenericServlet 和 Servlet 的关系

    对于一个 Servlet 类,我们日常最常用的方法是继承自 HttpServlet 类,提供了 Http 相关的方法,HttpServlet 扩展了 GenericServlet 类,而 Generi ...

  3. 使用IDEA开发Servlet程序

    JavaWeb系列教程,持续更新 JavaWeb-Servlet 模拟Servlet本质 使用IDEA开发Servlet程序 Servlet对象的生命周期 适配器(GenericServlet)改造S ...

  4. 模拟Servlet本质

    JavaWeb系列教程,持续更新 JavaWeb-Servlet 模拟Servlet本质 使用IDEA开发Servlet程序 Servlet对象的生命周期 适配器(GenericServlet)改造S ...

  5. web站点的欢迎页面

    JavaWeb系列教程 JavaWeb-Servlet 模拟Servlet本质 使用IDEA开发Servlet程序 Servlet对象的生命周期 适配器(GenericServlet)改造Servle ...

  6. 一篇学会HttpServletRequest

    前言 JavaWeb系列教程 JavaWeb-Servlet 模拟Servlet本质 使用IDEA开发Servlet程序 Servlet对象的生命周期 适配器(GenericServlet)改造Ser ...

  7. Servlet----ServletContext

    在正式讲解之前,先让大家有一个整体印象. 之前讲过ServletConfig,我发现他们有两个共同的方法,我对他们的区别做了小小的总结 JavaWeb系列的其他教程,持续更新中 JavaWeb系列教程 ...

  8. Servlet入门篇(GenericServlet 类 - HttpServlet 类 -ServletConfig 接口 - HttpServletRequest 接口……)

    1.Servlet 简介 Servlet 对请求的处理和响应过程可分为以下几个步骤: (1)客户端发送请求至服务器端: (2)服务器将请求信息发送至 Servlet : (3)Servlet 生成响应 ...

  9. 【JavaWeb】Servlet系列——响应HTML代码、Servlet连接数据库、IDEA开发Servlet程序、Servlet对象的生命周期、GenericServelet适配器模式

    文章目录 10 向浏览器响应一段HTML代码 11 在Servlet中连接数据库,怎么做? 12 在集成开发环境当中开发Servlet程序 12.1 集成开发工具很多,其中目前使用比较多的是: 12. ...

最新文章

  1. (转)C# Delegate.Invoke、Delegate.BeginInvoke
  2. laravel的一个简单文件博客项目katana的使用
  3. Caffe 学习笔记1
  4. CTR模型越来越深,如何让它变轻?
  5. php手册中点击下载的功能,PHP实现文件下载功能
  6. 什么是SQL Server GETDATE()函数?
  7. java pgp加密_GPG(pgp)加解密中文完整教程
  8. 2018最新电大网考计算机,2018年最新电大网考计算机应用基础统考试题.doc
  9. 制定自己的SMART目标
  10. 基于java的房地产客户管理系统
  11. JavaStudyNotes
  12. win7(32位)旗舰版共享HP1010打印机给WINXP专业版
  13. 计算机单位-字节到底是什么?(小白简单易懂)
  14. POI - 读取Excel2003、Excel2007的兼容性问题
  15. html 组合快捷键,ctrl常用组合键有哪些
  16. 偷得浮生半日闲:手写数字的识别
  17. 图像处理——简单浮雕效果和倒影效果实战
  18. oneplus 驱动_450美元的旗舰旗舰产品OnePlus Nord动手实践
  19. Process on绘制er图、扩大界面
  20. Linux命令之计算器bc

热门文章

  1. Kubernetes 中 设置pod不部署在同一台节点上
  2. 2022-2028年中国康复辅具行业市场研究及前瞻分析报告
  3. java发送简单邮件_Java程序实现发送简单文本邮件
  4. 2022-2028年中国钽酸锂单晶行业市场调查分析及投资发展潜力报告
  5. OpenCV 笔记(01)— OpenCV 概念、整体架构、各模块主要功能
  6. pytorch版的bilstm+crf实现sequence label
  7. UTF-8与UTF-8 BOM
  8. LeetCode简单题之递增顺序搜索树
  9. 如何将算子添加到Relay
  10. 关于TVM的点滴记录