适配器模式改造Servlet(GenericServlet),阿里P8架构师的Java大厂面试题总结

  • 编写一个GenericServlet类,这个类是一个抽象类,其中有一个抽象方法service。

  • GenericServlet实现Servlet接口。

  • GenericServlet是一个适配器。

  • 以后编写的所有Servlet类继承GenericServlet,重写service方法即可。

import javax.servlet.*;

import java.io.IOException;

public abstract class GenericServlet implements Servlet {

@Override

public void init(ServletConfig servletConfig) throws ServletException {

}

@Override

public ServletConfig getServletConfig() {

return null;

}

// service设为抽象方法,留给子类去实现。

@Override

public abstract void service(ServletRequest servletRequest, ServletResponse servletResponse)

throws ServletException, IOException;

@Override

public String getServletInfo() {

return null;

}

@Override

public void destroy() {

}

}

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

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

  • 还会执行。会执行GenericServlet类中的init方法。

  • 思考第二个问题:init方法是谁调用的?

  • Tomcat服务器调用的。

  • 思考第三个问题:init方法中的ServletConfig对象是谁创建的?是谁传过来的?

  • 都是Tomcat干的。

  • Tomcat服务器先创建了ServletConfig对象,然后调用init方法,将ServletConfig对象传给了init方法。

  • 思考一下Tomcat服务器伪代码:

public class Tomcat {

public static void main(String[] args){

// …

// Tomcat服务器伪代码

// 创建LoginServlet对象(通过反射机制,调用无参数构造方法来实例化LoginServlet对象)

Class class = Class.forName(“com.baidu.javaweb.servlet.LoginServlet”);

Object obj = class.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方法

// …

}

}

  • 再思考一下:

  • init方法中的ServletConfig对象是Tomcat小猫咪创建好的。

  • 这个ServletConfig对象目前在inti方法的参数上,属于局部变量。

  • 那么ServletConfig对象以后肯定要在service方法中使用,怎么才能保证ServletConfig对象在service方法中能够使用呢?

  • 直接看代码:

import javax.servlet.*;

import java.io.IOException;

public abstract class GenericServlet implements Servlet {

// 成员变量

private ServletConfig config;

@Override

public void init(ServletConfig servletConfig) throws ServletException {

// 将servletConfig 赋值给 config

this.config = servletConfig;

}

@Override

public ServletConfig getServletConfig() {

// 这里就可以返回config对象了。

return config;

}

@Override

public abstract void service(ServletRequest servletRequest, ServletResponse servletResponse)

throws ServletException, IOException;

@Override

public String getServletInfo() {

return null;

}

@Override

public void destroy() {

}

}

  • 再思考一下:

  • 如果继承GenericServlet的类,想要重写init方法呢?

  • 给init方法加上final,这样子类就无法重写init方法了。

自我介绍一下,小编13年上海交大毕业,曾经在小公司待过,也去过华为、OPPO等大厂,18年进入阿里一直到现在。

深知大多数Java工程师,想要提升技能,往往是自己摸索成长或者是报班学习,但对于培训机构动则几千的学费,着实压力不小。自己不成体系的自学效果低效又漫长,而且极易碰到天花板技术停滞不前!

因此收集整理了一份《2024年Java开发全套学习资料》,初衷也很简单,就是希望能够帮助到想自学提升又不知道该从何学起的朋友,同时减轻大家的负担。
img
img
img
img
img
img

既有适合小白学习的零基础资料,也有适合3年以上经验的小伙伴深入学习提升的进阶课程,基本涵盖了95%以上Java开发知识点,真正体系化!

由于文件比较大,这里只是将部分目录大纲截图出来,每个节点里面都包含大厂面经、学习笔记、源码讲义、实战项目、讲解视频,并且后续会持续更新

如果你觉得这些内容对你有帮助,可以添加V获取:vip1024b (备注Java)
img

我的面试宝典:一线互联网大厂Java核心面试题库

以下是我个人的一些做法,希望可以给各位提供一些帮助:

整理了很长一段时间,拿来复习面试刷题非常合适,其中包括了Java基础、异常、集合、并发编程、JVM、Spring全家桶、MyBatis、Redis、数据库、中间件MQ、Dubbo、Linux、Tomcat、ZooKeeper、Netty等等,且还会持续的更新…可star一下!

image

283页的Java进阶核心pdf文档

Java部分:Java基础,集合,并发,多线程,JVM,设计模式

数据结构算法:Java算法,数据结构

开源框架部分:Spring,MyBatis,MVC,netty,tomcat

分布式部分:架构设计,Redis缓存,Zookeeper,kafka,RabbitMQ,负载均衡等

微服务部分:SpringBoot,SpringCloud,Dubbo,Docker

image

还有源码相关的阅读学习

image

分:Java基础,集合,并发,多线程,JVM,设计模式

数据结构算法:Java算法,数据结构

开源框架部分:Spring,MyBatis,MVC,netty,tomcat

分布式部分:架构设计,Redis缓存,Zookeeper,kafka,RabbitMQ,负载均衡等

微服务部分:SpringBoot,SpringCloud,Dubbo,Docker

[外链图片转存中…(img-Uymy7IxH-1711881909403)]

还有源码相关的阅读学习

[外链图片转存中…(img-arvMSz35-1711881909403)]

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值