1.基本配置包括:
(1)静态资源映射
(2)拦截器配置
(3)@ControllerAdvice
(4)其他配置
==>1)快捷的ViewController
==>2)路径匹配参数配置
2.静态资源映射
(1)程序的静态资源需要直接访问,可以在配置里继承WebMvcConfigurerAdapter并重写addResourceHandlers
(2)示例
package com.wisely.highlight_springmvc7;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.ComponentScan;
import org.springframework.context.annotation.Configuration;
import org.springframework.web.servlet.config.annotation.EnableWebMvc;
import org.springframework.web.servlet.config.annotation.ResourceHandlerRegistry;
import org.springframework.web.servlet.config.annotation.WebMvcConfigurerAdapter;
import org.springframework.web.servlet.view.InternalResourceViewResolver;
import org.springframework.web.servlet.view.JstlView;
/**
* 视图解析器,SpringMVC实现ViewResolver,重写resolveViewName(),返回view.view用于使用model,request,response并将渲染的视图返回给浏览器
*/
@Configuration
@EnableWebMvc
@ComponentScan("com.wisely.highlight_springmvc7")
public class MyMvcConfig extends WebMvcConfigurerAdapter {
@Bean
public InternalResourceViewResolver viewResolver(){
InternalResourceViewResolver internalResourceViewResolver = new InternalResourceViewResolver();
internalResourceViewResolver.setPrefix("/WEB-INF/classes/views/");
internalResourceViewResolver.setSuffix(".jsp");
internalResourceViewResolver.setViewClass(JstlView.class);
return internalResourceViewResolver;
}
@Override
public void addResourceHandlers(ResourceHandlerRegistry registry) {
registry.addResourceHandler("/assets/**").addResourceLocations("classpath:/assets/");
}
}
3.拦截器配置
(1)实现对每一个请求处理前后进行相关的业务处理。可让普通的Bean实现HandlerInterceptor接口或者继承HandlerInterceptorAdapter类来实现自定义拦截器
(2)示例
package com.wisely.highlight_springmvc7.interceptor;
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("handleTime", endTime-startTime);
}
}
package com.wisely.highlight_springmvc7;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.ComponentScan;
import org.springframework.context.annotation.Configuration;
import org.springframework.web.servlet.config.annotation.EnableWebMvc;
import org.springframework.web.servlet.config.annotation.InterceptorRegistry;
import org.springframework.web.servlet.config.annotation.ResourceHandlerRegistry;
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_springmvc7.interceptor.DemoInterceptor;
/**
* 视图解析器,SpringMVC实现ViewResolver,重写resolveViewName(),返回view.view用于使用model,request,response并将渲染的视图返回给浏览器
*/
@Configuration
@EnableWebMvc
@ComponentScan("com.wisely.highlight_springmvc7")
public class MyMvcConfig extends WebMvcConfigurerAdapter {
@Bean
public InternalResourceViewResolver viewResolver(){
InternalResourceViewResolver internalResourceViewResolver = new InternalResourceViewResolver();
internalResourceViewResolver.setPrefix("/WEB-INF/classes/views/");
internalResourceViewResolver.setSuffix(".jsp");
internalResourceViewResolver.setViewClass(JstlView.class);
return internalResourceViewResolver;
}
@Override
public void addResourceHandlers(ResourceHandlerRegistry registry) {
registry.addResourceHandler("/assets/**").addResourceLocations("classpath:/assets/");
}
@Bean
public DemoInterceptor demoInterceptor(){
return new DemoInterceptor();
}
@Override
public void addInterceptors(InterceptorRegistry registry) {
registry.addInterceptor(demoInterceptor());
}
}
4.@ControllerAdvice
通过@ControllerAdvice可以将对于控制器的全局配置放置在同一个位置。注解了@Controller的类的方法可使用@ExceptionHandler,@InitBinder,@ModelAttribute注解到方法上,这对所有注解了@RequestMapping的控制器内的方法有效。
@ExceptionHandler:用于全局处理控制器内的异常
@InitBinder:用于设置WebDataBinder。WebDataBinder用来自动绑定前台请求参数到Model中
@ModelAttribute:绑定键值对到Model。可让全局的@RequestMapping都能获得在此处设置的键值对
package com.wisely.highlight_springmvc7.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.context.request.WebRequest;
import org.springframework.web.servlet.ModelAndView;
@ControllerAdvice
public class ExceptionHandlerAdvice {
@ExceptionHandler(value=Exception.class)
public ModelAndView exception(Exception exception,WebRequest request){
ModelAndView modelAndView = new ModelAndView("error");
modelAndView.addObject("errorMessage", exception.getMessage());
return modelAndView;
}
@ModelAttribute
public void addAttributes(Model model){
model.addAttribute("msg","额外信息");
}
@InitBinder
public void initBinder(WebDataBinder webDataBinder){
webDataBinder.setDisallowedFields("id");//忽略id
}
}
package com.wisely.highlight_springmvc7.web.chi4_4;
import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.ModelAttribute;
import org.springframework.web.bind.annotation.RequestMapping;
import com.wisely.highlight_springmvc7.domain.DemoObj;
@Controller
public class AdviceController {
@RequestMapping("/advice")
public String getSomething(@ModelAttribute("msg") String msg,DemoObj obj){
throw new IllegalArgumentException("非常抱歉,参数有误/"+"来自@ModelAttribute:"+msg);
}
}
路径:hightlight_springmvc7\src\main\resources\views
<%@ taglib uri="http://java.sun.com/jsp/jstl/core" prefix="c" %>
<%@ page language="java" contentType="text/html; charset=UTF-8"
pageEncoding="UTF-8" isELIgnored="false" %>
<!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>
<div>
${errorMessage }
</div>
</body>
</html>
测试:http://localhost:8080/highlight_springmvc7/advice?id=1&name=xx
注:如果输出结果原样输出,记得加上
<%@ page isELIgnored="false" %>
5.其他配置
1)快捷的ViewController
还记得mvc系列里快速构建项目,有一个页面转向代码:
@RequestMapping("/index")
public String hello() {
return "index";
}
开发中,这种转向会很多,这样写很麻烦,可以在配置中重写addViewControllers来简化配置
@Override
public void addViewControllers(ViewControllerRegistry registry) {
registry.addViewController("/index").setViewName("/index");
}
2).路径匹配参数配置
路径参数如果带"."的话会忽略"."后面的值,如果不想忽略:
@Override
public void configurePathMatch(PathMatchConfigurer configurer) {
configurer.setUseSuffixPatternMatch(false);
}