Java 中配置 web.xml 条目的程序化方法





3.00/5 (1投票)
使用 Java 配置 web.xml 的另一种方法
引言
本文讨论了配置 web.xml 条目的程序化方法。
背景
在传统的做法中,任何 servlet 上下文和其他监听器都是通过在 Java/J2EE Web 应用程序中的 web.xml 文件中进行条目配置的。与此相反,servlet 3.0 的引入旨在提供一种配置 web.xml 条目的程序化方法。
使用程序化方法
任何基于 servlet 3.0 的 Web 应用程序都可以实现 ServletContainerInitializer
接口,该接口将在运行时显式传递 ServletContext
接口,并作为容器的表示。这可用于配置 servlet、监听器、任何过滤器以及通常在典型的 web.xml 文件中指定的其他内容。
借助 Spring Framework 3.1 及更高版本的先进功能,这种实现变得更加容易。因为它提供了一个名为 SpringServletContainerInitializer
的 ServletContainerInitializer
实现。基本上,它通过 Spring Web 模块文件中的 META-INF/services/java.servlet.ServletContainerInitializer 文件注册该实现。此外,配置 servlet 上下文、监听器和过滤器的任务将委托给 Spring 的另一个接口,称为 WebApplicationInitializer
。
开发人员的唯一任务是实现 WebApplicationInitializer
并在实现中配置 servlet 上下文。
让我们看一个示例,了解如何实现相同的功能
用于 servlet 配置的典型 web.xml 如下所示
<servlet>
<servlet-name>dispatcher-servlet</servlet-name>
<servlet-class>org.springframework.web.servlet.DispatcherServlet</servlet-class>
<init-param>
<param-name>contextConfigLocation</param-name>
<param-value>/WEB-INF/spring/dispatcher-servlet.xml</param-value>
</init-param>
<load-on-startup>1</load-on-startup>
</servlet>
<servlet-mapping>
<servlet-name>dispatcher-servlet</servlet-name>
<url-pattern>/</url-pattern>
</servlet-mapping>
现在,可以通过如下方式对上述条目进行程序化配置
public class MyWebAppInitializer implements WebApplicationInitializer {
@Override
public void onStartup(ServletContext servletContext) {
public void onStartup(ServletContext container) {
XmlWebApplicationContext appContext = new XmlWebApplicationContext();
appContext.setConfigLocation("/WEB-INF/spring/dispatcher-servlet.xml");
servletContext.addListener(new ContextLoaderListener(context));
ServletRegistration.Dynamic dispatcher = container.addServlet
("dispatcher", new DispatcherServlet(appContext));
dispatcher.setLoadOnStartup(1);
dispatcher.addMapping("/");
}
}
初始化器
在上面的 Java 代码片段中,使用了 WebApplicationInitializer
接口。这是使用程序化方法配置 web.xml 条目的实现基础。让我们深入研究上面的代码,了解正在发生的事情。
- 上面的类实现了
WebApplicationInitializer
接口。 - 重写了
onStartup
方法,以便配置/添加ServletContext
和DispatcherServlet
。 - 初始化了
XmlWebApplicationContext
,并从 dispatcher-servlet.xml 文件的位置读取配置文件。 - 将
ContestLoaderListener
添加到ServletContext
。这将把XMLWebApplicationContext
集成到ServletContext
的生命周期中。 - 创建并初始化 Dispatcher servlet 到
XMLWebApplicationContext
,并添加 URL 映射 (*/)。
配置类
现在,我们将创建一个名为 AppConfiguration.java 的主应用程序配置类,它除了告知 Spring Framework 读取组件外,几乎什么也不做。
public class MyWebAppInitializer implements WebApplicationInitializer {
@Configuration
@ComponentScan(basePackages = "com.web.configure.example")
public class AppConfiguration {
}
结论
上述配置 web.xml 条目的程序化方法始终冗长且非常容易。当配置中出现任何问题时,也易于调试。