servlet 三大组件是java web开发的核心基础,包括:servlet、filter 和 listener。
servlet:
- 用于处理客户端请求并生成动态响应的java类
- 运行在服务器端的java程序
filter(过滤器):
- 用于对请求和响应进行预处理和后处理
- 在请求到达servlet之前和响应返回客户端之前执行
listener(监听器):
- 用于监听web应用中的事件
- 当特定事件发生时自动执行回调方法
| 组件 | 作用 | 生命周期 | 应用场景 |
|---|---|---|---|
| servlet | 处理请求和生成响应 | 请求-响应 | 业务逻辑处理 |
| filter | 请求/响应预处理 | 请求-响应 | 安全检查、日志、编码转换 |
| listener | 监听应用事件 | 应用/会话/请求生命周期 | 资源管理、统计、初始化 |

为什么需要特殊方式注册 servlet 三大组件?
传统 java web 应用(war 包部署)通过web.xml配置 servlet、filter、listener:
<!-- 传统web.xml配置servlet -->
<servlet>
<servlet-name>myservlet</servlet-name>
<servlet-class>com.example.myservlet</servlet-class>
</servlet>
<servlet-mapping>
<servlet-name>myservlet</servlet-name>
<url-pattern>/myservlet</url-pattern>
</servlet-mapping>spring boot 默认以jar 包方式启动,使用嵌入式 servlet 容器(如 tomcat),没有web.xml文件。因此,spring boot 提供了通过java 配置类 + @bean注解的方式注册三大组件。
注册方式详解
spring boot 通过三个 “注册器类” 包装三大组件,再通过@bean将注册器注入 spring 容器,完成组件注册:
| 组件类型 | 注册器类 | 作用 |
|---|---|---|
| servlet | servletregistrationbean | 注册自定义 servlet,指定访问路径 |
| filter | filterregistrationbean | 注册自定义 filter,指定过滤的路径 |
| listener | servletlistenerregistrationbean | 注册自定义 listener,监听容器事件 |
dispatcherservlet 本身就是一个 servlet,是 spring mvc 的前端控制器,负责接收所有请求并分发。spring boot 在dispatcherservletautoconfiguration中自动注册它,无需手动配置。
实操演示:注册自定义三大组件
步骤 1:创建自定义 servlet、filter、listener
// 1. 自定义servlet:处理请求
public class myservlet extends httpservlet {
@override
protected void doget(httpservletrequest req, httpservletresponse resp) throws ioexception {
resp.getwriter().write("hello myservlet!"); // 响应内容
system.out.println("myservlet处理了get请求");
}
}
// 2. 自定义filter:过滤请求
public class myfilter implements filter {
@override
public void dofilter(servletrequest request, servletresponse response, filterchain chain) throws ioexception, servletexception {
system.out.println("myfilter执行前");
chain.dofilter(request, response); // 放行请求
system.out.println("myfilter执行后");
}
}
// 3. 自定义listener:监听servlet容器事件(如启动、关闭)
public class mylistener implements servletcontextlistener {
@override
public void contextinitialized(servletcontextevent sce) {
system.out.println("mylistener:servlet容器初始化完成");
}
@override
public void contextdestroyed(servletcontextevent sce) {
system.out.println("mylistener:servlet容器销毁");
}
}步骤 2:通过配置类注册组件(springboot 1.x的版本去掉泛型)
@configuration
public class servletconfig {
// 注册servlet
@bean
public servletregistrationbean<myservlet> myservlet() {
// 关联自定义servlet,并指定访问路径为/myservlet
servletregistrationbean<myservlet> registrationbean = new servletregistrationbean<>(new myservlet(), "/myservlet");
registrationbean.setloadonstartup(1); // 启动顺序(数字越小越先启动)
return registrationbean;
}
// 注册filter
@bean
public filterregistrationbean<myfilter> myfilter() {
filterregistrationbean<myfilter> registrationbean = new filterregistrationbean<>();
registrationbean.setfilter(new myfilter()); // 关联自定义filter
// 指定过滤路径:拦截/hello和/myservlet的请求
registrationbean.seturlpatterns(arrays.aslist("/hello", "/myservlet"));
return registrationbean;
}
// 注册listener
@bean
public servletlistenerregistrationbean<mylistener> mylistener() {
// 关联自定义listener
servletlistenerregistrationbean<mylistener> registrationbean = new servletlistenerregistrationbean<>(new mylistener());
return registrationbean;
}
}步骤 3:创建测试控制器(辅助验证 filter)
import org.springframework.web.bind.annotation.getmapping;
import org.springframework.web.bind.annotation.restcontroller;
@restcontroller
public class testcontroller {
// 该路径会被myfilter过滤(因为filter配置了拦截/hello)
@getmapping("/hello")
public string hello() {
system.out.println("testcontroller的/hello方法执行");
return "hello";
}
}步骤 4:启动应用并验证
1. 验证 listener(容器启动时)
启动 spring boot 应用,控制台会输出 listener 的初始化日志:
mylistener:servlet容器初始化完成
2. 验证 servlet 和 filter
访问http://localhost:8080/myservlet:
- 浏览器显示响应:
hello myservlet! - 控制台输出(filter 先执行,再到 servlet):
myfilter执行前 myservlet处理了get请求 myfilter执行后
3. 验证 filter 对其他路径的拦截
访问http://localhost:8080/hello:
- 浏览器显示响应:
hello - 控制台输出(filter 拦截 /hello 请求):
myfilter执行前 testcontroller的/hello方法执行 myfilter执行后
4. 验证未被 filter 拦截的路径
访问http://localhost:8080/other(假设存在该路径且未被 filter 配置):
- 控制台不会输出
myfilter的日志(仅控制器方法日志)。
步骤 5:验证dispatcherservlet的默认行为
dispatcherservlet默认拦截/,负责处理 spring mvc 的所有请求(如/hello)。可以通过以下方式验证:
- 在
application.properties中修改其拦截路径:
server.servletpath=/app/* # 修改为拦截/app/*路径
- 重启应用后,原
/hello需访问/app/hello才能被 spring mvc 处理,否则返回 404(证明dispatcherservlet的拦截路径已生效)。
到此这篇关于springboot配置嵌入式服务器的实操演示的文章就介绍到这了,更多相关springboot配置嵌入式服务器内容请搜索代码网以前的文章或继续浏览下面的相关文章希望大家以后多多支持代码网!
发表评论