1 Spring Web MVC
本文将介绍Spring Web MVC的几种配置方法。
2 和web.xml说再见
我们终于到这一步了!
我们花了两篇文章的篇幅,介绍了反射机制、SPI机制、SCI机制以及Spring Web如何和Tomcat集成。可谓是万事俱备,只欠东风了。那么,现在让我们将工程中的web.xml文件删除,着手准备使用纯Java代码的方式,让我们的Web应用启动起来。
在Web应用中创建一个名为MyWebApplicationInitializer
的类,类的名称可以随便取,只要让它实现WebApplicationInitializer
接口就可以。
package org.example;
import org.springframework.web.WebApplicationInitializer;
import javax.servlet.ServletContext;
public class MyWebApplicationInitializer implements WebApplicationInitializer {
@Override
public void onStartup(ServletContext servletCxt) {
}
}
前面的文章中曾经提到过DispatcherServlet
、WebApplicationContext
和ServletContext
三者之间的关系。DispatcherServlet
中引用了WebApplicationContext
,这样在Web应用接收到HTTP请求时,才能在Spring的IoC容器中找到能正确处理该请求的@Controller
类,完成HTTP请求的处理。
因此,在onStartup(ServletContext servletCxt)
方法中,我们需要创建DispatcherServlet
对象和WebApplicationContext
对象,并将他们关联起来。
public class MyWebApplicationInitializer implements WebApplicationInitializer {
@Override
public void onStartup(ServletContext servletCxt) {
AnnotationConfigWebApplicationContext applicationContext = new AnnotationConfigWebApplicationContext();
applicationContext.register(AppConfig.class);
DispatcherServlet servlet = new DispatcherServlet(applicationContext);
ServletRegistration.Dynamic registration = servletCxt.addServlet("app", servlet);
registration.setLoadOnStartup(1);
registration.addMapping("/*");
}
}
上述这段代码创建了DispatcherServlet
和WebApplicationContext
对象,并将所有请求(/*
)映射到DispatcherServlet
对象来处理。
AnnotationConfigWebApplicationContext
是WebApplicationContext
的一个具体实现,表示通过注解(annotation
)方式完成WebApplicationContext
的初始化。
XmlWebApplicationContext
也是WebApplicationContext
的一个具体实现,它通过加载xml格式的配置文件实现WebApplicationContext
的初始化。在这个系列文章的最开始,我们介绍了通过web.xml文件完成Spring Web MVC初始化的方法,其中使用过一个名为app-context.xml的配置文件。
当然,我们也可以创建XmlWebApplicationContext
对象并加载app-context.xml文件完成WebApplicationContext
对象的初始化。但是,既然我们考虑不再使用web.xml文件,那再使用app-context.xml文件的这个方案总让人觉得过于临时。
如前所述,需要告诉Spring容器需要加载哪些@Controller
对象到IoC容器中,并且开启Spring Web MVC自配置功能才能保证Spring Web MVC应用正常启动。这两个特性可以通过在app-context.xml文件中使用<context:component-scan base-package=... />
和<mvc:annotation-driven/>
配置来实现。
现在,我们通过创建一个名为AppConfig
的@Configuration
对象,使用Spring的两个注解@ComponentScan
和@EnableWebMvc
实现上述相似的功能。
package org.example.config;
import org.springframework.context.annotation.ComponentScan;
import org.springframework.context.annotation.Configuration;
import org.springframework.web.servlet.config.annotation.EnableWebMvc;
@Configuration
@EnableWebMvc
@ComponentScan(basePackages = "org.example.controller")
public class AppConfig {
}
启动应用,打开浏览器输入http://localhost:8080/test,显示结果。
访问应用
至此,我们可以完全不再使用web.xml文件完成Spring Web MVC工程的初始化了。
3 后续
后面会再增加一篇文章,简单介绍Java Config模式下初始化Spring Web MVC的几种常用模式。
5 结论
简单东西的背后往往是复杂的实现。哪有什么岁月静好,只是有人替你负重前行罢了。