Servlet 中的注解
# 10.Servlet 中的注解
为了简化 web.xml 的配置,我们可以使用注解。
# 注解的好处
一个项目的功能是非常多的,为了避免一个 Servlet 代码过长,我们会分很多个 Servlet;
但随着 Servlet 的增多,web.xml 配置也注解增多,等 web.xml 也变的很长的时候,就不便于维护了,为此我们可以使用注解,简化配置。
# 使用注解
我们根据以下步骤来演示如何使用注解:
- 定义一个类,实现 Servlet 接口
- 复写方法
- 在类上使用@WebServlet 注解:
@WebServlet("资源路径")
因为该注解就是在类上的,不用再写全类名,只需关心资源路径即可。
然后我们编写 service 方法:
@WebServlet("/demo3")
public class ServletDemo3Anno implements Servlet {
// 省略其他代码....
public void service(ServletRequest servletRequest, ServletResponse servletResponse) throws ServletException, IOException {
System.out.println("Hello Servlet Annotation!");
}
// 省略其他代码....
}
1
2
3
4
5
6
7
8
9
10
2
3
4
5
6
7
8
9
10
重启项目并访问 http://localhost: 8080/hello/demo3,可以看到控制台打印了
Hello Servlet Annotation!
1
版本注意:需要 Servlet3.0 及以上,也就是 JavaEE 6 及以上(目前基本上都是,如果遇到低版本的需要注意)
使用了注解后,我们可以不使用 web.xml 了,删掉也可以
# @WebServlet 注解的原理
为什么@WebServlet 可以实现简化配置呢?其实我们看看源码就知道了。WebServlet.class 的部分源码如下 ↓ 每一个都有默认值
@Target({ElementType.TYPE})
@Retention(RetentionPolicy.RUNTIME)
@Documented
public @interface WebServlet {
String name() default ""; //相当于 <Servlet-name>,全类名
String[] value() default {};//代表 urlPatterns()属性配置
String[] urlPatterns() default {};//相当于 <url-pattern> 一个数组,可以有多个资源路径对应
int loadOnStartup() default -1;//相当于 <load-on-startup>
WebInitParam[] initParams() default {};
boolean asyncSupported() default false;
String smallIcon() default "";
String largeIcon() default "";
String description() default "";
String displayName() default "";
}
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
可以看到关键的是 value 这个默认属性,代表的就是 urlPatterns 这个属性,而 urlPatterns 就是资源路径。
之所以是 String 数组。是因为一个 Servlet 可以有多个访问路径,例如 web.xml 中这样配置:
<servlet-mapping>
<servlet-name>demo2</servlet-name> <!-- 访问路径时,使用哪个Servlet-->
<url-pattern>/demo2</url-pattern> <!-- 访问哪个路径-->
</servlet-mapping>
<!-- 可以多个路径对应一个Servlet -->
<servlet-mapping>
<servlet-name>demo2</servlet-name> <!-- 访问路径时,使用哪个Servlet-->
<url-pattern>/demo4</url-pattern> <!-- 访问哪个路径-->
</servlet-mapping>
1
2
3
4
5
6
7
8
9
10
2
3
4
5
6
7
8
9
10
为此,可以有如下写法
@WebServlet(urlPatterns = {"/demo3", "/demo5"})
@WebServlet(urlPatterns = "/demo3") //如果只有一个值,可以省略大括号
@WebServlet("/demo3") //如果只有一个值,可以省略 urlPatterns
1
2
3
2
3
# 资源路径的配置
urlpartten 配置的是 Servlet 访问路径,也叫资源路径
那么路径能怎么定义呢?支持正则吗?支持多层路径吗?有如下写法:
- /xxx:路径匹配
- /xxx/xxx:多层路径,目录结构
- 通配符匹配:例如
@WebServlet({"/user/*"})
,就是访问任何 user 的子目录都匹配 - *.do:扩展名匹配,访问任何.do 路径都会执行,例如
localhost/demo.do
。也可以定义为其他扩展名,例如.action
等。 注意扩展名前面不能加斜线/,例如这样定义会报错:@WebServlet("/*.do")
- 如果多个 Servlet 都匹配了某个路径,则看优先级。 通配符星号
*
是非常低的,如果有一个 Servlet1 定义的路径是/demo3
,而有个 Servlet2 的放了路径是/*
,那么访问/demo3 的时候, 只有 Servlet1 的 service 方法会执行。
注意,不能一个资源路径与与其他 Servlet 重复,例如两个 Servlet 的访问路径都是 /demo1,这样启动会报错。
上次更新: 2024/10/1 21:14:36