Spring MVC 基本配置
在前面还有一小节常见注解就不介绍了,在实际项目中会经常用到,很容易理解。在本实例中相关配置内容都在MyMvcConfig类里编写
1.添加静态资源
配置代码:
(1).在MyMvcConfig类上面加上@EnableWebMvc开启SpringMVC支持
(2).在配置类里面加上静态资源配置,具体详解在注释里
/**
* 配置静态资源访问
* addResourceHandler 值得是对外暴露的访问路径
* addResourceLocations 指的文件放置的目录
*/
@Override
public void addResourceHandlers(ResourceHandlerRegistry registry) {
registry.addResourceHandler("/assets/**").addResourceLocations("classpath:/assets/");
}
2.拦截器配置
拦截器实现对每一个请求处理前后进行相关的业务处理。
在这里讲下拦截器与过滤器的区别:
拦截器interceptor是aop的一种实现,底层是动态代理模式,基于java的反射机制,在spring中只能拦截controller的请求;
过滤器filter是基于函数回调,依赖servlet容器。
拦截器常用于日志处理,拦截未登录用户等等,而过滤器常用于字符编码处理,过滤敏感词汇,压缩响应信息等等。
(1)可以让普通的Bean实现HandlerInterceptor接口或继承HandlerInterceptorAdapter类来定义拦截器
编写一个拦截器类:
package com.just.springmvc4.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("本次请求的处理时间为:"+(endTime-startTime)+"ms");
request.setAttribute("handling Time",endTime-startTime);
}
}
(2).在配置文件中注册自定义的拦截器
@Bean
public DemoInterceptor demoInterceptor(){
return new DemoInterceptor();
}
@Override
public void addInterceptors(InterceptorRegistry registry) {
registry.addInterceptor(demoInterceptor());
}
3.ControllerAdvice
通过@ControllerAdvice,我们可以将对于控制器的全局配置放置在同一个位置
这个东西主要用于处理全局的控制器里的异常,通过@ExceptionHandler来实现
(1).定制ControllerAdvice
package com.just.springmvc4.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我们可以将controller的全剧配置放在同一个位置
* 可以使用 @ExceptionHandler,@ModelAttribute,@InitBinder注解到方法上
* 在Spring4中, @ControllerAdvice通过annotations(), basePackageClasses(), basePackages()方法定制用于选择控制器子集。
*/
@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;
}
/**
* 把值绑定到Model中,使全局@RequestMapping可以获取到该值
*/
@ModelAttribute
public void addAttributes(Model model){
model.addAttribute("msg","额外信息");
}
/**
* 应用到所有@RequestMapping注解方法,在其执行之前初始化数据绑定器
*/
@InitBinder
public void initBinder(WebDataBinder webDataBinder){
webDataBinder.setDisallowedFields("id");
}
}
(2).演示控制器:
package com.just.springmvc4.controller;
import com.just.springmvc4.domain.DemoObj;
import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.ModelAttribute;
import org.springframework.web.bind.annotation.RequestMapping;
@Controller
public class AdviceController {
@RequestMapping("/advice")
public String getSomething(@ModelAttribute("msg") String msg, DemoObj demoObj){
System.out.println("收到的msg:"+msg);
System.out.println("demoObj:"+demoObj.toString());
throw new IllegalArgumentException("非常抱歉,参数有误,来自@ModelAttribute:"+msg);
}
}
(3).error.jsp页面
<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<html>
<head>
<title>ControllerAdvice Demo</title>
</head>
<body>
${errorMessage}
</body>
</html>
(4).结果
4.快捷的ViewController
在配置文件里就可以配置无业务逻辑的controller请求页面跳转
/**
* 无需业务处理,只是简单的页面转向可以使用viewController
* 里面可以设置好几个属性,根据业务使用哪些
*/
@Override
public void addViewControllers(ViewControllerRegistry registry) {
registry.addViewController("/index").setViewName("index");
}
5.路径匹配参数配置
同样,在配置文件里配置,不忽略.后面的参数
/**
* 在SpringMVC中,如果路径参数中有".","."后面的值会被忽略。
* 通过这个配置,可以设置不忽略"."
*/
@Override
public void configurePathMatch(PathMatchConfigurer configurer) {
configurer.setUseSuffixPatternMatch(false);
}
发布者:全栈程序员-用户IM,转载请注明出处:https://javaforall.cn/100313.html原文链接:https://javaforall.cn
【正版授权,激活自己账号】: Jetbrains全家桶Ide使用,1年售后保障,每天仅需1毛
【官方授权 正版激活】: 官方授权 正版激活 支持Jetbrains家族下所有IDE 使用个人JB账号...