之前我有篇博文已经说过不推荐使用 Spring Boot,如今我再深挖 Spring MVC,更发掘出 Spring MVC 不俗的潜力。
零配置:去除所有 xml消灭 XML 配置这个话题不新鲜,老早就有,但完全去掉 xml 好像不行。不管怎么样我们先朝着这个方向走。
配置 Spring MVC首先是 WebApplicationInitializer,实现该接口的类会在 Servlet 容器启动时自动加载并运行。在其 onStartup(ServletContext servletCxt) 事件中,配置 MVC,主要是一个 Listener 和一个 Servlet。
servletCxt.addListener(new ContextLoaderListener()); // 监听器
相当于
org.springframework.web.context.ContextLoaderListener
其次是 Dispatcher 的 Servlet。
ServletRegistration.Dynamic registration = servletCxt.addServlet("dispatcher", new DispatcherServlet(new GenericWebApplicationContext()));registration.addMapping("/");registration.setLoadOnStartup(1);
通过上述方法你完全可以抛弃 web.xml 配置。
注入组件旧的方式是在 applicationContext.xml 注入组件,你仍然可以那样子用,指定 xml 路径:
servletCxt.setInitParameter("contextConfigLocation", "classpath:applicationContext.xml");
同时也可以用代码和注解来代替,例如。
如果不想在 WebApplicationInitializer 当前类中注入,可以另设一个类专门注入组件。
AnnotationConfigWebApplicationContext webCxt = new AnnotationConfigWebApplicationContext();// spring mvc 的配置webCxt.register(WebConfig.class);ServletRegistration.Dynamic registration = servletCxt.addServlet("dispatcher", new DispatcherServlet(webCxt));
Spring MVC 的配置
旧方式:
然后要配置一下,否则不起效。多数文章介绍在 web.xml 里面配置的,这里介绍一个零配置的方法:registration.setMultipartConfig(new MultipartConfigElement("c:/temp", 50000000, 50000000, 0))。
然后写一个控制器接受上传:
import java.io.File;import org.springframework.beans.factory.annotation.Value;import org.springframework.web.bind.annotation.RequestMapping;import org.springframework.web.bind.annotation.RequestMethod;import org.springframework.web.bind.annotation.RequestParam;import org.springframework.web.bind.annotation.ResponseBody;import org.springframework.web.bind.annotation.RestController;import org.springframework.web.multipart.MultipartFile;import net.bingosoft.clouldapp.data_service.api.baseApiController;@RestController@RequestMapping("/api@Beanpublic WebMvcConfigurer corsConfigurer() {return new WebMvcConfigurer() {@Overridepublic void addCorsMappings(CorsRegistry registry) {registry.addMapping("public class CorsFilter implements Filter { @Override public void doFilter(ServletRequest req, ServletResponse resp, FilterChain chain) throws IOException, ServletException { allowCORS((HttpServletResponse) resp); chain.doFilter(req, resp); } @Override public void init(FilterConfig arg0) { } @Override public void destroy() { } public static void allowCORS(HttpServletResponse resp) { resp.setHeader("Access-Control-Allow-Origin", "*"); resp.setHeader("Access-Control-Allow-Methods", "*"); resp.setHeader("Access-Control-Max-Age", "3600"); resp.setHeader("Access-Control-Allow-Headers", "*"); resp.setHeader("Access-Control-Allow-Credentials", "true"); } public static void forTestCrossDomain(HttpServletResponse resp) { if (Version.isDebug) allowCORS(resp); }}
不用 web.xml 登记过滤器。
// 全部允许跨域FilterRegistration.Dynamic filterReg = servletCxt.addFilter("Cors", new CorsFilter());filterReg.addMappingForUrlPatterns(null, true, "/*");
UTF-8 编码老问题,
FilterRegistration.Dynamic filterReg = servletCxt.addFilter("InitMvcRequest", new CharacterEncodingFilter("UTF-8"));filterReg.addMappingForUrlPatterns(null, true, "/*");