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,这样启动会报错。
在GitHub上编辑此页 (opens new window)
上次更新: 2023/4/21 16:56:30