醉卧草庐听风雨

君子藏器于身,待时而动

0%

Servlet组件的注册方式

现在的Java Web领域已经逐渐分为Servlet技术栈和非Servlet技术栈(目前主要基于Netty),用了许久的Servlet技术栈也是时候整理整理下Servlet的一些注册方式,当然本文内容受限于个人的知识范围,仅罗列出个人目前知道的方式。主要以Servlet组件为例,其他的如Listener和Filter这种类似就不再演示。

web.xml

最传统的方式是基于web.xml,由类似Tomcat的容器去读取处理,下面的示例就是大家常用的关于Spring MVC的注册

1
2
3
4
5
6
7
8
9
10
11
12
13
<servlet>
<servlet-name>app</servlet-name>
<servlet-class>org.springframework.web.servlet.DispatcherServlet</servlet-class>
<init-param>
<param-name>contextConfigLocation</param-name>
<param-value></param-value>
</init-param>
<load-on-startup>1</load-on-startup>
</servlet>
<servlet-mapping>
<servlet-name>app</servlet-name>
<url-pattern>/app/*</url-pattern>
</servlet-mapping>

@WebServlet

在Servlet 3.0+的环境中可以直接通过注解的方式来定义相关的组件,下面就是一个简单的示例

1
2
@WebServlet(name="TestServlet", urlPatterns={"/path", "/alt"})
public class TestServlet extends HttpServlet ... {}

在Spring Boot内嵌容器情况下可以使用@ServletComponentScan注解来直接扫描相关的组件注解,来达到注册的目的。

WebApplicationInitializer

在实际使用中大多是结合Spring的生态来用,Servlet 3.0+环境中,可用Spring MVC的WebApplicationInitializer以编程方式配置Servlet,启动时Spring会检测实现类并将其自动用于初始化任何Servlet 3容器。通过抽象实现AbstractDispatcherServletInitializer还可以自定义DispatcherServlet的映射和配置位置。WebApplicationInitializer用来替代或与web.xml结合使用。以下示例注册一个DispatcherServlet:

1
2
3
4
5
6
7
8
9
10
11
12
public class MyWebApplicationInitializer implements WebApplicationInitializer {

@Override
public void onStartup(ServletContext container) {
XmlWebApplicationContext appContext = new XmlWebApplicationContext();
appContext.setConfigLocation("/WEB-INF/spring/dispatcher-config.xml");

ServletRegistration.Dynamic registration = container.addServlet("dispatcher", new DispatcherServlet(appContext));
registration.setLoadOnStartup(1);
registration.addMapping("/");
}
}

ServletContextInitializer

接下来便是Spring Boot的注册方式了,在Spring Boot中也可以使用编程方式来配置Web组件,这便是ServletContextInitializer,它的作用和WebApplicationInitializer一致,两者不同之处在于ServletContextInitializer的实现类是由SpringServletContainerInitializer来管理运行的,而WebApplicationInitializer的实现类则是交由Servlet容器来管理,简单来讲就是war包部署模式下WebApplicationInitializer起作用,jar包内嵌容器时ServletContextInitializer起作用,两者在特定的条件下才会运行互不影响。由于ServletContextInitializer的配置方式与WebApplicationInitializer类似此处就不再示例演示了。

ServletRegistrationBean

在Spring Boot中还支持使用ServletRegistrationBean来注册,使用起来还是比较简单易懂,下面便是一个示例,当然还有很多的参数配置,这里就不再一一展示了。

1
2
3
4
5
@Bean
public ServletRegistrationBean registrationBean() {
DispatcherServlet servlet = new DispatcherServlet();
return new ServletRegistrationBean(servlet,"/*");
}

写在最后

本次主要介绍了Servlet组件注册的一些小知识,个人感觉还是挺有用的,尤其是WebApplicationInitializer和ServletContextInitializer这两种方式可以帮助我们把项目逐渐过渡至Spring Boot中,在实际实践中中本人就是这么将项目迁移为Spring Boot的,希望能对各位有所启发和帮助。