介绍:
a. SpringBoot为我们自动配置了一个开箱即用的DispatcherServlet, 映射路径为"/";
b. SpringBoot默认是不支持JSP的,所有想用JSP就必须使用外来的容器来运行,即不能使用嵌入的tomcat或jetty;
c. 那么SpringBoot如何快速的支持Servlet呢?
场景:
a. 老项目使用JSP写的页面,后台用Servlet; 现在要改造为SpringBoot
b. SpringBoot项目使用Druid数据库连接池时,需要保留Druid对SQL的监控.也迫切需要SpringBoot对Servlet的支持
c. 项目中有多个服务,为了对不同服务进行不同的配置管理,需要对不同的服务设置不同的上下文;
解决方案:
前奏:
传统SpringMVC项目,在web.xml中直接配置就可以了;
通过指定init-param中的contextConfigLocation就能够为这个DispatcherServlet指定上下文。
<servlet>
<servlet-name>restServlet</servlet-name>
<servlet-class>org.springframework.web.servlet.DispatcherServlet</servlet-class>
<init-param>
<param-name>contextConfigLocation</param-name>
<param-value>/WEB-INF/spring2.xml</param-value>
</init-param>
<load-on-startup>1</load-on-startup>
</servlet>
<servlet-mapping>
<servlet-name>ModelRestServlet</servlet-name>
<url-pattern>/service/*</url-pattern>
</servlet-mapping>
SpringBoot默认我们提供了注册Servlet的三大组件:Servlet Filter Listener接口,我们只需按需配置和添加少量的代码即可实现添加 Servlet 的功能。
正解:
由于SpringBoot默认是以jar包的方式启动嵌入式的 Servlet 容器来启动 SpringBoot 的 web 应用,没有 web.xml 文件。所以想 用使用 Servlet 功能,就必须要借用 Spring Boot 提供的 ServletRegistrationBean 接口.这个Bean是由SpringBoot提供专门 注册servlet的,可以像注册bean一样去注册Servlet;
示例代码一:
因此整个实现就变得很简单了。我们只需要在 @Configuration 注解过的类中做以下配置即可使用 Servlet 功能
//注册Servlet组件
@Bean
public ServletRegistrationBean myServlet(){
ServletRegistrationBean registrationBean = new ServletRegistrationBean(new MyServlet(),"/myServlet");
return registrationBean;
}
示例代码二:
@Bean
public ServletRegistrationBean restServlet(){
//注解扫描上下文
AnnotationConfigWebApplicationContext applicationContext
= new AnnotationConfigWebApplicationContext();
//base package
applicationContext.scan("com.jerryl.rest");
//通过构造函数指定dispatcherServlet的上下文
DispatcherServlet rest_dispatcherServlet
= new DispatcherServlet(applicationContext);
//用ServletRegistrationBean包装servlet
ServletRegistrationBean registrationBean
= new ServletRegistrationBean(rest_dispatcherServlet);
registrationBean.setLoadOnStartup(1);
//指定urlmapping
registrationBean.addUrlMappings("/rest/*");
//指定name,如果不指定默认为dispatcherServlet
registrationBean.setName("rest");
return registrationBean;
}
示例二说明:
1.registrationBean.setName("rest"); 这个自定义Servlet的名称很重要; 因为name一样的ServlerRegistrationBean只会生效一个;
2.registrationBean.setName("rest"); 这个自定义Servlet的名称必须指定, 如果不指定,默认为"dispatcherServlet",而spring boot 提供的DispatcherServlet的name就是“dispatcherServlet”。
参考代码:
public ServletRegistrationBean dispatcherServletRegistration(DispatcherServlet dispatcherServlet) {
ServletRegistrationBean registration = new ServletRegistrationBean(dispatcherServlet, new String[]{this.serverProperties.getServletMapping()});
registration.setName("dispatcherServlet");
registration.setLoadOnStartup(this.webMvcProperties.getServlet().getLoadOnStartup());
if(this.multipartConfig != null) {
registration.setMultipartConfig(this.multipartConfig);
}
return registration;
}
}
同时
在自定义的DispathcerServlet绑定的配置类上,要配置报扫描的话,必须要加上@EnableWebMvc注解,不然不会扫描@Contrller注解。