Spring MVC自定义拦截器--Spring MVC异常处理

news2024/11/23 15:04:40

 

目录

自定义拦截器

什么是拦截器

● 说明

自定义拦截器执行流程分析图

● 自定义拦截器执行流程说明

自定义拦截器应用实例

● 应用实例需求

创建MyInterceptor01

创建FurnHandler类

 在 springDispatcherServlet-servlet.xml 配置拦截器

第一种配置方式

第二种配置方式

第3种配置方式

创建interceptor.jsp

完成测试(页面方式) 

完成测试(Postman 方式)

注意

多个拦截器执行流程示意图

​编辑 ​编辑

 代码实现

创建MyInterceptor02

配置xml

完成测试(页面方式)

完成测试(Post 方式) 

注意事项和细节

扩展需求

 创建warning.jsp

修改MyInterceptor01

完成测试(使用 Postma)

异常处理

异常处理-基本介绍

局部异常

演示局部异常处理机制

创建MyExceptionHandler

创建exception.jsp

创建exception_mes.jsp

测试(页面方式) 

测试(Postman 方式)

 全局异常

解读

 修改MyExceptionHandler增加方法

 修改exception.jsp增加语句

测试

异常优先级

异常处理时:局部异常 优先级高于 全局异常

需求

创建AgeException.java 

 修改MyExceptionHandler增加方法

修改 exception.jsp, 增加超链

完成测试(页面测是)

 完成测试(postman)

SimpleMappingExceptionResolver

基本说明

代码演示

修改 MyExceptionHandler.java , 增加方法test03

配置 springDispatcherServlet-servlet.xml

创建arrEx.jsp

修改 exception.jsp

并完成测试

对未知异常进行统一处理

修改 MyExceptionHandler.java , 增加方法test04

创建allEx.jsp

修改 exception.jsp , 增加超链接

并完成测试

异常处理的优先级梳理

● 异常处理的优先级

全部xml配置


自定义拦截器

什么是拦截器

● 说明

  1. Spring MVC 也可以使用拦截器对请求进行拦截处理,用户可以自定义拦截器来实现特定的功能.

  2. 自定义的拦截器必须实现 HandlerInterceptor 接口

● 自定义拦截器的三个方法

  1. preHandle():这个方法在业务处理器处理请求之前被调用,在该方法中对用户请求request 进行处理。

  2. postHandle():这个方法在目标方法处理完请求后执行

  3. afterCompletion():这个方法在完全处理完请求后被调用,可以在该方法中进行一些资源清理的操作。

自定义拦截器执行流程分析图

● 自定义拦截器执行流程说明

  1. 如果 preHandle 方法 返回 false, 则不再执行目标方法, 可以在此指定返回页面

  2. postHandle 在目标方法被执行后执行. 可以在方法中访问到目标方法返回的ModelAndView 对象

  3. 若 preHandle 返回 true, 则 afterCompletion 方法 在渲染视图之后被执行.

  4. 若 preHandle 返回 false, 则 afterCompletion 方法不会被调用

  5. 在配置拦截器时,可以指定该拦截器对哪些请求生效,哪些请求不生效

自定义拦截器应用实例

● 应用实例需求

完成一个自定义拦截器,学习一下如何配置拦截器和拦截器的运行流程

创建MyInterceptor01

 public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler) throws Exception {

解读
      1. preHandle() 在目标方法执行前被执行
      2. 如果preHandle() 返回false , 不再执行目标方法
      3. 该方法可以获取到request, response, handler
      4. 这里根据业务,可以进行拦截,并指定跳转到哪个页面

public void postHandle(HttpServletRequest request, HttpServletResponse response, Object handler, ModelAndView modelAndView) throws Exception {

解读
      1. 在目标方法执行后,会执行postHandle
      2. 该方法可以获取到 目标方法,返回的ModelAndView对象

public void afterCompletion(HttpServletRequest request, HttpServletResponse response, Object handler, Exception ex) throws Exception  

解读
      afterCompletion() 在视图渲染后被执行, 这里可以进行资源清理工作 

@Component
public class MyInterceptor01 implements HandlerInterceptor {

    /**
     * 解读
     * 1. preHandle() 在目标方法执行前被执行
     * 2. 如果preHandle() 返回false , 不再执行目标方法
     * 3. 该方法可以获取到request, response, handler
     * 4. 这里根据业务,可以进行拦截,并指定跳转到哪个页面
     * @param request
     * @param response
     * @param handler
     * @return
     * @throws Exception
     */
    @Override
    public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler) throws Exception {
        System.out.println("--MyInterceptor01--preHandle()---");
        
    }

    /**
     * 解读
     * 1. 在目标方法执行后,会执行postHandle
     * 2. 该方法可以获取到 目标方法,返回的ModelAndView对象
     * @param request
     * @param response
     * @param handler
     * @param modelAndView
     * @throws Exception
     */
    @Override
    public void postHandle(HttpServletRequest request, HttpServletResponse response, Object handler, ModelAndView modelAndView) throws Exception {
        System.out.println("--MyInterceptor01--postHandle()--");
    }

    /**
     * 解读
     * 1. afterCompletion() 在视图渲染后被执行, 这里可以进行资源清理工作
     * @param request
     * @param response
     * @param handler
     * @param ex
     * @throws Exception
     */
    @Override
    public void afterCompletion(HttpServletRequest request, HttpServletResponse response, Object handler, Exception ex) throws Exception {
        System.out.println("--MyInterceptor01--afterCompletion()--");
    }
}

创建FurnHandler类

@Controller
public class FurnHandler {

    @RequestMapping(value = "/hi")
    public String hi(User user) {

        System.out.println("---FurnHandler--hi()---");
        return "success";
    }

    @RequestMapping(value = "/hello")
    public String hello() {
        System.out.println("---FurnHandler--hello()---");
        return "success";
    }
}

 在 springDispatcherServlet-servlet.xml 配置拦截器

    <!--配置自定义拦截器-spring配置文件-->
    <mvc:interceptors>
        <!--
        解读
        1. 第一种配置方式
        2. 使用ref 引用到对应的myInterceptor01
        3. 这种方式,会拦截所有的目标方法
        -->
        <!--<ref bean="myInterceptor01"/>-->

        <!--解读
        1. 第二种配置方式
        2. mvc:mapping path="/hi" 指定要拦截的路径
        3. ref bean="myInterceptor01" 指定对哪个拦截器进行配置
        -->
        <!--<mvc:interceptor>-->
        <!--    <mvc:mapping path="/hi"/>-->
        <!--    <ref bean="myInterceptor01"/>-->
        <!--</mvc:interceptor>-->

        <!--解读
        1. 第3种配置方式
        2. mvc:mapping path="/h*" 通配符方式 表示拦截 /h 打头的路径
        3. mvc:exclude-mapping path="/hello" /hello不拦截
        4. ref bean="myInterceptor01" 指定对哪个拦截器配置
        -->
        <mvc:interceptor>
            <mvc:mapping path="/h*"/>
            <mvc:exclude-mapping path="/hello"/>
            <ref bean="myInterceptor01"/>
        </mvc:interceptor>
    </mvc:interceptors>


第一种配置方式

        使用ref 引用到对应的myInterceptor01
        这种方式,会拦截所有的目标方法

<ref bean="myInterceptor01"/>

第二种配置方式

  •         mvc:mapping path="/hi" 指定要拦截的路径
  •         ref bean="myInterceptor01" 指定对哪个拦截器进行配置
<mvc:interceptor>
            <mvc:mapping path="/hi"/>
            <ref bean="myInterceptor01"/>
</mvc:interceptor>

第3种配置方式

  • mvc:mapping path="/h*" 通配符方式 表示拦截 /h 打头的路径
  • mvc:exclude-mapping path="/hello" /hello不拦截
  • ref bean="myInterceptor01" 指定对哪个拦截器配置
 <mvc:interceptor>
            <mvc:mapping path="/h*"/>
            <mvc:exclude-mapping path="/hello"/>
            <ref bean="myInterceptor01"/>
</mvc:interceptor>

创建interceptor.jsp

<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<html>
<head>
    <title>测试自定义拦截器</title>
</head>
<body>
<h1>测试自定义拦截器</h1>
<a href="<%=request.getContextPath()%>/hi">测试自定义拦截器-hi</a><br><br>
<a href="<%=request.getContextPath()%>/hello">测试自定义拦截器-hello</a><br/><br/>
</body>
</html>

完成测试(页面方式) 

 浏览器 http://localhost:8080/springmvc/interceptor.jsp

完成测试(Postman 方式)

注意

拦截器需要配置才生效,不配置是不生效的. 

如果 preHandler() 方法返回了 false, 就不会执行目标方法(前提是你的目标方法被拦截了), 程序员可以在这里根据业务需要指定跳转页面.

多个拦截器执行流程示意图

 

 代码实现

创建MyInterceptor02

@Component
public class MyInterceptor02 implements HandlerInterceptor {

    @Override
    public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler) throws Exception {
        System.out.println("--MyInterceptor02--preHandle--");
        return true;
    }

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

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

配置xml

        1.配置的第二个拦截器
        2.多个拦截器在执行时,是顺序执行 

    <!--配置自定义拦截器-spring配置文件-->
    <mvc:interceptors>
        <!--
        解读
        1. 第一种配置方式
        2. 使用ref 引用到对应的myInterceptor01
        3. 这种方式,会拦截所有的目标方法
        -->
        <!--<ref bean="myInterceptor01"/>-->

        <!--解读
        1. 第二种配置方式
        2. mvc:mapping path="/hi" 指定要拦截的路径
        3. ref bean="myInterceptor01" 指定对哪个拦截器进行配置
        -->
<!--        <mvc:interceptor>-->
<!--            <mvc:mapping path="/hi"/>-->
<!--            <ref bean="myInterceptor01"/>-->
<!--        </mvc:interceptor>-->

        <!--解读
        1. 第3种配置方式
        2. mvc:mapping path="/h*" 通配符方式 表示拦截 /h 打头的路径
        3. mvc:exclude-mapping path="/hello" /hello不拦截
        4. ref bean="myInterceptor01" 指定对哪个拦截器配置
        -->
        <mvc:interceptor>
            <mvc:mapping path="/h*"/>
            <mvc:exclude-mapping path="/hello"/>
            <ref bean="myInterceptor01"/>
        </mvc:interceptor>

        <!--解读
        1.配置的第二个拦截器
        2.多个拦截器在执行时,是顺序执行
        -->
        <mvc:interceptor>
            <mvc:mapping path="/h*"/>
            <ref bean="myInterceptor02"/>
        </mvc:interceptor>
    </mvc:interceptors>

完成测试(页面方式)

浏览器 http://localhost:8080/springmvc/interceptor.jsp

完成测试(Post 方式) 

注意事项和细节

1.如果第1个拦截器的preHandle()返回false,后面都不在执行

2.如果第2个拦截器的preHandle()返回false,就直接执行第1个拦截器的afterCompletion()方法,如果拦截器更多,规则类似

3.说明:前面说的规则,都是目标方法被拦截的前提

扩展需求

需求: 如果用户提交的数据有禁用词(比如 病毒),则,在第 1 个拦截器就返回,不执行 目标方法, 功能效果示意图 

 创建warning.jsp

<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<html>
<head>
    <title>警告</title>
</head>
<body>
<h1>不要乱讲话~</h1>
</body>
</html>

修改MyInterceptor01

    @Override
    public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler) throws Exception {
        System.out.println("--MyInterceptor01--preHandle()---");
        //获取到用户提交的关键字
        String keyword = request.getParameter("keyword");
        if("病毒".equals(keyword)) {
            //请求转发到warning
            request.getRequestDispatcher("/WEB-INF/pages/warning.jsp")
                    .forward(request,response);

            return false;
        }
        System.out.println("得到到keyword= "+ keyword);
        return true;
    }

完成测试(使用 Postma)


异常处理

异常处理-基本介绍

1. Spring MVC 通过 HandlerExceptionResolver 处理程序的异常,包括 Handler 映射、数据
   绑定以及目标方法执行时发生的异常

2. 主要处理 Handler 中用 -@ExceptionHandler 注解定义的方法。

3. ExceptionHandlerMethodResolver 内部若找不到--@ExceptionHandler 注解的话,会找
   @ControllerAdvice 类的@ExceptionHandler 注解方法,这样就相当于一个全局异常处理器

局部异常

演示局部异常处理机制

如果不处理异常, 非常的不友好

创建MyExceptionHandler

    @ExceptionHandler({ArithmeticException.class,NullPointerException.class})
    public String localException(Exception ex, HttpServletRequest request){
        System.out.println("局部异常信息是-" + ex.getMessage());
        //如何将异常的信息带到下一个页面.
        request.setAttribute("reason", ex.getMessage());
        return "exception_mes";
    }

    /**
     * 解读
     * 1. 编写方法,模拟异常, 算术异常
     * 2. 如果我们不做异常处理,是由tomcat默认页面显示
     *
     */
    @RequestMapping(value = "/testException01")
    public String test01(Integer num) {
        int i = 9 / num;
        return "success";
    }

创建exception.jsp

<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<html>
<head>
    <title>异常信息</title>
</head>
<body>
<h1>测试异常</h1>
<a href="<%=request.getContextPath()%>/testException01?num=0">点击测试局部异常</a><br><br>
</body>
</html>

创建exception_mes.jsp

<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<html>
<head>
    <title>异常信息提示</title>
</head>
<body>
<h1>朋友, 程序发生了异常...</h1>
异常信息- ${requestScope.reason}
</body>
</html>

测试(页面方式) 

浏览器 http://localhost:8080/springmvc/exception.jsp

 

测试(Postman 方式)

 全局异常

 ExceptionHandlerMethodResolver 内部若找不到@ExceptionHandler 注解的话,会找
@ControllerAdvice 类的@ExceptionHandler 注解方法, 这样就相当于一个全局异常处理器

这个上面已经演示了这里只是补充说明 

解读

1. 这里我们模拟了一个异常 NumberFormatException
2. 该异常没有在局部异常处理,按照异常处理机制,就会交给全局异常处理类处理

 修改MyExceptionHandler增加方法

    @RequestMapping(value = "/testGlobalException")
    public String global(){
        //解读
        //1. 这里我们模拟了一个异常 NumberFormatException
        //2. 该异常没有在局部异常处理,按照异常处理机制,就会交给全局异常处理类处理
        int num = Integer.parseInt("hello");
        return "success";
    }

 修改exception.jsp增加语句

<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<html>
<head>
    <title>异常信息</title>
</head>
<body>
<h1>测试异常</h1>
<a href="<%=request.getContextPath()%>/testException01?num=0">点击测试局部异常</a><br><br>
<a href="<%=request.getContextPath()%>/testGlobalException">点击测试全局异常</a><br><br>

</body>
</html>

测试

如上面测试一样

 

异常优先级

异常处理时:局部异常 优先级高于 全局异常

需求

通过@ResponseStatus 注解, 可以自定义异常的说明

创建AgeException.java 

@ResponseStatus(reason = "年龄需要在1-120之间", value = HttpStatus.BAD_REQUEST)
public class AgeException extends RuntimeException {

    public AgeException() {
    }

    public AgeException(String message) {
        super(message);
    }
}

 修改MyExceptionHandler增加方法

    @RequestMapping(value = "/testException02")
    public String test02(){
        throw new AgeException("年龄必须在1-120之间~~~");
    }

修改 exception.jsp, 增加超链

<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<html>
<head>
    <title>异常信息</title>
</head>
<body>
<h1>测试异常</h1>
<a href="<%=request.getContextPath()%>/testException01?num=0">点击测试局部异常</a><br><br>
<a href="<%=request.getContextPath()%>/testGlobalException">点击测试全局异常</a><br><br>
<a href="<%=request.getContextPath()%>/testException02">点击测试自定义异常</a><br/><br/>
</body>
</html>

完成测试(页面测是)

浏览器 http://localhost:8080/springmvc/exception.jsp

 完成测试(postman)

 

SimpleMappingExceptionResolver

基本说明

1. 如果希望对所有异常进行统一处理,可以使用 SimpleMappingExceptionResolver
2. 它将异常类名映射为视图名,即发生异常时使用对应的视图报告异常
3. 需要在 ioc容器中配置

代码演示

对数组越界异常进行统一处理,使用 SimpleMappingExceptionResolver处理

修改 MyExceptionHandler.java , 增加方法test03

 @RequestMapping(value = "/testException03")
    public String test03(){
        int[] arr = new int[]{3,9,10,190};
        //抛出一个数组越界的异常 ArrayIndexOutOfBoundsException
        System.out.println(arr[90]);
        return "success";
    }

配置 springDispatcherServlet-servlet.xml

解释一下为什么只写arrEX因为我们前面配置了 prefix/WEB-INF/pages/和suffix .jsp所以默认会拼接


    <bean class="org.springframework.web.servlet.handler.SimpleMappingExceptionResolver">
        <property name="exceptionMappings">
            <props>
                <prop key="java.lang.ArrayIndexOutOfBoundsException">arrEx</prop>
            </props>
        </property>
    </bean>

创建arrEx.jsp

<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<html>
<head>
    <title>数组越界异常</title>
</head>
<body>
<h1><异常></异常>信息: 数组越界异常</h1>
</body>
</html>

修改 exception.jsp

<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<html>
<head>
    <title>异常信息</title>
</head>
<body>
<h1>测试异常</h1>
<a href="<%=request.getContextPath()%>/testException01?num=0">点击测试局部异常</a><br><br>
<a href="<%=request.getContextPath()%>/testGlobalException">点击测试全局异常</a><br><br>
<a href="<%=request.getContextPath()%>/testException02">点击测试自定义异常</a><br/><br/>
<a href="<%=request.getContextPath()%>/testException03">点击测试统一处理异常</a><br/><br/>
</body>
</html>

并完成测试

(页面测试), 浏览器 http://localhost:8080/springmvc/exception.jsp

(postman) 测 http://localhost:8080/springmvc/testException03

页面就不展示了

对未知异常进行统一处理

对未知异常进行统一处理,使用 SimpleMappingExceptionResolver

    <!--配置统一处理异常Bean-->
    <bean class="org.springframework.web.servlet.handler.SimpleMappingExceptionResolver">
        <property name="exceptionMappings">
            <props>
                <prop key="java.lang.ArrayIndexOutOfBoundsException">arrEx</prop>
                <prop key="java.lang.Exception">allEx</prop>
            </props>
        </property>
    </bean>

修改 MyExceptionHandler.java , 增加方法test04

    //如果发生了没有归类的异常, 可以给出统一提示页面
    @RequestMapping(value = "/testException04")
    public String test04(){
        String str = "hello";
        //这里会抛出 StringIndexOutOfBoundsException
        char c = str.charAt(10);
        return "success";
    }

创建allEx.jsp

<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<html>
<head>
    <title>未知异常信息</title>
</head>
<body>
<h1>朋友,系统发生了未知异常~, 请联系网站管理员</h1>
</body>
</html>

修改 exception.jsp , 增加超链接

<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<html>
<head>
    <title>异常信息</title>
</head>
<body>
<h1>测试异常</h1>
<a href="<%=request.getContextPath()%>/testException01?num=0">点击测试局部异常</a><br><br>
<a href="<%=request.getContextPath()%>/testGlobalException">点击测试全局异常</a><br><br>
<a href="<%=request.getContextPath()%>/testException02">点击测试自定义异常</a><br/><br/>
<a href="<%=request.getContextPath()%>/testException03">点击测试统一处理异常</a><br/><br/>
<a href="<%=request.getContextPath()%>/testException04">点击测试未知异常</a><br/><br/>
</body>
</html>

并完成测试

(页面测试), 浏览器 http://localhost:8080/springmvc/exception.jsp

(postman) 测试http://localhost:8080/springmvc/testException04

异常处理的优先级梳理

● 异常处理的优先级

局部异常 > 全局异常 > SimpleMappingExceptionResolver > tomcat 默认机制

全部xml配置

<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans"
       xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
       xmlns:context="http://www.springframework.org/schema/context"
       xmlns:mvc="http://www.springframework.org/schema/mvc"
       xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans.xsd http://www.springframework.org/schema/context https://www.springframework.org/schema/context/spring-context.xsd http://www.springframework.org/schema/mvc https://www.springframework.org/schema/mvc/spring-mvc.xsd">

    <!--配置自动扫描包-->
    <context:component-scan base-package="com.wyxdu.web"/>

    <!--配置视图解析器[默认视图解析器]-->
    <bean class="org.springframework.web.servlet.view.InternalResourceViewResolver">
        <!--配置属性suffix 和 prefix-->
        <property name="prefix" value="/WEB-INF/pages/"/>
        <property name="suffix" value=".jsp"/>
        <!--调整优先级-->
        <property name="order" value="10"/>
    </bean>

    <!--
        解读
        1. 配置自定义视图解析器BeanNameViewResolver
        2. BeanNameViewResolver可以去解析我们自定义的视图
        3. 配置 属性 order, 表示视图解析器执行的顺序, 值越小, 优先级越高
        4. 属性 order 的默认值是最低优先级 ,值为 Integer.MAX_VALUE
           int LOWEST_PRECEDENCE = 2147483647
    -->
    <bean class="org.springframework.web.servlet.view.BeanNameViewResolver">
        <property name="order" value="99"/>
    </bean>

    <!-- 配置国际化错误信息的资源处理bean -->
    <bean id="messageSource" class=
            "org.springframework.context.support.ResourceBundleMessageSource">
        <!-- 配置国际化文件名字
            如果你这样配的话,表示messageSource回到 src/i18nXXX.properties去读取错误信息
         -->
        <property name="basename" value="i18n"></property>
    </bean>

    <!--配置文件上传需要的bean-->
    <bean class="org.springframework.web.multipart.commons.CommonsMultipartResolver"
          id="multipartResolver"/>


    <!--配置自定义拦截器-spring配置文件-->
    <mvc:interceptors>
        <!--
        解读
        1. 第一种配置方式
        2. 使用ref 引用到对应的myInterceptor01
        3. 这种方式,会拦截所有的目标方法
        -->
        <!--<ref bean="myInterceptor01"/>-->

        <!--解读
        1. 第二种配置方式
        2. mvc:mapping path="/hi" 指定要拦截的路径
        3. ref bean="myInterceptor01" 指定对哪个拦截器进行配置
        -->
<!--        <mvc:interceptor>-->
<!--            <mvc:mapping path="/hi"/>-->
<!--            <ref bean="myInterceptor01"/>-->
<!--        </mvc:interceptor>-->

        <!--解读
        1. 第3种配置方式
        2. mvc:mapping path="/h*" 通配符方式 表示拦截 /h 打头的路径
        3. mvc:exclude-mapping path="/hello" /hello不拦截
        4. ref bean="myInterceptor01" 指定对哪个拦截器配置
        -->
        <mvc:interceptor>
            <mvc:mapping path="/h*"/>
            <mvc:exclude-mapping path="/hello"/>
            <ref bean="myInterceptor01"/>
        </mvc:interceptor>

        <!--解读
        1.配置的第二个拦截器
        2.多个拦截器在执行时,是顺序执行
        -->
        <mvc:interceptor>
            <mvc:mapping path="/h*"/>
            <ref bean="myInterceptor02"/>
        </mvc:interceptor>
    </mvc:interceptors>


    <!--配置统一处理异常Bean-->
    <bean class="org.springframework.web.servlet.handler.SimpleMappingExceptionResolver">
        <property name="exceptionMappings">
            <props>
                <prop key="java.lang.ArrayIndexOutOfBoundsException">arrEx</prop>
                <!--<prop key="java.lang.Exception">allEx</prop>-->
            </props>
        </property>
    </bean>



    <!--加入两个常规配置-->
    <!--支持SpringMVC的高级功能,比如JSR303校验, 映射动态请求-->
    <mvc:annotation-driven></mvc:annotation-driven>
<!--    将springmvc不能处理的请求,交给tomcat处理,比如css, js-->
    <mvc:default-servlet-handler/>
</beans>

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

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

相关文章

linux 互斥量pthread_mutex

专栏内容&#xff1a;linux下并发编程个人主页&#xff1a;我的主页座右铭&#xff1a;天行健&#xff0c;君子以自强不息&#xff1b;地势坤&#xff0c;君子以厚德载物&#xff0e; 目录 前言 概述 原理 初始化 进程和线程使用的不同点 死锁 接口 基本API 属性设置 …

探索机器翻译:从统计机器翻译到神经机器翻译

❤️觉得内容不错的话&#xff0c;欢迎点赞收藏加关注&#x1f60a;&#x1f60a;&#x1f60a;&#xff0c;后续会继续输入更多优质内容❤️ &#x1f449;有问题欢迎大家加关注私戳或者评论&#xff08;包括但不限于NLP算法相关&#xff0c;linux学习相关&#xff0c;读研读博…

Osek网络管理及ETAS实现

OSEK/VDX&#xff08;Offene Systeme und deren Schnittstellen fr die Elektronik in Kraftfahrzeugen / Vehicle Distributed eXecutive&#xff09;是一种用于嵌入式系统&#xff08;尤其是汽车电子控制单元&#xff09;的开放标准。它旨在提供一种统一、可互操作的软件架构…

关于 《python 从入门到实践》的 matplotlib 随机漫步小项目

使用 python 生成随机漫步数据&#xff0c;再使用 matplotlib 将数据呈现。 所谓随机漫步&#xff1a; 每次行走的路径都是完全随机的&#xff0c;就像蚂蚁在晕头转向的情况下&#xff0c;每次都沿随机方向前行路径。 在自然界&#xff0c;物理学&#xff0c;生物学&#xff0…

【Linux】Job for network.service failed(网卡启动报错)

上图是Linux网卡启动报错的情况 这是由于cat/etc/sysconfig/network-scripts/ifcfg-xxx 中HWADDR的MAC地址和ifconfig中的MAC地址不一样&#xff0c;或者缺少cat/etc/sysconfig/network-scripts/ifcfg-xxx 中HWADDR的MAC地址 1.查看ifconfig中的MAC地址 图中00&#xff1a;0c…

【新星计划-2023】IP地址是什么?IP地址的主要功能是什么?

IP地址在生活中是很常见的&#xff0c;我们所使用的手机、电脑等等&#xff0c;都有一个IP地址&#xff0c;那么IP地址是什么&#xff1f;通过IP地址又能干什么&#xff1f;下文就来给大家详细的讲解一下。 一、什么是IP地址 通常我们说的IP地址多数是指互联网中联网的IP地址…

Java 基础进阶篇(十一)—— Arrays 与 Collections 工具类

文章目录 一、Arrays工具类1.1 Arrays 类常用方法1.2 对于 Comparator 比较器的支持1.3 Arrays 的综合应用1.3.1 应用一&#xff1a;数组的降序排序1.3.2 应用二&#xff1a;根据学生年龄进行排序 二、Collections工具类2.1 Collections 类常用方法2.2 Collections 排序相关 AP…

神经网络实验---梯度下降法

本次实验主要目的是掌握梯度下降法的基本原理&#xff0c;能够使用梯度下降法求解一元和多元线性回归问题。 文章目录 目录 文章目录 1. 实验目的 2. 实验内容 3. 实验过程 题目一&#xff1a; 题目二&#xff1a; 题目三&#xff1a; 实验小结&讨论题 1. 实验目的 ① 掌握…

〖Python网络爬虫实战㉓〗- Ajax数据爬取之什么是Ajax

订阅&#xff1a;新手可以订阅我的其他专栏。免费阶段订阅量1000 python项目实战 Python编程基础教程系列&#xff08;零基础小白搬砖逆袭) 说明&#xff1a;本专栏持续更新中&#xff0c;目前专栏免费订阅&#xff0c;在转为付费专栏前订阅本专栏的&#xff0c;可以免费订阅付…

23.5.7总结(学习通项目思路)

项目思路&#xff1a; 注册&#xff1a;输入邮箱&#xff08;判重&#xff09;&#xff0c;两次输入密码&#xff0c;获得的正确的验证码&#xff0c;获得不重复的用户名。 登录&#xff1a;输入用户名和密码登录。 忘记密码&#xff1a;输入邮箱&#xff08;和用户名&#…

RK3588平台开发系列讲解(进程篇)可执行文件内部结构

平台内核版本安卓版本RK3588Linux 5.10Android 12文章目录 一、 ELF 文件的两大组成部分二、文件头三、程序头和节区头四、ELF 文件的细节结构沉淀、分享、成长,让自己和他人都能有所收获!😄 📢在 Linux 中,二进制可执行文件的标准格式叫做 ELF(Executable and Linkabl…

ARP协议结构

文章目录 概念ARP协议格式ARP协议的作用ARP协议的工作流程 首先提出一个问题&#xff0c;来理解ARP解决什么问题 已知报文在数据链路层传输的过程中&#xff08;假设是主机A到主机B&#xff09;&#xff0c;是通过路由器之间的跳转&#xff0c;根据路由表&#xff0c;结合目的…

【论文】SimCLS:一个简单的框架 摘要总结的对比学习(1)

SimCLS:摘要总结的对比学习(1&#xff09; 写在最前面模型框架 摘要1 简介 写在最前面 SimCLS: A Simple Framework for Contrastive Learning of Abstractive Summarization&#xff08;2021ACL会议&#xff09; https://arxiv.org/abs/2106.01890 论文&#xff1a;https://…

【c语言小demo】登录demo | 账号密码验证功能

创作不易&#xff0c;本篇文章如果帮助到了你&#xff0c;还请点赞 关注支持一下♡>&#x16966;<)!! 主页专栏有更多知识&#xff0c;如有疑问欢迎大家指正讨论&#xff0c;共同进步&#xff01; 给大家跳段街舞感谢支持&#xff01;ጿ ኈ ቼ ዽ ጿ ኈ ቼ ዽ ጿ ኈ ቼ …

postgresql insert ddl执行流程分析

专栏内容&#xff1a;postgresql内核源码分析个人主页&#xff1a;我的主页座右铭&#xff1a;天行健&#xff0c;君子以自强不息&#xff1b;地势坤&#xff0c;君子以厚德载物&#xff0e; 目录 前言 总体流程 调用堆栈 执行接口说明 详细流程分解 ExecInsert对于普通表…

Java9

Java9 &#xff08;一&#xff09;、stream流1.1 Stream流的中间方法和终结方法 &#xff08;二&#xff09;、方法引用2.1 方法引用的分类 &#xff08;三&#xff09;、异常3.1 编译时异常和运行时异常3.2 异常的作用3.3 异常的处理方式3.4 异常中的常见方法3.5 自定义异常 &…

麒麟设置分辨率

为什么要设置------额。。。。虚拟机启动的&#xff0c;直接满屏了。。。。也不能移动 命令设置法 1、可以通过xrandr命令来设置屏幕分辨率。先查询当前分辨率&#xff0c;及当前支持的分辨率。 xrandr 2、可以通过-s参数来设置为1920x1440 xrandr -s 1920x1440 这就好…

Midjouney prompt优化

Midjouney prompt优化 总述1. Midjouney1.1 常见出图方式1.2 图片参数 2. prompt2.1 prompt关键词框架逻辑2.2 关键词技巧2.3 分类关键词2.3.1 媒体类型、介质和渲染引擎2.3.2 艺术风格2.3.2.1常见风格关键词2.3.2.2 艺术风格介绍2.3.2.3 绘画风格关键词和作品 2.3.3 相机镜头和…

面试官从这些方面考察你的Android开发水平!

View基础(25题) 什么是ViewView的位置参数MotionEventViewRootDecorViewMeasureSpec View三大流程(28题) measure过程ViewViewGrouplayout过程draw过程获取View的宽高Activity启动到加载ViewRoot的流程 自定义View(26题) 四种实现方法直接继承View自定义属性直接继承ViewG…

C++三大特性—继承“复杂的菱形继承及菱形虚拟继承”

C的一个大坑&#xff1a;菱形继承 希望这篇文章能让你理解什么是菱形继承&#xff0c;以及菱形继承的注意事项 单继承与多继承 单继承&#xff1a;一个子类只有一个直接父类时称这个继承关系为单继承 多继承&#xff1a;一个子类有两个或以上直接父类时称这个继承关系为多继承…