【SpringMVC】SpringMVC基础-静态资源映射、拦截器配置、@ControllerAdvice与其他基本配置
来源:互联网 发布:java单链表面试实现 编辑:程序博客网 时间:2024/05/20 05:47
转载请注明出处:http://blog.csdn.net/qq_26525215
本文源自【大学之旅_谙忆的博客】
Spring MVC的定制配置需要我们的配置类继承一个WebMvcConfigurerAdapter类,并在此类使用@EnableWebMvc注解,来开启对Spring MVC的配置支持,这样我们就可以重写这个类的方法,完成我们的常用配置。
静态资源映射
程序的静态文件(js、css、图片)等需要直接访问,这时我们可以在配置里重写addResourceHandlers方法来实现。
示例
1、添加静态资源,我们在src/main/resources下建立assets/js目录,并复制一个jquery.js放置在此目录下,如下图:
package cn.hncu;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;/** * Created with IntelliJ IDEA. * User: 陈浩翔. * Date: 2017/2/21. * Time: 下午 4:09. * Explain:配置类 */@Configuration@EnableWebMvc //开启SpringMVC支持,如无此注解,重写WebMvcConfigurerAdapter类的方法无效@ComponentScan("cn.hncu")public class MyMvcConfig extends WebMvcConfigurerAdapter{ //集成WebMvcConfigurerAdapter类,重写其方法可对Spring MVC进行配置 @Bean public InternalResourceViewResolver viewResolver(){ InternalResourceViewResolver viewResolver = new InternalResourceViewResolver(); viewResolver.setPrefix("/WEB-INF/classes/views/"); viewResolver.setSuffix(".jsp"); viewResolver.setViewClass(JstlView.class); return viewResolver; } @Override public void addResourceHandlers(ResourceHandlerRegistry registry) { registry.addResourceHandler("/static/**").addResourceLocations("classpath:/assets/"); //addResourceHandler指的是对外暴露的访问路径,addResourceLocations指的是文件放置的目录, }}
输入访问地址:http://localhost:8080/springMVC3/static/js/jquery.js
拦截器配置
拦截器(Interceptor)实现对每一个请求处理前后进行相关的业务处理,类似于Servlet的Filter。
可让普通的Bean实现HanlderInterceptor接口或者集成HandlerInterceptorAdapter类实现自定义拦截器。
通过重写WebMvcConfigurerAdapter的addInterceptors方法来注册自定义的拦截器,本节演示一个简单的拦截器的开发和配置,业务含义为计算每一次请求的处理时间。
示例
package cn.hncu.filter;import org.springframework.web.servlet.ModelAndView;import org.springframework.web.servlet.handler.HandlerInterceptorAdapter;import javax.servlet.http.HttpServletRequest;import javax.servlet.http.HttpServletResponse;/** * Created with IntelliJ IDEA. * User: 陈浩翔. * Date: 2017/2/21. * Time: 下午 5:00. * Explain:拦截器 *///配置拦截器的Beanpublic class DemoInterceptor extends HandlerInterceptorAdapter{ @Override public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler) throws Exception { //重写preHandle方法,在请求发生前执行 long startTime = System.currentTimeMillis(); request.setAttribute("startTime",startTime); return true; } @Override public void postHandle(HttpServletRequest request, HttpServletResponse response, Object handler, ModelAndView modelAndView) throws Exception { //重写postHandle方法,在请求完成后执行 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); }}
如果需要拦截特定的网址,可利用正则映射到需要拦截的路径 ,然后在preHandle方法中判断request.getRequestURL().toString(),进行匹配,用matches方法。
配置
写在MyMvcConfig中
@Bean //配置拦截器的Bean public DemoInterceptor demoInterceptor(){ return new DemoInterceptor(); } @Override public void addInterceptors(InterceptorRegistry registry) { registry.addInterceptor(demoInterceptor()); }
写一个控制器
package cn.hncu.controller;import org.springframework.stereotype.Controller;import org.springframework.web.bind.annotation.RequestMapping;/** * Created with IntelliJ IDEA. * User: 陈浩翔. * Date: 2017/2/21. * Time: 下午 5:23. * Explain:控制器 */@Controller@RequestMapping("index")public class Index { @RequestMapping("/") public String index(){ return "index"; }}
添加index.jsp
运行后,访问http://localhost:8080/springMVC3/index/
访问静态资源不会拦截哦!也就是直接访问.js的那个文件不会被拦截。
@ControllerAdvice
定制ControllerAdvice
package cn.hncu.exception;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;/** * Created with IntelliJ IDEA. * User: 陈浩翔. * Date: 2017/2/21. * Time: 下午 6:04. * Explain:定制ControllerAdvice */@ControllerAdvice //声明一个控制器建言,@ControllerAdvice组合了@Component注解,所以自动注册为public class ExceptinHandlerAdvice { @ExceptionHandler(value = Exception.class) //@ExceptionHandler在此处定义全局处理,通过@ExceptionHandler的value属性可过滤拦截的条件,在此处我们可以看出我们拦截所有的Exception public ModelAndView exception(Exception e, WebRequest request){ ModelAndView modelAndView = new ModelAndView("error"); //error页面 modelAndView.addObject("errorMessage",e.getMessage()); return modelAndView; } @ModelAttribute //此处使用@ModelAttribute 注解将键值对添加到全局,所有注解@RequestMapping的方法可获得此键值对 public void addAttributes(Model model){ model.addAttribute("msg","额外信息"); } @InitBinder //通过@InitBinder 注解定制 WebDataBinder public void initBinder(WebDataBinder webDataBinder){ webDataBinder.setDisallowedFields("id"); //此处演示忽略request 参数的id }}
演示控制器
package cn.hncu.controller;import cn.hncu.model.DemoObj;import org.springframework.stereotype.Controller;import org.springframework.web.bind.annotation.ModelAttribute;import org.springframework.web.bind.annotation.RequestMapping;/** * Created with IntelliJ IDEA. * User: 陈浩翔. * Date: 2017/2/21. * Time: 下午 8:08. * Explain:演示控制器 */@Controllerpublic class AdviceController { @RequestMapping("advice") public String getSomething(@ModelAttribute("msg") String msg , DemoObj obj){ System.out.println("id:"+obj.getId()+" , name:"+obj.getName()); //访问 http://localhost:8080/springMVC3/advice?id=1&name=chx //id:null , name:chx -因为id被过滤掉了! throw new IllegalArgumentException("非常抱歉,参数有误/"+"来自@ModelAttribute:"+msg); }}
异常展示页面
在src/main/resources/views下,新建error.jsp,内容如下:
<%-- Created by IntelliJ IDEA. User: 陈浩翔 Date: 2016/12/18 Time: 下午 12:45 To change this template use File | Settings | File Templates.--%><%@taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core" %><%@ page contentType="text/html;charset=UTF-8" language="java" pageEncoding="UTF-8" %><html><head> <title>@ControllerAdvice Demo</title></head><body> <pre>Welcome to Spring MVC</pre> <br/> ${errorMessage}</body></html>
运行
访问:http://localhost:8080/springMVC3/advice?id=1&name=chx
可以看到id被过滤掉了!
其他配置
快捷的ViewCOntroller
在前面我们配置页面转向的时候是这样写代码的:
@Controller@RequestMapping("index")public class Index { @RequestMapping("/") public String index(){ return "index"; }}
此处无任何业务处理,只是简单的页面转向,写了很多冗余代码,在实际开发中会涉及大量这样的页面转向,如果都这样写会很麻烦。
所以,我们可以通过在配置中重写addViewControllers来简化配置:
@Override public void addViewControllers(ViewControllerRegistry registry) { registry.addViewController("/inn").setViewName("/in"); //addViewController是访问的URL,setViewName是设置in.jsp }
这样实现的代码更简洁,管理更集中。
访问:http://localhost:8080/springMVC3/inn
在路径匹配参数配置
在Spring MVC中,路径参数如果带”.”的话,”.”后面的值都将被忽略,例如:
我们在AdviceController.java中增加代码:
@RequestMapping("pathvar/{str}") public @ResponseBody String pathvarDemo(@PathVariable String str){ return "str:"+str; }
接下来访问:http://localhost:8080/springMVC3/pathvar/chenhaoxiang.hncu
结果如下:
可以看到”.”后面的参数没有传过去
我们可以这样解决、通过重写configurePathMatch方法可不忽略”.”后面的参数,代码如下(写在Spring MVC配置类中):
@Override public void configurePathMatch(PathMatchConfigurer configurer) { configurer.setUseSuffixPatternMatch(false);//不忽略 "."后面的参数 }
这个时候,我们重新运行在看,继续访问刚才的地址
本篇博客涉及到的源码链接:
【->点击访问源码-©CHX】
本文章由[谙忆]编写, 所有权利保留。
欢迎转载,分享是进步的源泉。
转载请注明出处:http://blog.csdn.net/qq_26525215
本文源自【大学之旅_谙忆的博客】
- 【SpringMVC】SpringMVC基础-静态资源映射、拦截器配置、@ControllerAdvice与其他基本配置
- SpringMVC静态资源映射配置
- springmvc配置不拦截静态资源
- SpringMVC配置静态资源不拦截
- SpringMVC配置不拦截静态资源
- springmvc 配置静态资源后拦截失败
- springmvc资源映射配置
- SpringMVC-配置静态资源
- SpringMVC配置静态资源
- springmvc 拦截器配置
- springMVC拦截器配置
- springMvc拦截器配置
- SpringMvc拦截器配置
- SpringMvc配置拦截器
- springmvc拦截器配置
- SpringMvc拦截器配置
- springmvc拦截器配置
- springmvc拦截器配置
- Android-网络
- Java测试守护线程的代码
- c语言用辗转相除法实现求最大公约数
- http://blog.chinaunix.net/uid-26335251-id-3508651.html
- JavaEmail
- 【SpringMVC】SpringMVC基础-静态资源映射、拦截器配置、@ControllerAdvice与其他基本配置
- Python | 用Pyinstaller打包发布exe应用
- bootstrap模态框居中
- CSDN markdown编辑器改字体颜色和大小
- 控制台程序 打印“爱心”
- 【吐血整理】SVN命令行,Subversion的正确使用姿势,让版本控制更简单~
- 通过文件读取显示分数与对话框中
- php 将价格改为千位,形式
- Android 模拟器启动异常