JavaWeb综合案例-Servlet优化

news/2024/11/28 18:49:34/

在这里插入图片描述

将WebServlet的访问路径不要写死,写成通配符的形式

1. 反射笔记(后续代码会用到该机制)

1.1 基础概念

JAVA反射机制是在运行状态中,对于任意一个类,都能够知道这个类的所有属性和方法;对于任意一个对象,都能够调用它的任意一个方法和属性;这种动态获取的信息以及动态调用对象的方法的功能称为java语言的反射机制。

言简意赅的说法就是:反射就是将Java类中各个成分映射成为一个个的Java对象

  1. 成员变量
  2. 方法、构造方法
  3. 包等等

但在此之前,先要把class类以及类的加载机制,在此基础上再探讨如何通过反射获取class类以及类的成员变量等等

1.1.1 Class类

Class类是一个实实在在的类,存在于java.lang包中;
Class类的实例标识java应用运行时的类或接口;
数组同样也被映射为class对象的一个类,所有具有相同元素类型和维数的数组都共享该 Class 对象;
手动编写的类被编译后会产生一个Class对象,其表示的是创建的类的类型信息,而且这个Class对象保存在同名.class的文件中(字节码文件);
每个通过关键字class标识的类,在内存中有且只有一个与之对应的Class对象来描述其类型信息,无论创建多少个实例对象,其依据的都是用一个Class对象;
Class类只存私有构造函数,因此对应Class对象只能有JVM创建和加载
Class类的对象作用是运行时提供或获得某个对象的类型信息,这点对于反射技术很重要

1.1.2 类加载

在这里插入图片描述

1.1.3 反射的使用

我们如何通过反射获取Class类对象以及类中的成员变量、方法、构造方法?

在类加载的时候,jvm会创建一个class对象;
在Java中,Class类与java.lang.reflect类库一起对反射技术进行了全力的支持;
常用的类主要有Constructor类:表示的是Class 对象所表示的类的构造方法,利用它可以在运行时动态创建对象;
Field类:表示Class对象所表示的类的成员变量,通过它可以在运行时动态修改成员变量的属性值(包含private);
Method类:表示Class对象所表示的类的成员方法,通过它可以动态调用对象的方法(包含private)

1.1.4 反射机制的执行流程

在这里插入图片描述

1.1.5 反射小结

反射类及反射方法的获取,都是通过从列表中搜寻查找匹配的方法,所以查找性能会随类的大小方法多少而变化;
每个类都会有一个与之对应的Class实例,从而每个类都可以获取method反射方法,并作用到其他实例身上;
反射也是考虑了线程安全的,放心使用;
反射使用软引用relectionData缓存class信息,避免每次重新从jvm获取带来的开销;
反射调用多次生成新代理Accessor, 而通过字节码生存的则考虑了卸载功能,所以会使用独立的类加载器;
当找到需要的方法,都会copy一份出来,而不是使用原来的实例,从而保证数据隔离;
调度反射方法,最终是由jvm执行invoke0()执行;

2. Servlet优化

在这里插入图片描述

问题一:之前在servlet中写WebServlet资源路径固定,如何解决?
路径不要写成固定,写成通配符形式
如:/brand/*

问题二:获取最后一段路径,也就是方法名称,获取了方法名称怎样执行方法?
通过反射机制,获取BrandServlet的字节码文件,获取其方法的method对象,method.invoke()就可以调用方法了

问题三:BrandServlet extends HttpServlet,而HttpServlet在对应的service方法中通过request的请求方式做了方法分发,例如post请求就是采用doPost(),那么在之前的servlet中我们只能执行doGet()doPost()方法,但现在不写这两个方法,而是写自定义方法,这时就不能继承HTTPServlet了,方法分发的功能也不采用了
而是采用自定义的Servlet,使用请求路径进行方法分发,替换HttpServlet的根据请求方式进行方法分发

针对问题三

不再采用请求方式进行方法分发,而是采用请求路径进行方法分发,所以这里重写service方法

下面代码思想非常关键

/*** 替换HttpServlet,根据请求的最后一段路径来进行方法分发*/public class BaseServlet extends HttpServlet {//根据请求的最后一段路径来进行方法分发@Overrideprotected void service(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {//1. 获取请求路径String uri = req.getRequestURI(); // /brand-case/brand/selectAll//2. 获取最后一段路径,方法名int index = uri.lastIndexOf('/');String methodName = uri.substring(index + 1); //  /selectAll? selectAll?//3. 执行方法// 谁调用我(this),我代表谁// BrandServlet会被Tomcat服务器调用,而它继承了BaseServlet// 其中BaseServlet的service方法也是由Tomcat服务器调用,由BrandServlet调用// 所以this指代的是BrandServlet//System.out.println(this);//3.1 获取BrandServlet /UserServlet 字节码对象 ClassClass<? extends BaseServlet> cls = this.getClass();//3.2 获取方法 Method对象try {// 获取方法名,参数Method method = cls.getMethod(methodName, HttpServletRequest.class, HttpServletResponse.class);//3.3 执行方法method.invoke(this,req,resp);} catch (NoSuchMethodException e) {e.printStackTrace();} catch (IllegalAccessException e) {e.printStackTrace();} catch (InvocationTargetException e) {e.printStackTrace();}}
}

最后

修改前端页面的URL路径即可


http://www.ppmy.cn/news/62820.html

相关文章

国产光伏仪器 6581太阳能电池板伏安特性测试仪

6581太阳能电池板伏安特性测试仪主要用于太阳能电池板生产的最终测试&#xff0c;也可以作为层压前测试使用&#xff0c;能大大提高一次封装成品率。该测试仪适合于单晶、多晶、薄膜等多种电池组件&#xff0c;可进行I-V曲线、P-V曲线、短路电流、开路电压、峰值功率等全部参数…

PID算法(位置式pid算法和增量式pid算法)

这里写目录标题 PID算法介绍比例环节比例积分环节比例积分微分环节 位置式PID增量式PIDPID参数整定采样周期选择PID参数整定方法![请添加图片描述](https://img-blog.csdnimg.cn/849bf1672243484699b131b487f05a55.png)试凑法临界比例法一般调节法 PID算法介绍 PID 算法是闭环…

手把手教你使用gtest写单元测试

开源框架&#xff1a;gtest&#xff0c;它主要用于写单元测试&#xff0c;检查真自己的程序是否符合预期行为。这不是QA&#xff08;测试工程师&#xff09;才学的&#xff0c;也是每个优秀后端开发codoer的必备技能。 本期博文内容及使用的demo&#xff0c;参考&#xff1a; …

腾讯高工手写13W字“Netty速成手册”,3天走向实战

前言 在java界&#xff0c;netty无疑是开发网络应用的拿手菜。你不需要太多关注复杂的nio模型和底层网络的细节&#xff0c;使用其丰富的接口&#xff0c;可以很容易的实现复杂的通讯功能。 作为当前最流行的NIO框架&#xff0c;Netty在互联网领域、大数据分布式计算领域、游…

Javascript面试题:20道含答案和代码示例的练习题

请写出一个将字符串转换为数字的函数&#xff0c;例如将字符串“123”转换为数字123。 function stringToNumber(str) {return Number(str); }请写出一个将数字转换为字符串的函数&#xff0c;例如将数字123转换为字符串“123”。 function numberToString(num) {return num.…

【ED合集】事件检测的文章

1 CorED: Incorporating Type-level and Instance-level Correlationsfor Fine-grained Event Detection 论文来源&#xff1a;SIGIR 2022(CCF A类会议) 论文链接&#xff1a;https://dl.acm.org/doi/pdf/10.1145/3477495.3531956 代码链接&#xff1a;GitHub - JiaweiSheng…

GPU理解

什么是GPU GPU(Graphics Processing Unit)代表图形处理单元。该术语通常与图形卡或视频卡等术语互换使用。从技术上讲&#xff0c;GPU 是第三方显卡或主板上的主要图形处理芯片。 GPU 与 CPU不同。CPU 是中央处理器&#xff0c;它是计算机的主要大脑。GPU 专用于执行在计算机…

基础语法——笔记一

一、基础语法 编码 源码文件以UTF-8编码&#xff0c;所有字符串都是Unicode字符串标识符 第一个字符必须是字母表中的字母或下划线_ 标识符的其他部分由字母、数字、下划线组成 标识符对大小写敏感python保留字&#xff08;关键字&#xff09; 不能用于任何标识符输出python标…