欢迎您访问365答案网,请分享给你的朋友!
生活常识 学习资料

SpringMVC用起来还是很香的

时间:2023-06-09

之前我有篇博文已经说过不推荐使用 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 的配置

等价代替。

旧方式:

StandardServletMultipartResolver resolver = new StandardServletMultipartResolver();resolver.setResolveLazily(true);// resolveLazily属性启用是为了推迟文件解析,以在在 UploadAction 中捕获文件大小异常return resolver;}

然后要配置一下,否则不起效。多数文章介绍在 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, "/*");

Copyright © 2016-2020 www.365daan.com All Rights Reserved. 365答案网 版权所有 备案号:

部分内容来自互联网,版权归原作者所有,如有冒犯请联系我们,我们将在三个工作时内妥善处理。