1.静态资源的映射
新增加配置配置类继承WebMvcConfigurerAdapter,并实现其addResourceHandlers方法
2.拦截器的配置
新增加配置配置类继承WebMvcConfigurerAdapter,实现addInterceptors方法。并拦截器类,继承HandlerInterceptorAdapter类
3.全局异常处理@ControllerAdvice
下面为代码实现
一:配置类
import java.util.List; import org.springframework.context.annotation.Bean; import org.springframework.context.annotation.ComponentScan; import org.springframework.context.annotation.Configuration; import org.springframework.http.converter.HttpMessageConverter; import org.springframework.scheduling.annotation.EnableScheduling; import org.springframework.web.multipart.MultipartResolver; import org.springframework.web.multipart.commons.CommonsMultipartResolver; import org.springframework.web.servlet.config.annotation.EnableWebMvc; import org.springframework.web.servlet.config.annotation.InterceptorRegistry; import org.springframework.web.servlet.config.annotation.PathMatchConfigurer; import org.springframework.web.servlet.config.annotation.ResourceHandlerRegistry; import org.springframework.web.servlet.config.annotation.ViewControllerRegistry; import org.springframework.web.servlet.config.annotation.WebMvcConfigurerAdapter; import org.springframework.web.servlet.view.InternalResourceViewResolver; import org.springframework.web.servlet.view.JstlView; import com.wisely.highlight_springmvc4.interceptor.DemoInterceptor; import com.wisely.highlight_springmvc4.messageconverter.MyMessageConverter; @Configuration @EnableWebMvc// 1开启SpringMVC支持,若无此配置,重写WebMvcConfigrerAdapter方法无效 @EnableScheduling @ComponentScan("com.flysun") public class MyMvcConfig extends WebMvcConfigurerAdapter {// 2重写其方法可对SpringMVC进行配置 //静态资源映射 @Bean public InternalResourceViewResolver viewResolver() { InternalResourceViewResolver viewResolver = new InternalResourceViewResolver(); viewResolver.setPrefix("/WEB-INF/classes/views/"); viewResolver.setSuffix(".jsp"); viewResolver.setViewClass(JstlView.class); return viewResolver; } //addResourceLocations指的是文件放置的路径,addResourceHander指的是对外暴露的访问路劲 @Override public void addResourceHandlers(ResourceHandlerRegistry registry) { registry.addResourceHandler("/assets/**").addResourceLocations( "classpath:/assets/"); } @Bean // 配置拦截器的bean public DemoInterceptor demoInterceptor() { return new DemoInterceptor(); } @Override public void addInterceptors(InterceptorRegistry registry) {// 重写addInterceptors方法,注册自己的拦截器 registry.addInterceptor(demoInterceptor()); } @Override public void addViewControllers(ViewControllerRegistry registry) { registry.addViewController("/index").setViewName("/index"); registry.addViewController("/toUpload").setViewName("/upload"); registry.addViewController("/converter").setViewName("/converter"); registry.addViewController("/sse").setViewName("/sse"); registry.addViewController("/async").setViewName("/async"); } @Override public void configurePathMatch(PathMatchConfigurer configurer) { configurer.setUseSuffixPatternMatch(false); } //文件上传时的文件解析 @Bean public MultipartResolver multipartResolver() { CommonsMultipartResolver multipartResolver = new CommonsMultipartResolver(); multipartResolver.setMaxUploadSize(1000000); return multipartResolver; } @Override public void extendMessageConverters(List<HttpMessageConverter<?>> converters) { converters.add(converter()); } @Bean public MyMessageConverter converter(){ return new MyMessageConverter(); } }
二:自定义拦截器类
import javax.servlet.http.HttpServletRequest; import javax.servlet.http.HttpServletResponse; import org.springframework.web.servlet.ModelAndView; import org.springframework.web.servlet.handler.HandlerInterceptorAdapter; 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 true; } @Override public void postHandle(HttpServletRequest request, //请求完成之后执行 HttpServletResponse response, Object handler, 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); } }
三:@ControllerAdvice与全局异常处理类
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.context.request.WebRequest; import org.springframework.web.servlet.ModelAndView; @ControllerAdvice //1声明一个控制器建言,这里面设置的是所有控制器的全局配置,其中下面的三个注解(@ExceptionHandler,@ModelAttribute,@InitBinder)只对加了@RequestMapping的控制器里的方法有效 public class ExceptionHandlerAdvice { @ExceptionHandler(value = Exception.class)//2定义全局异常处理,拦截所有的Exception public ModelAndView exception(Exception exception, WebRequest request) { ModelAndView modelAndView = new ModelAndView("error");// error页面 modelAndView.addObject("errorMessage", exception.getMessage()); return modelAndView; } @ModelAttribute //3所有注解了@RequestMapping的方法都可以获得下面的属性 public void addAttributes(Model model) { model.addAttribute("msg", "额外信息"); } @InitBinder public void initBinder(WebDataBinder webDataBinder) { webDataBinder.setDisallowedFields("id"); //5忽略所有请求request中的id参数 } }
四:运行控制器
import org.springframework.stereotype.Controller; import org.springframework.web.bind.annotation.ModelAttribute; import org.springframework.web.bind.annotation.RequestMapping; import com.wisely.highlight_springmvc4.domain.DemoObj; @Controller public class AdviceController { @RequestMapping("/advice") public String getSomething(@ModelAttribute("msg") String msg,DemoObj obj){//1获取全局配置中的model设置的属性msg throw new IllegalArgumentException("非常抱歉,参数有误/"+"来自@ModelAttribute:"+ msg); } }
五:error.jsp页面:
<%@ taglib uri="http://java.sun.com/jsp/jstl/core" prefix="c" %> <%@ page language="java" contentType="text/html; charset=UTF-8" pageEncoding="UTF-8"%> <!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd"> <html> <head> <meta http-equiv="Content-Type" content="text/html; charset=UTF-8"> <title>@ControllerAdvice Demo</title> </head> <body> ${errorMessage} </body> </html>
运行结果如下:
六:文件上传
文件上传的页面如下:
<%@ page language="java" contentType="text/html; charset=UTF-8" pageEncoding="UTF-8"%> <!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd"> <html> <head> <meta http-equiv="Content-Type" content="text/html; charset=UTF-8"> <title>upload page</title> </head> <body> <div class="upload"> <form action="upload" enctype="multipart/form-data" method="post"> <input type="file" name="file"/><br/> <input type="submit" value="上传"> </form> </div> </body> </html>
文件上传的controller
import java.io.File; import java.io.IOException; import org.apache.commons.io.FileUtils; import org.springframework.stereotype.Controller; import org.springframework.web.bind.annotation.RequestMapping; import org.springframework.web.bind.annotation.RequestMethod; import org.springframework.web.bind.annotation.ResponseBody; import org.springframework.web.multipart.MultipartFile; @Controller public class UploadController { @RequestMapping(value = "/upload",method = RequestMethod.POST) public @ResponseBody String upload(MultipartFile file) {//1 try { FileUtils.writeByteArrayToFile(new File("d:/upload/"+file.getOriginalFilename()), file.getBytes()); //2 return "ok"; } catch (IOException e) { e.printStackTrace(); return "wrong"; } } }
上传成功页面: