【SpringMVC】SpringMVC基础-静态资源映射、拦截器配置、@ControllerAdvice与其他基本配置(2)

简介: 【SpringMVC】SpringMVC基础-静态资源映射、拦截器配置、@ControllerAdvice与其他基本配置

@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:演示控制器
 */
@Controller
public 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

image.png

image.png

可以看到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

image.png



在路径匹配参数配置


在Spring MVC中,路径参数如果带”.”的话,”.”后面的值都将被忽略,例如:

我们在AdviceController.java中增加代码:

    @RequestMapping("pathvar/{str}")
    public @ResponseBody String pathvarDemo(@PathVariable String str){
        return "str:"+str;
    }

接下来访问:http://localhost:8080/springMVC3/pathvar/chenhaoxiang.hncu


结果如下:

image.png


可以看到”.”后面的参数没有传过去


我们可以这样解决、通过重写configurePathMatch方法可不忽略”.”后面的参数,代码如下(写在Spring MVC配置类中):

    @Override
    public void configurePathMatch(PathMatchConfigurer configurer) {
        configurer.setUseSuffixPatternMatch(false);//不忽略 "."后面的参数
    }

这个时候,我们重新运行在看,继续访问刚才的地址

image.png

本篇博客涉及到的源码链接:

->点击访问源码-©CHX

目录
相关文章
|
27天前
|
缓存 Java 应用服务中间件
SpringMVC入门到实战------七、SpringMVC创建JSP页面的详细过程+配置模板+实现页面跳转+配置Tomcat。JSP和HTML配置模板的差异对比(二)
这篇文章详细介绍了在SpringMVC中创建JSP页面的全过程,包括项目的创建、配置、Tomcat的设置,以及如何实现页面跳转和配置模板解析器,最后还对比了JSP和HTML模板解析的差异。
SpringMVC入门到实战------七、SpringMVC创建JSP页面的详细过程+配置模板+实现页面跳转+配置Tomcat。JSP和HTML配置模板的差异对比(二)
|
4月前
|
前端开发 Java Apache
JAVAEE框架技术之6-springMVC拦截器和文件上传功能
JAVAEE框架技术之6-springMVC拦截器和文件上传功能
92 0
JAVAEE框架技术之6-springMVC拦截器和文件上传功能
序-Servlet和SpringMVC的联系和区别-配置路径先想好使用的使用的方法,然后匹配的需要的技术
序-Servlet和SpringMVC的联系和区别-配置路径先想好使用的使用的方法,然后匹配的需要的技术
|
4月前
SpringMVC拦截器的介绍,拦截器的基本实现,拦截器链配置
SpringMVC拦截器的介绍,拦截器的基本实现,拦截器链配置
43 2
|
4月前
|
前端开发 Java Spring
请求映射掌握:探讨Spring MVC中@RequestMapping注解的妙用
请求映射掌握:探讨Spring MVC中@RequestMapping注解的妙用
122 1
请求映射掌握:探讨Spring MVC中@RequestMapping注解的妙用
|
4月前
|
缓存 前端开发 Java
视图映射掌握:解析Spring MVC视图解析器的全方位指南
视图映射掌握:解析Spring MVC视图解析器的全方位指南
60 1
|
4月前
|
前端开发 Java 应用服务中间件
SpringMvc拦截器和手写模拟SpringMvc工作流程源码详解
MVC是一种软件架构的思想,将软件按照模型、视图、控制器来划分。 M: Model,模型层,指工程中的JavaBean,作用是处理数据。 JavaBean分为两类: 1.实体类Bean:专门存储业务数据的,如Student User等 2.业务处理Bean:指Service或Dao对象,专门用于处理业务逻辑和数据访问。
|
4月前
|
设计模式 前端开发 JavaScript
Spring MVC(一)【什么是Spring MVC】
Spring MVC(一)【什么是Spring MVC】
|
3月前
|
设计模式 前端开发 Java
【Spring MVC】快速学习使用Spring MVC的注解及三层架构
【Spring MVC】快速学习使用Spring MVC的注解及三层架构
36 1
|
3月前
|
前端开发 Java 应用服务中间件
Spring框架第六章(SpringMVC概括及基于JDK21与Tomcat10创建SpringMVC程序)
Spring框架第六章(SpringMVC概括及基于JDK21与Tomcat10创建SpringMVC程序)