开发者学堂课程【SpringBoot快速掌握 - 核心技术:注册 servlet 三大组件】学习笔记,与课程紧密联系,让用户快速学习知识。
课程地址:https://developer.aliyun.com/learning/course/612/detail/9259
注册 servlet 三大组件
基本内容:
一、注册Servlet, Filter、Listener
二、自动拦截
前言
1. 嵌入式的 servlet 容器定制器来修改嵌入式的 servlet 容器的配置,它的使用就是传入一个可配置的嵌入式的 servlet 容器,可以通过调用 API,来设置端口、设置访问路径等等。
2. 接下来讲解如何来注册 servlet 的三大组件:Servlet、 Filter、Listener,由于现看到的能创建的 spring-boot 的应用,默认是以 jar 包的方式,来启动嵌入式的 tomcat,而不是创建一个标准的 web 应用的目录结构。
3. 如果是一个 web 应用的目录结构,SRC 下会有一个 webapp 文件夹 /APP
/
WEB-INF/web
.xml
,可以把三大组件都注册在web
.xml
中。
4. 问:如果没有web
.xml
想要注册这些组件,可以吗?
答:可以。
SpringBoot 提供了这三种方式 ServletRegistrationBean、FilterRegistrationBean、ServletListenerRegistrationBean。
一、注册 Servlet、 Filter、Listener
1. 由于 SpringBoot 是以 jar 包的方式来启动嵌入式的 S ervlet 容器来启动SpringBoo t 的 web 应用,没有 web.xml 文件。
2. 要成为一个标准的 servlrt,那就需要继承 HttpServlet;
package com. atguigu. springboot . servlet;
import javax . servlet . ServletException;
import javax. servlet . http. HttpServlet ;
import javax . servlet . http . HttpServletRequest;
import javax. servlet . http. HttpServletResponse;
import java. io. IOException;
public class MyServlet extends HttpServlet {
//处理get请求
@Override
protected void doGet (HttpServletRequest req, HttpServletResponse resp) throws ServletException,
doPost(req,resp) ;
//在doget里面调用dopost请求,它们两个请求的执行逻辑是相同的;
}
//处理dopost请求
@Override
protected void doPost (HttpServletRequest req, HttpServletResponse resp) throws ServletException,
resp.getWriter().writer(S :“Hello,Servlet”)
//这是一个标准的Servlet程序,如果要它启动,必须要使用springboot提供的方式将它注册在Servlet容器中。需要使用ServletRegistrationBean将Servlet注册。
//配置嵌入式的Servlet容器(服务器)
@Bean
public EmbeddedServletContainerCustomi zer embeddedServletContainerCustomizer(
)
{
return new EmbeddedServletContainerCustomizer(
) {
//定制嵌入式的Servlet容器相关的规则
@Override
public void customize(Confi gurableEmbeddedServletContainer container) {
container. setPort (8083);
}
};
}
}
3. 注册三大组件的示意图:
注册三大组件用以下方式:
(1)ServletRegistrationBean
@Bean
//
一定要将程序加在容器中
public ServletRegistrationBean myServlet
(
)
{
ServletRegistrationBean registrationBean =
new ServletRegistrationBean
(newMyServlet(),"/myServlet");
registrationBean
.setLoadOnstartup(
int
loadOnstartup
)
//设置它的启动顺序等等相关操作都可以在这三个组件上面设置;
return registrationBean;
}
//映射 servlet 请求。
//new 主要是一个有参构造器,有参构造器可以加入一个标准的 Servlet,并且显示出拦截路径,这个 Servlet 就是标准的 Javax。
//把它加在容器中,然后启动项目,看一下访问 myServlet 是不是 myServlet 能给浏览器写出“Hello,MyServlet”这句话。现在访问浏览器 localhost 8083,端口之前定制过了,叫做8083。用8083来访问,看到 servlrt 就生效了。如下图所示;
(2)FilterRegistrationBean
@Bean
public FilterRegistrationBean myFilter(
)
{
FilterRegistrationBean
registrationBean
=
new
FilterRegistrationBean();
//先将FilterRegistrationBean注册;
registrationBean
. setFilter(new MyFilter(
)
)
;
//设置 MyFilter;
registrationBean.setUrlPatterns(Arrays .asList("/hello",
"/myServlet"));
//拦截的两个请求;设置拦截setUrlPatterns,还是一个集合,将集合转为Arrays .asList;第一个:拦截hello请求,第二个:拦截myServlet请求;
return registrationBean;
}
//把它加在容器中,然后启动项目,看一下 Filter 能否正常工作,只要发送myServlet 请求,或者发送 hello 请求,控制台都会打印 Filter 被拦截到的这句话,浏览器搜索 hello 或者 myServlet 浏览器都会响应,控制台也会显示出 “
MyFilter
procress
”
。
FilterRegistrationBean 注册完成。
(3)ServletListenerRegistrationBean
①实现 Servlet 监听和销毁的 Listener
@Bean
public ServletListenerRegistrationBean myListener()
{
ServletListenerRegistrationBeanregistrationBean = new ServletlistenerRegistrationBean<>(new MyListener());
return registrationBean;
}
②监听和销毁:
package com. atguigu. springboot .listener;
import javax. servlet . ServletContextEvent ;
import javax . servlet . ServletContextListener;
public class MyL istener implements ServletContextListener {
@Override
public void contextInitialized(ServletContextEvent sce) {
System. out . println("contextInitialized...web”
应用启动
);
}
@Override
public void contextDestroyed(ServletContextEvent sce) {
System. out . println("contextDestroyed..
当前web项目销毁
");
}
}
③注册 Listener 的类型:(Servlet 里面学到的 Listener 都可以使用)
④测试一下,看这个项目启动的时候写的Listener能不能在控制台打印应用启动、项目销毁的时候能不能监听到销毁?
这个监听器已经生效,它监听到 web 应用启动。
那么销毁呢?
一停整个控制台就停了,就没有输出了;鼠标存在点也不要在控制台的总开关上停,这就跟拔电源是一样的;需要在Exit的按钮,这是正常方式退出项目的。退出以后,发现也监听到 web 项目销毁了。
总结:对于这三大组件的属性设置,都可以 registrationBean 在里面设置,也就是说,想关于三大组件的设置都可以在以上三个组件中进行。
这就是如何在 springBoot 里面来注册三大组件。
二、自动拦截
SpringBoot 自动配置 SpringMVC 的时候,自动的注册 SpringMVC 的前端控制噐:DIspatcherServlet ;可以参照自动代码,自动代码在DispatcherServletAutoConfiguration 里面。
@Bean(name=DEFAULT_DISPATCHER_SERVLET_REGISTRATION_BEAN_NAME)
@ConditionalOnBean(value=DispatcherServlet.class,name=DEFAULT_DISPATCHER_SERVLET_BEAN_NAME)
public ServletRegistrationBean dispatcherServletRegistration(
DispatcherServlet dispatcherServlet) {
ServletRegistrationBean registration = new ServletRegistrationBean(
dispatcherServlet,this.serverProperties.getServletMapping());
//默认拦截:/ 所有请求;包括静态咨源,但是不拦截 jsp 清求;这就是“/”的意思;
以前的拦截会使用“/*”但是“/*”会拦截jsp;
//可以通过server。servletpath来修改SpringMVC前端控制器默认拦截的请求路径;
registration.setName(DEFAULT_DISPATCHER_SERVTET_BEAN_NAME);
registration. setLoadOnStartup(
this . webMvcProperties . getServlet(). getLoadOnStartup());
if (this . multipartConfig != null) {
registration. setMultipartConfig(this . multipartConfig);
}
return registration;
}
上述程序就是给容器中注册了一个 DIspatcherServlet 。