Spring 4 官方文档学习(②)Web MVC 框架之编码式Servlet容器初始化

来源:互联网 发布:java log4j xml配置 编辑:程序博客网 时间:2024/05/24 16:14

在Servlet 3.0+ 环境中,你可以编码式配置Servlet容器,用来代替或者结合 web.xml文件。下面是注册DispatcherServlet

  1. import org.springframework.web.WebApplicationInitializer;
  2.  
  3. public class MyWebApplicationInitializer implements WebApplicationInitializer {
  4.  
  5. @Override
  6. public void onStartup(ServletContext container) {
  7. XmlWebApplicationContext appContext = new XmlWebApplicationContext();
  8. appContext.setConfigLocation("/WEB-INF/spring/dispatcher-config.xml");
  9.  
  10. ServletRegistration.Dynamic registration = container.addServlet("dispatcher", new DispatcherServlet(appContext));
  11. registration.setLoadOnStartup(1);
  12. registration.addMapping("/");
  13. }
  14.  
  15. }

WebApplicationInitializer 是由Spring MVC提供的一个接口,可以让你的实现被探测到,并被自动用于初始化任何Servlet 3 容器。 它的一个抽象基类实现是 AbstractDispatcherServletInitializer,可以更容易的注册DispatcherServlet -- 只需要重写相应的方法、指定servlet的映射、指定DispatcherServlet配置的位置即可。

在基于Java的Spring配置中推荐这样做:

  1. public class MyWebAppInitializer extends AbstractAnnotationConfigDispatcherServletInitializer {
  2.  
  3. @Override
  4. protected Class<?>[] getRootConfigClasses() {
  5. return null;
  6. }
  7.  
  8. @Override
  9. protected Class<?>[] getServletConfigClasses() {
  10. return new Class[] { MyWebConfig.class };
  11. }
  12.  
  13. @Override
  14. protected String[] getServletMappings() {
  15. return new String[] { "/" };
  16. }
  17.  
  18. }

如果使用基于XML的Spring配置,应该直接继承 AbstractDispatcherServletInitializer(注意,基于Java的配置是继承的AbstractAnnotationConfigDispatcherServletInitializer):

  1. public class MyWebAppInitializer extends AbstractDispatcherServletInitializer {
  2.  
  3. @Override
  4. protected WebApplicationContext createRootApplicationContext() {
  5. return null;
  6. }
  7.  
  8. @Override
  9. protected WebApplicationContext createServletApplicationContext() {
  10. XmlWebApplicationContext cxt = new XmlWebApplicationContext();
  11. cxt.setConfigLocation("/WEB-INF/spring/dispatcher-config.xml");
  12. return cxt;
  13. }
  14.  
  15. @Override
  16. protected String[] getServletMappings() {
  17. return new String[] { "/" };
  18. }
  19.  
  20. }

AbstractDispatcherServletInitializer 还提供了一种便捷的方式来添加Filter实例,并让它们自动被映射到DispatcherServlet(就是添加到DispatcherServlet映射的链路上):

  1. public class MyWebAppInitializer extends AbstractDispatcherServletInitializer {
  2.  
  3. // ...
  4.  
  5. @Override
  6. protected Filter[] getServletFilters() {
  7. return new Filter[] { new HiddenHttpMethodFilter(), new CharacterEncodingFilter() };
  8. }
  9.  
  10. }

注意,添加的每个filter都有一个默认的name -- 基于其类型,且会被自动映射到DispatcherServlet

AbstractDispatcherServletInitializer 的isAsyncSupported protected method,可以用来启用DispatcherServlet和所有映射到它的filters的异步支持。默认,已启用,true。

最后,如果你需要更进一步的定制DispatcherServlet,你可以重写 createDispatcherServlet method。

官方文档地址:

http://docs.spring.io/spring/docs/current/spring-framework-reference/html/mvc.html#mvc-container-config

0
阅读全文
0 0
原创粉丝点击