Spring MVC的定制配置需要我们的配置类继承一个WebMvcConfigurerAdapter类,并在此类上使用@EnableWebMvc注解,来开启对Spring MVC的配置支持。
程序的静态文件(js、css、image)等需要直接访问,这时我么需要在配置里重写addResourceHandlers。
示例:
/**
* 对外暴露的访问路径(静态资源)
* @param registry
*/
@Override
public void addResourceHandlers(ResourceHandlerRegistry registry){
registry.addResourceHandler("/assets/**").
addResourceLocations("classpath:/assets/");
}
拦截器(interceptor)实现对每一个请求处理前后进行相关的业务处理,类似与Servlet的Filter。实现方式有,可以让普通的Bean实现HandlerInterceptor接口或者继承类HandlerInterceptorAdapter类实现自定义拦截器。
示例:
自定义拦截器DemoInterceptor继承HandlerIntercepterAdapter。
package com.dy.springmvc.interceptor;
import org.springframework.lang.Nullable;
import org.springframework.web.servlet.ModelAndView;
import org.springframework.web.servlet.handler.HandlerInterceptorAdapter;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
/**
* Author:dy_bom
* Description: 配置拦截器Bean
* Date:Created in 上午1:10 2018/4/12
* Copyright (c) [email protected] All Rights Reserved.
*/
public class DemoInterceptor extends HandlerInterceptorAdapter{
@Override
public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler) throws Exception {
long startTime = System.currentTimeMillis();
request.setAttribute("startTime",startTime);
return super.preHandle(request, response, handler);
}
@Override
public void postHandle(HttpServletRequest request, HttpServletResponse response, Object handler, @Nullable ModelAndView modelAndView) throws Exception {
long startTime =(Long) request.getAttribute("startTime");
request.removeAttribute("startTime");
long endTime = System.currentTimeMillis();
System.out.println("本次请求处理时间为:"+new Long(endTime-startTime) +"ms");
request.setAttribute("handlingTime",endTime-startTime);
}
}
加入配置,注入Bean:
/**
* 注入拦截器
* @return
*/
@Bean
public DemoInterceptor demoInterceptor(){
return new DemoInterceptor();
}
/**
* 注册拦截器
* @param registry
*/
@Override
public void addInterceptors(InterceptorRegistry registry){
registry.addInterceptor(demoInterceptor());
}
通过该注解,我们可以将对于控制器的全局配置放在同一个位置,注解了@Controller的类的方法可使用@ExceptionHandler、@InitBinder、@ModelAttribute注解到方法上。
@ExceptionHandler:用于全局处理控制器里的异常。
@InitBinder:用来设置WebDataBinder,自动绑定前台请求参数到Model中。
@ModelAttribute:绑定键值对到Model里。
示例:
定制ControllerAdvice
package com.dy.springmvc.advice;
import org.springframework.ui.Model;
import org.springframework.web.bind.WebDataBinder;
import org.springframework.web.bind.annotation.ControllerAdvice;
import org.springframework.web.bind.annotation.ExceptionHandler;
import org.springframework.web.bind.annotation.InitBinder;
import org.springframework.web.bind.annotation.ModelAttribute;
import org.springframework.web.servlet.ModelAndView;
/**
* Author:dy_bom
* Description: 声明一个控制器建言 @ControllerAdvice组合了@Component,自动注册为Bean
* Date:Created in 上午1:22 2018/4/12
* Copyright (c) [email protected] All Rights Reserved.
*/
@ControllerAdvice
public class ExceptionHandlerAdvice {
/**
* 异常全局处理,拦截所有的异常
*
* @param exception
* @return
*/
@ExceptionHandler(value = Exception.class)
public ModelAndView exception(Exception exception) {
//error页面
ModelAndView modelAndView = new ModelAndView("error");
modelAndView.addObject("errorMessage", exception.getMessage());
return modelAndView;
}
/**
* 键值对将添加到全局
* 注解将键值对添加到全局,
* 所有注解@RequestMapping的方法可以获取此键值对
* @param model
*/
@ModelAttribute
public void addAttributes(Model model) {
model.addAttribute("msg", "额外信息");
}
/**
* 定制webDataBinder
* 忽略request参数的id
* @param webDataBinder
*/
@InitBinder
public void initBinder(WebDataBinder webDataBinder) {
webDataBinder.setDisallowedFields("id");
}
}
1、快捷的ViewController
在一些控制器中,有一些简单的页面跳转代码,如:
@Controller
public class HelloController {
@GetMapping({"/index", "/"})
public String hello() {
return "index";
}
}
我们可以在配置中,重写addViewControllers方法,如下:
/**
* 快捷的控制器配置
*
* @param registry
*/
@Override
public void addViewControllers(ViewControllerRegistry registry) {
registry.addViewController("/index").
setViewName("/index");
}
1、文件上传配置
文件上传功能,Spring MVC可以通过配置一个MultipartResolver来上传文件。在控制器中通过MultipartFile file来接受文件。
示例:
配置MultipartResolver
/**
* 文件上传
* @return
*/
@Bean
public MultipartResolver multipartResolver() {
CommonsMultipartResolver multipartResolver =
new CommonsMultipartResolver();
multipartResolver.setMaxUploadSize(1000000);
return multipartResolver;
}
控制器:
@Controller
public class UploadController {
/**
* @param file
* @return
*/
@PostMapping("/upload")
public @ResponseBody
String upload(MultipartFile file) {
try {
FileUtils.writeByteArrayToFile(new File("/tmp/logs/" + file.getOriginalFilename()), file.getBytes());
return "OK";
} catch (Exception e) {
e.printStackTrace();
return "wrong";
}
}
}
代码:点我
上一篇:Spring MVC基础