Spring MVC 续

news2024/11/16 23:36:51

一、拦截器

1.介绍拦截器

1.拦截器(springmvc提供)

2.只拦截控制单元(生效必须配置拦截器)

3.会拦截静态资源,使用拦截器时,尽量使用局部配置,配置拦截的控制单元即可。

注意:只有URL匹配到了控制单元,拦截器才能生效。

4.拦截器中实现的三方法执行的顺序:

  • 执行控制单元之前 执行拦截器preHandle方法。对请求进行相关的处理。
  • 执行控制单元之后 ,视图解析器解析渲染视图之前,执行拦截器postHandle方法。对应modelandview进行相关操作。
  • 向客户端完成响应 执行拦截器afterCompletion方法。进行相关结尾的操作,无论是否出现异常都会执行。
     

2. 使用拦截器

2.1 创建拦截器类

在src下创建包,包名随意,并创建java类实现HandlerInterceptor接口。并实现preHandle、postHandle、afterCompletion三个方法。

public class MyInterceptor implements HandlerInterceptor {

    @Override
    public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler) throws Exception {
        System.out.println("preHandle执行");
        //false拦截器不放行
        return true;
    }

    @Override
    public void postHandle(HttpServletRequest request, HttpServletResponse response, Object handler, ModelAndView modelAndView) throws Exception {
        System.out.println("postHandle执行");
    }

    @Override
    public void afterCompletion(HttpServletRequest request, HttpServletResponse response, Object handler, Exception ex) throws Exception {
        System.out.println("afterCompletion执行");
    }
}

2.2 配置拦截器

  <mvc:interceptors>
       
 <!--会拦截静态资源,使用拦截器时,尽量使用局部配置,配置拦截的控制单元即可。 -->
       
<!-- 1.全局的配置,全部的控制单元执行该拦截器 -->
        
<!--         <bean class="com.zqwl.interceptor.MyInterceptor"/>-->

       

<!-- 局部的配置,符合配置拦截路径的控制单元,执行该拦截器 -->
<!--   2. 局部拦截器配置-->
        <mvc:interceptor>
<!--            拦截的控制单元-->
            <mvc:mapping path="/demo/*"/>
<!--            排除拦截的控制单元-->
            <mvc:exclude-mapping path="/demo/bb"/>
<!--            使用的拦截器-->
            <bean class="com.zqwl.interceptor.MyInterceptor"/>
        </mvc:interceptor>
    </mvc:interceptors>

2.3. 拦截器栈

拦截器栈指多个拦截器。当一个控制单元被多个拦截器拦截时,就形成了拦截器栈。拦截器栈中拦截器有着严格的执行顺序。执行顺序按照配置顺序执行。先配置的优先级更高。

例如:拦截器A和拦截器B,优先级更高指以控制单元(demo)为核心,前面的方法优先级高的先执行,后面的方法优先级高的后执行。

preHandle1 -> preHandle2 -> demo -> postHandle2 -> postHandle1 -> afterCompletion2 -> afterCompletion1。

配置拦截器栈分为局部配置和全局配置(与单个一样)。

执行顺序:

 

2.4. 拦截器和过滤器的区别(面试题)

  1. 来源不同

    拦截器是SpringMVC中的技术,过滤器是Java EE中的技术。

  2. 生效位置不同

    拦截器是进入DispatcherServlet后才能执行,过滤器是进入到Servlet容器后就可以触发。

  3. 目标不同

    拦截器拦截的目标是HandlerMethod(控制单元,控制器方法),过滤器可以过滤所有的URL。

  4. 运行机制不同

    拦截器是在HandlerMethod执行前后和视图处理完成后执行,分为三部分。过滤器只能在目标资源前后执行。

  5. 接口中方法类型不同

    拦截器中的方法都是default方法,可以重写也可以不重写。过滤器中的方法都是abstract方法,如果当前类不是抽象类,必须重写。

  6. 上下文不同

    拦截器被Spring MVC管理,可以获取到Spring容器中内容。Filter被Tomcat管理,所以无法获取Spring容器内容。

 

二、跨域

1. 跨域介绍

项目和项目之前访问的网址或ip:port称为域(domain)。

跨域:当前项目的协议、ip、端口和访问的URL的协议、IP、端口中有一个不同,这种访问就叫跨域。

例如:当前项目http://localhost:8080 访问了 http://127.0.0.1:8080 就是跨域访问。

2. 什么时候有跨域

跨域只发生在Ajax请求中。

Ajax研发之初为了保证安全性,设置默认情况下不允许跨域访问。

3.解决Ajax不能跨域问题

在需要访问的控制单元方法上面添加@CrossOrigin注解即可。

三、Spring MVC异常处理

1. 介绍

在Spring MVC支持异常处理。不会呈现给用户500界面。而是当出现异常时交给某个特定的控制器。

如果是一个上线的项目,呈现了500界面,会非常影响用户体验度。同时也显示公司实力有问题、不专业。

2. 局部配置

配置在@Controller的控制器类中,只有当前这个控制器类的控制单元出现异常时才能执行,其他类的控制单元出现异常不能执行。

每个控制器类中可以有多个处理异常的方法。每个方法上面只需要有@ExceptionHandler,千万别添加了@RequestMapping注解。、

 @ExceptionHandler(Exception.class) //里面写具体的异常,写在这儿只能处理该控制器类中控制单元出现的异常
    public String MyException(){
        System.out.println("发生了异常");
        return "/exception.jsp";
    }

3. 全局配置

因为@ControllerAdvice已经继承了@Component注解,所以类上只添加这个注解就可以了。

不需要在添加@Controller注解了。

小提示:

如果配置了局部异常处理器和全局异常处理器,优先匹配局部异常处理器。

//全局配置异常处理(单独写一个类,也交给SpringMvc管理),可以当其他控制器类出现异常也可以处理
@ControllerAdvice
public class MyExceptionController {
    @ExceptionHandler(value = ArithmeticException.class)
    public String myexception(){
        System.out.println("MyException-1");
        return "forward:/exception.jsp";
    }
    @ExceptionHandler(value = Exception.class)
    public String myexception2(){
        System.out.println("MyException-2");
        return "forward:/exception.jsp";
    }
}

4. 使用配置文件配置

在Spring MVC中包含HandlerExceptionResolver组件,专门负责处理异常的。接口中只包含一个resolveException方法。

在spring mvc.xml中配置:

//xml配置解决异常:异常解析器  优先级比状态码异常高:因为出现异常先遇到他,而状态码是返回给客户端时才遇到
    <bean class="org.springframework.web.servlet.handler.SimpleMappingExceptionResolver">
        <property name="exceptionMappings">
            <props>
                <prop key="java.lang.NullPointerException">/error1.jsp</prop>
                <prop key="java.lang.Exception">/exception.jsp</prop>
            </props>
        </property>
    </bean>

5. 根据状态码跳转到指定页面

在Spring MVC框架中没有提供根据状态码跳转到特定的视图。想要实现根据状态码跳转到指定页面可以使用Java EE中提供的实现方案。

在web.xml中配置。

 <error-page>
    <error-code>404</error-code>
    <location>/error.jsp</location>
  </error-page>
  <error-page>
    <error-code>500</error-code>
    <location>/error1.jsp</location>
  </error-page>

四、Spring MVC数据校验

1. 数据校验介绍

2. 基于注解方式

所需依赖:

<dependency>
    <groupId>org.hibernate.validator</groupId>
    <artifactId>hibernate-validator</artifactId>
    <version>6.1.7.Final</version>
</dependency>
在实体类属性上添加注解

注解放在实体类的属性上面,每个实体类属性都支持配置多个注解,这些注解同时生效。

实体类:

public class People {
    @NotNull(message = "姓名不能是null")
    @Length(min = 2,max = 6,message = "长度应该是2-6位")
    private String name;
    private String age;
    // 省略Getter和Setter
}
控制单元:

控制单元中必须添加@Valid注解,否则校验不生效。

如果配置了日志文件,需要将日志级别设置为WARN。

@RequestMapping("/valid")
public String testValid(@Valid People peo){
    System.out.println(peo);
    return "/abc.jsp";
}

五、Spring MVC中包含哪些组件

1.介绍

        SpringMVC将Servlet访问的流程整体封装了起来,浏览器发起请求后调用单元方法来处理请求,这个整个过程从接收到请求,到找到单元方法并调用执行,再到响应结果给浏览器都是由不同的组件协同来实现的,有如下组件:

不同的组建在整个运行过程中的具体表现其实就是不同的对象,也就是不同对象之间的相互调用完成了请求的处理,组件的初始化应该在请求来之前就完成的,当服务器启动的时候会先完成对DispactherServlet的初始化创建,在DispatcherServlet被初始化的时候其底层内部也会完成第2到第10个组件的初始化,调用其initStrategies方法来完成

 

2.常用组件说明

DispatcherServlet:前端控制器。Spring MVC的入口,也是整个流程控制中心。其他组件由DispatcherServlet统一调度,降低了组件和组件之间的耦合度。

MultipartResovler:多部分处理器。文件上传时需要使用。

LocaleResolver:解决客户端的区域和时区问题。

ThemeResolver:主题解析器。提供自定义布局。

HandlerMapping: 映射处理器。主要负责处理URL,并找到对应的HandlerMethod。简单说就是找@RequestMapping注解中映射路径是否有和URL匹配的。

HandlerAdapter:适配器。负责调用具体的HandlerMethod。

HandlerExceptionResovler:异常处理器。异常处理,根据不同异常返回视图。

RequestToViewNameTranslator:从请求中获取到视图名称。

ViewResovler:视图解析器,负责解析字符串视图名和物理视图文件的。

FlashMapManager:主要用于存储属性的,本质是一个Map。多用在重定向时。FlashMap在重定向之前存储,重定向之后删除。

ModelAndView:模型和视图。Spring MVC中提供的模型和视图接口。

HandlerInterceptor:拦截器。拦截控制器资源的。

 

六、SpringMVC运行原理(常见面试题)

 

  1. 客户端向服务端发起请求,Spring MVC总体入口中央调度器DispatcherServlet进行请求分发。

  2. 中央调度器DispatcherServlet把URL交给映射处理器HandlerMapping进行解析URL。

  3. 映射处理器HandlerMapping将请求映射为HandlerExecutionChain处理器执行链

    1. 可以为多个处理器拦截器HandlerInterceptor

    2. 处理器Handler对象(处理Controller)。

  4. 将处理器执行链HandlerExecutionChain返回到中央调度器DispatcherServlet。

  5. DispatcherServlet根据返回的处理器执行链HandlerExecutionChain获得的处理器Handler,根据处理器Handler选择处理器适配器HandlerAdapter。

    1. 执行拦截器的preHandle()方法。

    2. 调用具体的Handler处理器(处理Controller),在填充Handler的入参过程中会执行数据转换、数据格式化、数据验证,调用具体的Controller完成处理功能,并创建ModelAndView对象。

    3. 执行拦截器的postHandle()方法。

  6. 将ModelAndView对象返回到处理器适配器HandlerAdapter。

  7. 处理器适配器HandlerAdapter将ModelAndView对象返回到中央调度器DispatcherServlet。

  8. 中央调度器DispatcherServlet调用视图解析器ViewResolver解析视图。

  9. 将解析的视图View对象返回到中央调度器DispatcherServlet。

  10. 渲染视图,将视图返回到中央调度器DispatcherServlet,执行拦截器afterCompletion()方法。

  11. 中央调度器DispatcherServlet相应回到浏览器。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/1156158.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

python多环境并存

1. 现况简介 1.1 本人windows所存Python版本 Python 2.7 Python 3.6 Python 3.7 1.2 Python 各版本路径如下 Python 2.7Python 3.6Python 3.7C:\Server\Python27C:\Server\Python36C:\Server\Python37 1.3 系统环境变量配置如下 2. 解决方案 2.1 进入目录 cd C:\Server…

【机器学习】三、特征选择与稀疏学习

特征选择和稀疏学习 子集搜索与评价 对象都有很多属性来描述&#xff0c;属性也称为特征&#xff08;feature&#xff09;&#xff0c;用于刻画对象的某一个特性。对一个学习任务而言&#xff0c;有些属性是关键有用的&#xff0c;而有些属性则可能不必要纳入训练数据。对当前学…

win10 下编译ffmpeg3.36.tar.gz

所需工具&#xff1a; win10 ffmpeg3.36.tar.gz。 或其他版本&#xff0c;下载地址&#xff1a;Index of /releases msys2。 下载地址&#xff1a;http://www.msys2.org。 Visual Studio 2017。 1. 安装MSYS MSYS2像是windows下的一个子系统&#xff0c;…

`.NET Web`新人入门必学项目`EarthChat`

.NET Web新人入门必学项目EarthChat EarthChat是一个基于.NET 7的实战项目&#xff0c;EarthChat提供了很多的最佳实践&#xff0c;EarthChat的目标也是成为一个很多人都喜欢的大型聊天业务系统&#xff0c;并且将结合SKAI大模型进行打造智能业务系统&#xff0c;在EarthChat中…

05_es分布式搜索引擎1

一、初始elasticsearch 1.elasticsearch简单介绍 ①什么是elasticsearch&#xff1f; 开源的分布式搜索引擎&#xff0c;实现海量数据搜索&#xff0c;日志统计&#xff0c;分析&#xff0c;系统监控等功能 ②什么是elastic stack&#xff1f; 是以elasticsearch为核心的技…

【COMP304 LEC4 LEC5】

LEC 4 1. Truth-Functionality Propositional logic 的connectives&#xff08;连接词&#xff09;are truth-functional 但是&#xff0c;有时候的描述不是true-functional的&#xff0c;比如&#xff1a;"Knowing that", "It is necessary that",&quo…

微信小程序开发-微信支付退款功能【附有完整代码】

之前有写过详细的微信支付功能&#xff1a;微信支付 我们使用weixin-java-pay的jar包等&#xff0c;配置上的流程同微信支付&#xff0c;可以看上面的文章。 退款使用的WxPayService类的refundV3方法。使用该方法需要在微信支付配置的基础上加上&#xff1a;apiclient_key.pem…

Linux期末复习——多线程编程

线程概述 线程基本编程 函数说明 pthread_create(): 创建线程&#xff0c;成功返回0pthread_exit(): 主动退出线程&#xff0c;成功返回0pthread_join(): 挂起线程等待结束&#xff0c;成功返回0pthread_cancel在别的线程中终止另一个线程的执行&#xff0c;成功返回0 示例…

sql文件批处理程序-java桌面应用

项目效果&#xff1a; 支持sql文件夹批处理&#xff0c;选中文件夹或者sql文件 支持测试连接&#xff0c;可以校验数据库配置 支持报错回显&#xff0c;弹出报错文件名以及问题语句 支持在程序中修改错误语句&#xff0c;用户可以选择保存修改内容继续执行或不保存修改只执行…

线性代数 第四章 线性方程组

一、矩阵形式 经过初等行变换化为阶梯形矩阵。当&#xff0c;有解&#xff1b;当&#xff0c;有非零解。 有解&#xff0c;等价于 可由线性表示 克拉默法则&#xff1a;非齐次线性方程组中&#xff0c;系数行列式&#xff0c;则方程组有唯一解&#xff0c;且唯一解为 其中是…

TestCenter测试管理工具

estCenter&#xff08;简称TC&#xff09;一款广受好评的测试管理工具&#xff0c;让测试工作更规范、更有效率&#xff0c;实现测试流程无纸化&#xff0c;测试数据资产化。 产品概述 TC流程图 产品功能 一、案例库 案例库集中化管理&#xff0c;支持对测试用例集中管理&…

Gartner报告 | Mendix再次成为低代码领导者!Mendix在愿景完整性和执行能力领域的排名最为靠前。

本文作者: Hans de Visser, Mendix 首席产品官 在最新发布的2023 Gartner魔力象限图™ 中对于企业级低代码应用程序平台&#xff0c;Gartner指出&#xff0c;企业IT领导者需要满足“应用程序开发向更高抽象级别迈进的步伐&#xff0c;并采用低代码平台来加速应用程序开发。” 此…

【华为】路由器以PPPoE拨号接入广域网

组网需求 用户希望以PPPoE拨号方式接入广域网&#xff0c;如图1所示&#xff0c;Router作为PPPoE客户端&#xff0c;得到PPPoE服务器的认证后获得IP地址&#xff0c;实现用户接入互联网的需求。内网网关地址&#xff08;即VLANIF1接口的IP地址&#xff09;为10.137.32.1/24。 …

N-131基于jsp,ssm物流快递管理系统

开发工具&#xff1a;eclipse&#xff0c;jdk1.8 服务器&#xff1a;tomcat7.0 数据库&#xff1a;mysql5.7 技术&#xff1a; springspringMVCmybaitsEasyUI 项目包括用户前台和管理后台两部分&#xff0c;功能介绍如下&#xff1a; 一、用户(前台)功能&#xff1a; 用…

UE5 Android下载zip文件并解压缩到指定位置

一、下载是使用市场的免费插件 二、解压缩是使用市场的免费插件 三、Android路径问题 windows平台下使用该插件没有问题&#xff0c;只是在Android平台下&#xff0c;只有使用绝对路径才能进行解压缩&#xff0c;所以如何获得Android下的绝对路径&#xff1f;增加C文件获得And…

生态扩展:Flink Doris Connector

生态扩展&#xff1a;Flink Doris Connector 官网地址&#xff1a; https://doris.apache.org/zh-CN/docs/dev/ecosystem/flink-doris-connector flink的安装&#xff1a; tar -zxvf flink-1.16.0-bin-scala_2.12.tgz mv flink-1.16.0-bin-scala_2.12.tgz /opt/flinkflink环境…

【c++|opencv】二、灰度变换和空间滤波---5.中值滤波

every blog every motto: You can do more than you think. https://blog.csdn.net/weixin_39190382?typeblog 0. 前言 1. 中值滤波 #include<iostream> #include<opencv2/opencv.hpp> #include"Salt.h"using namespace cv; using namespace std;voi…

NEFU离散数学实验4-数论

相关概念 离散数学中的数论相关概念和公式如下&#xff1a; 1.最大公约数(GCD)&#xff1a;两个整数a和b的最大公约数是能够同时整除a和b的最大正整数&#xff0c;记作GCD(a, b)。 2.最小公倍数(LCM)&#xff1a;两个整数a和b的最小公倍数是能够同时整除a和b的最小正整数&#…

MySQL-Galera-Cluster集群详细介绍

目录 一、什么是Mysql集群&#xff1f;1.单节点mysql存在的常见问题2.mysql集群介绍3.Mysql集群的优点和风险 二、Mysql集群的一些疑问1.mysql的AB复制和Galera Cluster有什么区别&#xff1f;2.什么情况下适用AB复制&#xff0c;什么情况下使用Galera cluster&#xff1f;3.可…