ControllerAdvice 使用演示(三)

简介: 在spring 3.2中,新增了@ControllerAdvice 注解,并应用到所有@RequestMapping中,可以用于定义• @ExceptionHandler 处理异常情况,根据异常类型选择处理方法;• @InitBinder 数据类型转换等, 如前端请求所有参数都是字符串, 后端需要日期,则可以在此设定统一转换格式;• @ModelAttribute 视图中共用的变量。@ControllerAdvice 定义了多个时,通过 @Order/@Priority 指定执行顺序。

Spring MVC SimpleUrlHandlerMapping示例


SimpleUrlHandlerMapping 是所有处理程序映射中最简单的映射,它允许您指定URL模式和显式处理程序.

之前我们已经了解了 Spring MVC BeanNameUrlHandlerMapping 和Spring MVC ControllerClassNameHandlerMapping。现在让我们看一下SimpleUrlHandlerMapping, 这种类型的HandlerMapping是所有处理程序映射中最简单的,它允许您显式指定URL模式和处理程序

有两种定义 SimpleUrlHandlerMapping的方法,即 使用<value>标签和<props>标签。 SimpleUrlHandlerMapping 有一个称为映射的属性,我们将向其传递URL模式。


使用<value>标签

左侧的URL模式 “=” 右侧bean的ID或name

<bean class="org.springframework.web.servlet.handler.SimpleUrlHandlerMapping">
  <property name="mappings">
     <value>
        /welcome.htm=welcomeController
        /welcome*=welcomeController
        /hell*=helloWorldController
        /helloWorld.htm=helloWorldController
      </value>
    </property>
 </bean>


使用<props>标签

该属性的键是URL模式,属性值是bean的引用或名称

<bean class="org.springframework.web.servlet.handler.SimpleUrlHandlerMapping">
    <property name="mappings">
       <props>
          <prop key="/welcome.htm">welcomeController</prop>
          <prop key="/welcome*">welcomeController</prop>
          <prop key="/helloworld">helloWorldController</prop>
          <prop key="/hello*">helloWorldController</prop>
          <prop key="/HELLOworld">helloWorldController</prop>
     </props>
   </property>
</bean>

1.文件夹结构:创建一个动态Web项目 “ SpringMVCHandlerMappingTutorial”, 并为我们的src文件“com.github.yujiaao ”创建一个包;

  1. 将Spring 3 jar文件放在WEB-INF/lib下
commons-logging-1.1.1.jarlog4j-1.2.16.jarslf4j-api-1.7.5.jarslf4j-log4j12-1.7.5.jarspring-aspects-3.2.4.RELEASE.jarspring-beans-3.2.4.RELEASE.jarspring-context-3.2.4.RELEASE.jarspring-core-3.2.4.RELEASE.jarspring-expression-3.2.4.RELEASE.jarspring-web-3.2.4.RELEASE.jarspring-webmvc-3.2.4.RELEASE.jar
  1. 在com.github.yujiaao 文件夹下 创建Java类HelloWorldController.java和WelcomeController.java。
  2. 将 SpringConfig-servlet.xml和web.xml 放在 WEB-INF目录下
  3. 视图模板文件helloWorld.jsp 和welcome.jsp 放在WEB-INF/jsp下的子目录下


HelloWorldController.java

我们的HelloWorldController类扩展了AbstractController类,并覆盖了“ handleRequestInternal()”方法。

import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import org.springframework.web.servlet.ModelAndView;
import org.springframework.web.servlet.mvc.AbstractController;
public class HelloWorldController extends AbstractController
{
    @Override
    protected ModelAndView handleRequestInternal(HttpServletRequest request,
            HttpServletResponse response) throws Exception {
        System.out.println("Inside HelloWorldController");
        ModelAndView model = new ModelAndView("helloWorld");
        model.addObject("msg", "HandlerMappingDemo");
        return model;
    }
}


WelcomeController.java

WelcomeController与HelloWorldController几乎相同,除了重定向页面和传递的String。

import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import org.springframework.web.servlet.ModelAndView;
import org.springframework.web.servlet.mvc.AbstractController;
public class WelcomeController extends AbstractController
{
    @Override
    protected ModelAndView handleRequestInternal(HttpServletRequest request,
            HttpServletResponse response) throws Exception {
        System.out.println("Inside WelcomeController");
        ModelAndView model = new ModelAndView("welcome");
        model.addObject("msg", "HandlerMappingDemo");
        return model;
    }
}


helloWorld.jsp

<%@ page language="java" contentType="text/html; charset=ISO-8859-1"
 pageEncoding="ISO-8859-1"%>
<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">
<html>
    <head>
       <meta http-equiv="Content-Type" content="text/html; charset=ISO-8859-1">
       <title>Insert title here</title>
    </head>
    <body>
       <h2>Hello World ${msg}</h2>
    </body>
</html>


welcome.jsp

<%@ page language="java" contentType="text/html; charset=ISO-8859-1"
 pageEncoding="ISO-8859-1"%>
<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">
<html>
    <head>
        <meta http-equiv="Content-Type" content="text/html; charset=ISO-8859-1">
        <title>Insert title here</title>
    </head>
    <body>
        <h2> Welcome to ${msg}</h2>
    </body>
</html>


web.xml

web.xml包含服务器需要了解的有关应用程序的所有内容,这些内容位于WEB-INF目录下。<servlet-name> 包含SpringConfiguration的名称,初始化DispatcherServlet 时,框架将尝试在WEB-INF目录下加载配置文件“ [servlet-name] -servlet.xml” 。

<?xml version="1.0" encoding="UTF-8"?>
<web-app xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
    xmlns="http://java.sun.com/xml/ns/javaee" xmlns:web="http://java.sun.com/xml/ns/javaee/web-app_2_5.xsd"
    xsi:schemaLocation="http://java.sun.com/xml/ns/javaee    http://java.sun.com/xml/ns/javaee/web-app_2_5.xsd"
    id="WebApp_ID" version="2.5">
    <display-name>SpringMVCFormHandling</display-name>
    <welcome-file-list>
        <welcome-file>index.html</welcome-file>
        <welcome-file>index.htm</welcome-file>
        <welcome-file>index.jsp</welcome-file>
        <welcome-file>default.html</welcome-file>
        <welcome-file>default.htm</welcome-file>
        <welcome-file>default.jsp</welcome-file>
    </welcome-file-list>
    <servlet>
        <servlet-name>SpringConfig</servlet-name>
        <servlet-class>org.springframework.web.servlet.DispatcherServlet</servlet-class>
    </servlet>
    <servlet-mapping>
        <servlet-name>SpringConfig</servlet-name>
        <url-pattern>/</url-pattern>
    </servlet-mapping>
</web-app>


SpringConfig-servlet.xml

  • 该SpringConfig-servlet.xml中也被放置在WEB-INF目录下。
  • 在这里,我们已将SimpleUrlHandlerMapping配置 为HandlerMapping
  • 每个请求也都映射到一个控制器
<beans xmlns="http://www.springframework.org/schema/beans" 
xmlns:context="http://www.springframework.org/schema/context"
xmlns:mvc="http://www.springframework.org/schema/mvc"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation=" http://www.springframework.org/schema/beans    
http://www.springframework.org/schema/beans/spring-beans-3.0.xsd    
http://www.springframework.org/schema/context    
http://www.springframework.org/schema/context/spring-context-3.0.xsd    
http://www.springframework.org/schema/mvc    
http://www.springframework.org/schema/mvc/spring-mvc-3.0.xsd"> 
      <bean class="org.springframework.web.servlet.view.InternalResourceViewResolver">
         <property name="prefix" value="/WEB-INF/Jsp/"/>
         <property name="suffix" value=".jsp"/>
     </bean>
     <bean class="org.springframework.web.servlet.handler.SimpleUrlHandlerMapping">
        <property name="mappings">
            <props>
                <prop key="/welcome.htm">welcomeController</prop>
                <prop key="/welcome*">welcomeController</prop>
                <prop key="/helloworld">helloWorldController</prop>
                <prop key="/hello*">helloWorldController</prop>
                <prop key="/HELLOworld">helloWorldController</prop>
           </props>
       </property>
</bean>
   <bean id="helloWorldController" class="com.github.yujiaao.HelloWorldController"></bean>
   <bean id="welcomeController" class="com.github.yujiaao.WelcomeController"></bean>
</beans>

在上面的例子中

  • 请求helloworld时,DispatcherServlet将其重定向到HelloWorldController。
  • 请求hello123时 ,DispatcherServlet将其重定向到HelloWorldController。
  • 请求HELLOworld时 ,DispatcherServlet将其重定向到HelloWorldController。
  • 请求welcome.htm时,DispatcherServlet将其重定向到WelcomeController。
  • 请求welcome123,DispatcherServlet将其重定向到WelcomeController。
  • 请求hELLOWorld ,您将收到404 错误,因为我们为其添加了映射。

HelloWorldController调用时的输出

Hello World HandlerMappingDemo

当WelcomeController调用时

Welcome to HandlerMappingDemo
相关文章
|
1月前
|
前端开发 Java
|
1月前
|
Java 数据库 Spring
Spring Boot的异常统一处理实战(包括@ExceptionHandler注解和@ControllerAdvice注解 附源码 超详细)
Spring Boot的异常统一处理实战(包括@ExceptionHandler注解和@ControllerAdvice注解 附源码 超详细)
124 0
|
1月前
|
XML Java API
springboot 常用的注解标签的概念及用法RequiredArgsConstructor 、RestController、RequestMapping
【4月更文挑战第12天】在 Spring Boot 中,@RequiredArgsConstructor, @RestController, 和 @RequestMapping 是常用的注解,每个都有其特定的功能和用法,它们合起来极大地简化了 Spring 应用程序的开发过程。
51 2
|
1月前
|
Java Spring 容器
@PostConstruct注解学习,最详细的分享教程
@PostConstruct注解学习,最详细的分享教程
|
9月前
|
Java
SpringBoot 如何使用 @ExceptionHandler 注解进行局部异常处理
SpringBoot 如何使用 @ExceptionHandler 注解进行局部异常处理
|
10月前
|
数据采集 前端开发 Java
SpringMVC 中 @ControllerAdvice 注解的三种使用场景!
SpringMVC 中 @ControllerAdvice 注解的三种使用场景!
|
9月前
|
存储 Java Spring
SpringBoot 如何使用 @ControllerAdvice 注解处理异常消息
SpringBoot 如何使用 @ControllerAdvice 注解处理异常消息
|
9月前
|
前端开发 Java Spring
Spring Boot 如何使用 @ExceptionHandler 注解进行局部异常处理
Spring Boot 如何使用 @ExceptionHandler 注解进行局部异常处理
|
JSON 前端开发 Java
Spring Boot2.x-11 使用@ControllerAdvice和@ExceptionHandler实现自定义全局异常
Spring Boot2.x-11 使用@ControllerAdvice和@ExceptionHandler实现自定义全局异常
124 0
ControllerAdvice注解的用法
可以看出ControllerAdvice本质上是一个Component,因此也会被当做组件扫描
ControllerAdvice注解的用法