springboot实战第四章-Spring MVC 基本配置

springboot实战第四章-Spring MVC 基本配置

Spring MVC 基本配置

在前面还有一小节常见注解就不介绍了,在实际项目中会经常用到,很容易理解。在本实例中相关配置内容都在MyMvcConfig类里编写

1.添加静态资源

springboot实战第四章-Spring MVC 基本配置

配置代码:

(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).结果

springboot实战第四章-Spring MVC 基本配置

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);
    }

版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请联系我们举报,一经查实,本站将立刻删除。

发布者:全栈程序员-站长,转载请注明出处:https://javaforall.net/100313.html原文链接:https://javaforall.net

(0)
全栈程序员-站长的头像全栈程序员-站长


相关推荐

  • C#之AutoEventWireup

    C#之AutoEventWireup原文链接http://blog.sina.com.cn/s/blog_5d2ef8320100fcar.html如果Page指令的AutoEventWireup属性被设置为true(或者如果缺少此属性,因为它默认为true),该页框架将自动调用页事件,即Page_Init和Page_Load方法。在这种情况下,不需要任何显式的Handles子句或委托…

    2022年5月28日
    38
  • mac vscode 格式化代码快捷键(vscode怎么设置快捷键)

    control+G快速找到某一行command+shift+k删除整行代码command+fn+delete删除当前行光标后的所有代码command+delete删除当前行光标前的所有代码option+fn+delete删除当前单词光标后到符号之间的代码option+delete删除当前单词光标前到符号之间的代码…

    2022年4月15日
    327
  • bae7088d064a7707d735e9dcb7a7f092

    bae7088d064a7707d735e9dcb7a7f092XCL:iVBORw0KGgoAAAANSUhEUgAAA9kAAAFoCAIAAADM369EAAAAGXRFWHRTb2Z0d2FyZQBBZG9iZSBJbWFnZVJlYWR5ccllPAAAA2ZpVFh0WE1MOmNvbS5hZG9iZS54bXAAAAAAADw/eHBhY2tldCBiZWdpbj0i77u/IiBpZD0iVzVNME1wQ2VoaUh6cmVTek5UY3pr…

    2022年7月24日
    10
  • 如何学习Python的一些总结

    如何学习Python的一些总结

    2021年10月23日
    48
  • TCP三次握手四次挥手(通俗易懂版)

    TCP三次握手四次挥手(通俗易懂版)TCP连接的建立(三次握手)最开始的时候客户端和服务器都是处于CLOSED状态。主动打开连接的为客户端,被动打开连接的是服务器。三次握手通俗理解:TCP客户端是男孩子,TCP服务器是女孩子,男孩子要追女孩子,首先要建立恋爱关系。需要一个建立恋爱关系的过程。男孩:我们可以恋爱吗?(客户端请求服务器建立连接)女孩:你想追我?想清楚了!(服务器要求客户端确认连接)男孩:没错,你就是我的梦…

    2022年6月22日
    32
  • MFC线程同步—— CCriticalSection类使用

    MFC线程同步—— CCriticalSection类使用多个线程访问临界区时,可以使用临界区对象。临界区对象是一个独占性共享资源,任一时刻只有一个线程可以拥有临界区。拥有临界区的线程可以访问被保护起来的资源或代码段,其他希望进入临界区的线程将被挂起等待,直到拥有临界区的线程放弃临界区时为止。CCriticalSection类的用法:方法一:(1)定义CCriticalSection类的一个全局对象(以使各个线程均能访问):

    2022年7月20日
    13

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注

关注全栈程序员社区公众号