• Spring MVC中@Controller和@RequestMapping注解详解


    在《第一个Spring MVC应用》教程中创建了两个传统风格的控制器,它们是实现 Controller 接口的类。传统风格的控制器不仅需要在配置文件中部署映射,而且只能编写一个处理方法,不够灵活。使用基于注解的控制器具有以下两个优点:

    • 在基于注解的控制器类中可以编写多个处理方法,进而可以处理多个请求(动作),这就允许将相关的操作编写在同一个控制器类中,从而减少控制器类的数量,方便以后的维护。
    • 基于注解的控制器不需要在配置文件中部署映射,仅需要使用 RequestMapping 注释类型注解一个方法进行请求处理。

    在 Spring MVC 中最重要的两个注解类型是 Controller 和 RequestMapping,本节将重点介绍它们。在本节将创建一个 Spring MVC 应用 springMVCDemo02 来演示相关知识,springMVCDemo01 的 JAR 包、web.xml 与 springMVCDemo02 应用的 JAR 包、web.xml 完全一样。

    Controller 注解类型

    在 Spring MVC 中使用 org.springframework.stereotype.Controller 注解类型声明某类的实例是一个控制器。例如,在 springMVCDemo02 应用的 src 目录下创建 controller 包,并在该包中创建 Controller 注解的控制器类 IndexController,示例代码如下:

    1. package controller;
    2. import org.springframework.stereotype.Controller;
    3. /**
    4. * “@Controller”表示 IndexController 的实例是一个控制器
    5. *
    6. * @Controller相当于@Controller(@Controller) 或@Controller(value="@Controller")
    7. */
    8. @Controller
    9. public class IndexController {
    10. // 处理请求的方法
    11. }

    在 Spring MVC 中使用扫描机制找到应用中所有基于注解的控制器类,所以,为了让控制器类被 Spring MVC 框架扫描到,需要在配置文件中声明 spring-context,并使用 元素指定控制器类的基本包(请确保所有控制器类都在基本包及其子包下)。

    例如,在 springMVCDemo02 应用的 /WEB-INF/ 目录下创建配置文件 springmvc-servlet.xml,示例代码如下:

    1. xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
    2. xmlns:mvc="http://www.springframework.org/schema/mvc"
    3. xmlns:p="http://www.springframework.org/schema/p"
    4. xmlns:context="http://www.springframework.org/schema/context"
    5. xsi:schemaLocation="
    6. http://www.springframework.org/schema/beans
    7. http://www.springframework.org/schema/beans/spring-beans.xsd
    8. http://www.springframework.org/schema/context
    9. http://www.springframework.org/schema/context/spring-context.xsd
    10. http://www.springframework.org/schema/mvc
    11. http://www.springframework.org/schema/mvc/spring-mvc.xsd">

    RequestMapping 注解类型

    在基于注解的控制器类中可以为每个请求编写对应的处理方法。那么如何将请求与处理方法一一对应呢?

    需要使用 org.springframework.web.bind.annotation.RequestMapping 注解类型将请求与处理方法一一对应。

    1)方法级别注解

    方法级别注解的示例代码如下:

    1. package controller;
    2. import org.springframework.stereotype.Controller;
    3. import org.springframework.web.bind.annotation.RequestMapping;
    4. /**
    5. * “@Controller”表示 IndexController 的实例是一个控制器
    6. *
    7. * @Controller相当于@Controller(@Controller) 或@Controller(value="@Controller")
    8. */
    9. @Controller
    10. public class IndexController {
    11. @RequestMapping(value = "/index/login")
    12. public String login() {
    13. /**
    14. * login代表逻辑视图名称,需要根据Spring MVC配置
    15. * 文件中internalResourceViewResolver的前缀和后缀找到对应的物理视图
    16. */
    17. return "login";
    18. }
    19. @RequestMapping(value = "/index/register")
    20. public String register() {
    21. return "register";
    22. }
    23. }

    上述示例中有两个 RequestMapping 注解语句,它们都作用在处理方法上。注解的 value 属性将请求 URI 映射到方法,value 属性是 RequestMapping 注解的默认属性,如果只有一个 value 属性,则可以省略该属性。

    用户可以使用如下 URL 访问 login 方法(请求处理方法),在访问 login 方法之前需要事先在 /WEB-INF/jsp/ 目录下创建 login.jsp。

    1. http://localhost:8080/springMVCDemo02/index/login

    2)类级别注解

    类级别注解的示例代码如下:

    1. package controller;
    2. import org.springframework.stereotype.Controller;
    3. import org.springframework.web.bind.annotation.RequestMapping;
    4. @Controller
    5. @RequestMapping("/index")
    6. public class IndexController {
    7. @RequestMapping("/login")
    8. public String login() {
    9. return "login";
    10. }
    11. @RequestMapping("/register")
    12. public String register() {
    13. return "register";
    14. }
    15. }

    在类级别注解的情况下,控制器类中的所有方法都将映射为类级别的请求。用户可以使用如下 URL 访问 login 方法。

    1. http://localhost:8080/springMVCDemo02/index/login

    为了方便维护程序,建议开发者采用类级别注解,将相关处理放在同一个控制器类中。例如,对商品的增、删、改、查处理方法都可以放在 GoodsOperate 控制类中。

    编写请求处理方法

    在控制类中每个请求处理方法可以有多个不同类型的参数,以及一个多种类型的返回结果。

    1)请求处理方法中常出现的参数类型

    如果需要在请求处理方法中使用 Servlet API 类型,那么可以将这些类型作为请求处理方法的参数类型。Servlet API 参数类型的示例代码如下:

    1. package controller;
    2. import javax.servlet.http.HttpSession;
    3. import org.springframework.stereotype.Controller;
    4. import org.springframework.web.bind.annotation.RequestMapping;
    5. @Controller
    6. @RequestMapping("/index")
    7. public class IndexController {
    8. @RequestMapping("/login")
    9. public String login(HttpSession session,HttpServletRequest request) {
    10. session.setAttribute("skey", "session范围的值");
    11. session.setAttribute("rkey", "request范围的值");
    12. return "login";
    13. }
    14. }

    除了 Servlet API 参数类型以外,还有输入输出流、表单实体类、注解类型、与 Spring 框架相关的类型等,这些类型在后续章节中使用时再详细介绍。

    其中特别重要的类型是 org.springframework.ui.Model 类型,该类型是一个包含 Map 的 Spring 框架类型。在每次调用请求处理方法时 Spring MVC 都将创建 org.springframework.ui.Model 对象。Model 参数类型的示例代码如下:

    1. package controller;
    2. import javax.servlet.http.HttpServletRequest;
    3. import javax.servlet.http.HttpSession;
    4. import org.springframework.stereotype.Controller;
    5. import org.springframework.ui.Model;
    6. import org.springframework.web.bind.annotation.RequestMapping;
    7. @Controller
    8. @RequestMapping("/index")
    9. public class IndexController {
    10. @RequestMapping("/register")
    11. public String register(Model model) {
    12. /*在视图中可以使用EL表达式${success}取出model中的值*/
    13. model.addAttribute("success", "注册成功");
    14. return "register";
    15. }
    16. }

    2)请求处理方法常见的返回类型

    最常见的返回类型就是代表逻辑视图名称的 String 类型,例如前面教程中的请求处理方法。除了 String 类型以外,还有 ModelAndView、Model、View 以及其他任意的 Java 类型。

  • 相关阅读:
    【排序14:存在重复元素】
    让Pegasus天马座开发板实现超声波测距
    制作一个简单HTML静态网页(HTML+CSS)
    峰会回顾 | 阿里云与StarRocks合作、开放、共赢
    java.sql.SQLExceptio
    Spring -Spring之依赖注入源码解析(下)--实践(流程图)
    设计模式六大原则
    Redis 除了做缓存,还能做什么?
    【web前端】单向数据绑定和双向数据绑定有什么区别?
    设计模式-备忘录模式
  • 原文地址:https://blog.csdn.net/unbelievevc/article/details/128130164