1 Servlet的注解配置
1.1 注解原理
注解(Annotation),是提供一种为程序元素设置元数据的方法。
使用 @interface 关键字进行定义,可以包含元素(成员变量),用来表示注解的属性。
元数据是添加到程序元素如方法、字段、类和包上的额外信息,注解就是一种载体形式。
注解不能直接干扰程序代码的运行。
注释:用文字描述程序。
注解(Annotation):是一种特殊的Java接口,使用@符号进行标记,可以附加在类、方法、字段等元素上。
提供了一种声明式的方式来描述代码的特性和行为,可以用于编译时处理和运行时处理
注解作用
编译检查
编写文档
代码分析
在程序运行时,可以通过反射机制来获取类、方法、字段等的注解信息。这使得我们可以在运行时动态地读取和利用注解信息,例如实现某些特定的逻辑或配置。
RetentionPolicy.SOURCE:注解只保留在源文件,当Java文件编译成class文件的时候,注解被遗弃;
RetentionPolicy.CLASS:注解被保留到class文件,但jvm加载class文件时候被遗弃,这是默认的生命周期;
RetentionPolicy.RUNTIME:注解不仅被保存到class文件中,jvm加载class文件之后,仍然存在;
1.2 Servlet注解配置


loadOnStartup(加载时机)

负数:表示延迟加载,即在第一次请求时加载。
非负数:表示容器启动时加载,并且具有较高的加载优先级,比其他正数值更先加载。
2 Servlet的映射路径
客户端是通过URL地址访问web服务器中的资源,Servlet程序若想被外界访问,必须把Servlet程序映射到一个URL地址上。
在web.xml文件配置中通过<url-pattern>节点进行配置
在注解中通过value或者urlPatterns属性进行配置。
2.1 路径映射规则
1.精确匹配
配置路径:@WebServlet("/path/demo1")
访问路径:http://localhost:8080/path/demo1
2.目录匹配
配置路径:@WebServlet("/path/*")
访问路径:http://localhost:8080/path/demo2
3.扩展名匹配
配置路径:@WebServlet("*.do")
访问路径:http://localhost:8080/path/demo3.do
4.任意匹配
配置路径:@WebServlet("/")
@WebServlet("/*")
访问路径:http://localhost:8080/path/demo4
2.2 路径映射注意事项
1.url-pattern要么以 / 开头,要么以 * 开头。
例如:urlPattrens="myweb"是非法路径。
2.不能同时使用目录匹配、扩展名匹配、任意匹配,
例如 /demo1/*.do是非法路径
优先级:精确匹配 > 目录匹配 > 扩展名匹配 > 任意匹配
2.3 缺省路径问题
1./ 和 /* 的区别
当项目中的Servlet配置了 “/”,会覆盖tomcat中的DefaultServlet。当其它的url-pattern均不能匹配时,会由此Servlet处理。
当项目中的Servlet配置了 “/*”,则会匹配任意访问路径。
注意: 1.使用/会导致静态资源无法访问也就是会覆盖默认servlet; 2."/*“不会覆盖tomcat中的DefaultServlet,但是会处理静态资源的请求。
当前项目中有一个Servlet配置的urlPatterns="/*",在项目的webapp下有一个hello.html 那么当访问"http://localhost:8080/hello.html"时,将会访问到什么内容呢?
实际发现访问的是Servlet!
原因是"/"和"/*"是缺省路径,是Tomcat服务器内置的一个路径,该路径对应的是DefaultServlet(缺省Servlet)。这个缺省的Servlet用于解析Web应用的静态资源文件。
可以在Tomcat的conf目录下的web.xml文件中找到该缺省Servlet的配置
http://localhost:8080/hello.html访问过程
1)检测Web应用下是否有匹配的Servlet的url-pattern
2)如果没有匹配的url-pattern,则交给Tomcat的内置的DefaultServlet处理
3)DefaultServlet程序到Web应用的根目录下查找是否存在一个名称为hello.html的静态文件 4)如果找到该文件,则读取该文件内容,返回给浏览器
5)如果找不到该文件,则返回404错误页面
所以过程是:先找动态资源,再找静态资源
因为Tomcat服务器会先找动态资源再找静态资源。如果是/或/*就不会再访问到静态资源,例如/xx.html或者/xx.css等路径格式,这类静态资源就不会被访问到了,所以慎用/或/*。
3 Servlet的生命周期
Servlet是单例对象,服务器只会创建一个Servlet实例对象,也就是说Servlet实例对象一旦创建,它就会驻留在内存中,为后续的其它请求服务,直至web容器退出,或者应用被卸载,Servlet实例对象才会销毁。
3.1 Servlet生命周期主要涉及四个方法
构造方法、

init方法、
只调用一次,创建完Servlet对象后进行初始化。
HttpServlet其父类GenericServlet的源码中有两个init方法,
带参和无参,带参的方法中调用了无参的init方法
这两个方法之间需要注意:
1.带参的init方法是Servlet的生命周期方法,一定会被Servlet容器来调用
2.无参的init方法则是Java设计出来专门给开发者进行重写覆盖,在其中编写Servlet的初始化逻辑代码。
3.如果需要编写初始化代码,不要覆盖带参数的init方法(可以通过getServletConfig来获取初始化配置参数)
service方法、
Servlet的核心方法,每次请求都会调用,处理客户端的请求和响应,根据请求的类型再通过多态技术分别调用doGet、doPost等方法。
destroy方法
只调用一次(服务关闭之前调用),释放相关资源。停止服务器或者重新部署Web应用时销毁Servlet对象。
3.2 观察生命周期方法调用过程
重写service、init、destroy方法,
添加输出语句 启动服务器后,多次访问Servlet,观察输出
正常关闭服务器,观察输出

1221

被折叠的 条评论
为什么被折叠?



