65.9K
CodeProject 正在变化。 阅读更多。
Home

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

starIconstarIconstarIconemptyStarIconemptyStarIcon

3.00/5 (1投票)

2015年4月14日

CPOL

2分钟阅读

viewsIcon

16171

使用 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 及更高版本的先进功能,这种实现变得更加容易。因为它提供了一个名为 SpringServletContainerInitializerServletContainerInitializer 实现。基本上,它通过 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 条目的实现基础。让我们深入研究上面的代码,了解正在发生的事情。

  1. 上面的类实现了 WebApplicationInitializer 接口。
  2. 重写了 onStartup 方法,以便配置/添加 ServletContextDispatcherServlet
  3. 初始化了 XmlWebApplicationContext,并从 dispatcher-servlet.xml 文件的位置读取配置文件。
  4. ContestLoaderListener 添加到 ServletContext。这将把 XMLWebApplicationContext 集成到 ServletContext 的生命周期中。
  5. 创建并初始化 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 条目的程序化方法始终冗长且非常容易。当配置中出现任何问题时,也易于调试。

© . All rights reserved.