Spring in Acton 4读书笔记之Spring MVC高级配置

上一篇文章中讲解了Spring MVC的基础配置,本文对应Spring in Action(Spring实战)第四版第七章中(7.1.1 Customizing DispatcherServlet configuration)和(7.1.2 Adding additional servlets and filters)的内容,将讲解如何自定义Spring MVC的配置。

如同在上一篇文章所介绍的,任何继承了AbstractAnnotationConfigDispatcherServletInitializer的类都会自动被用来在应用程序DispatcherServlet上下文中配置DispatcherServlet和其它应用上下文。AbstractAnnotationConfigDispatcherServletInitializer定义了三个抽象方法,getServletMappings,getServletConfigClasses以及getRootConfigClasses,分别定义默认的servlet映射、DispatcherServlet上下文配置文件以及其它(中间层和后端)应用上下文配置文件。继承了AbstractAnnotationConfigDispatcherServletInitializer的类必须实现这三个方法。

为DispatcherServlet添加自定义配置

除了以上三个一定要进行的配置外,根据使用场景的不同,有时需要进行一些其它的配置。AbstractAnnotationConfigDispatcherServletInitializer提供了一些方法,当有需要时,可以通过覆盖这些方法,提供额外的配置。比如customizeRegistration方法,AbstractAnnotationConfigDispatcherServletInitializer在servlet上下文中注册了DispatcherServlet之后,会调用customizeRegistration方法,通过覆盖customizeRegistration方法,可以为DispatcherServlet提供额外配置。比如下面的代码就是在处理类型为multipart的请求,将临时文件夹定义为/tmp/spittr/uploads。

1
2
3
4
5
@Override
protected void customizeRegistration(Dynamic registration) {
registration.setMultipartConfig(
new MultipartConfigElement("/tmp/spittr/uploads"));
}

添加自定义的servlet,filter和listener

AbstractAnnotationConfigDispatcherServletInitializer会创建DispatcherServlet和ContextLoaderListener。但是如果想要添加额外的servlet,filter和listener,需要自己再创建。幸运的是,要在web容器中添加组件,只需要创建initializer类。最简单的方式就是实现Spring的WebApplicationInitializer接口。下面的代码注册了一个新的servlet,并且为这个servlet定义了mapping。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
package com.myapp.config;
import javax.servlet.ServletContext;
import javax.servlet.ServletException;
import javax.servlet.ServletRegistration.Dynamic;
import org.springframework.web.WebApplicationInitializer;
import com.myapp.MyServlet;
public class MyServletInitializer implements WebApplicationInitializer {
@Override
public void onStartup(ServletContext servletContext)
throws ServletException {
Dynamic myServlet =
servletContext.addServlet("myServlet", MyServlet.class);
myServlet.addMapping("/custom/**");
}
}

下面的代码为相应的servletContext新增了一个filter。

1
2
3
4
5
6
7
@Override
public void onStartup(ServletContext servletContext)
throws ServletException {
javax.servlet.FilterRegistration.Dynamic filter =
servletContext.addFilter("myFilter", MyFilter.class);
filter.addMappingForUrlPatterns(null, false, "/custom/*");
}

可以看到,WebApplicationInitializer非常灵活,但是如果只是想给DispatcherServlet增加filter,可以直接使用AbstractAnnotationConfigDispatcherServletInitializer的getServletFilters方法。

1
2
3
4
@Override
protected Filter[] getServletFilters() {
return new Filter[] { new MyFilter() };
}

小结

我们可以使用AbstractAnnotationConfigDispatcherServletInitializer生成和配置DispatcherServlet以及ContextLoaderListener,以对Spring MVC进行一些配置,还可以使用WebApplicationInitializer,为web容器添加额外的servlet,filter和listener。

本文简单提及了如何处理multipart的请求,在下篇文章中,将对此进行详细讲解。

© 2021 谈谈IT All Rights Reserved. 本站访客数人次 本站总访问量
Theme by hiero