SpringMVC请求映射:@Controller注解与@RequestMapping注解的使用

在日常的基于SpringMVC框架开发中会经常使用<annotation-driven>标签,<annotation-driven>标签是一种简写模式,使用默认配置替代了一般的手动配置。<annotation-driven>标签会自动注册处理器映射器和处理器适配器,分别为RequestMappingHandlerMapping和RequestMappingHandlerAdapter。然后再配置<component-scan>标签,目的是为了让注解的处理器映射器和处理器适配器找到注解的Handler,使用扫描配置,对某一个包下的所有类进行扫描,找出所有使用@Controller注解的Handler控制器类。配置信息如下:

<!-- 开启SpringMVC注解模式(设置注解映射器、注解适配器) -->
<mvc:annotation-driven></mvc:annotation-driven>

<!-- 方式一:使用扫描配置,对某一个包下的所有类进行扫描,找出所有使用@Controller注解的Handler控制器类 -->
<context:component-scan base-package="com.pjb.mvc.controller"></context:component-scan>

<!-- 方式二:使用声明相关bean信息 -->
<!--<bean class="com.pjb.mvc.controller.UserController"></bean>-->

1、@Controller注解

在配置了注解的处理器映射器和适配器的情况下,当使用@Controller注解去标识一个类时,其实就是告诉SpringMVC该类时一个Handler控制器类。在配置<component-scan>标签后,当Spring初始化Bean信息时,会扫描到所有标注了@Controller注解的类,并作为Handler来加载。

【示例】创建用户控制器类(UserController.java),使用@Controller注解标识该类为一个控制器类。

/**
 * 用户控制器
 * 使用@Controller注解来标识它是一个控制器
 * @author pan_junbiao
 **/
@Controller
public class UserController
{

}

2、@RequestMapping注解

2.1 @RequestMapping注解的使用

@RequestMapping注解的作用是为控制器指定可以处理哪些URL请求,该注解可以放置在类上或者方法上。当放置在类上,提供初步的URL请求映射信息,即一个前置请求路径(相对于Web应用的根目录)。当放置在方法上时,提供进一步的细分URL映射信息,相对于类定义处的URL。若类定义处未标注@RequestMapping注解,则方法处标记的URL相对于Web应用的根目录。

【示例】创建用户控制器类(UserController.java),使用@Controllerg注解标识该类为一个控制器类,使用@RequestMapping注解为类和方法指定URL映射名。

/**
 * 用户控制器
 * 使用@Controller注解来标识它是一个控制器
 * 使用@RequestMapping注解为控制器类指定一个URL映射名
 * @author pan_junbiao
 **/
@Controller
@RequestMapping("/user")
public class UserController
{
    /**
     * 获取用户名称
     * 使用@RequestMapping注解为方法指定一个URL映射名
     */
    @RequestMapping("/getUserName")
    public String getUserName()
    {
        return "pan_junbiao的博客";
    }
}

假设工程名为“SpringMVCFirstDemo”,默认后缀名为“.action”。那么这里的getUserName()处理的URL请求路径则是:http://localhost:8080/SpringMVCFirstDemo/user/getUserName.action

2.2 @RequestMapping注解提供的属性

@RequestMapping注解提供了一些属性,可以用来限制请求方法、请求参数、请求头。

2.2.1 method属性

对于请求方法,@RequestMapping注解的method属性可以指定“GET” 或“POST”请求类型,表明该URL只能以某种请求方式请求才能获得相应:

@Controller
public class UserController
{
    @RequestMapping(value = "/getUserName",method = RequestMethod.GET)
    public String getUserName()
    {
        return "pan_junbiao的博客";
    }
}

这里访问“/getUserName”请求时,只能接受GET请求。可以看到,指定“GET” 或“POST”请求类型需要由RequestMethod枚举类来表示,已达到一种规范。

2.2.2 params属性

对于请求参数,@RequestMapping注解的params属性可以指定某一种参数名类型,当请求数据中含有该名称的请求参数时,才能进行相应:

@Controller
public class UserController
{
    @RequestMapping(value = "/getUserName",params = "username")
    public String getUserName()
    {
        System.out.println("只接受包含username参数的请求");
        return "pan_junbiao的博客";
    }
}

该配置表示,当一个URL请求中不包含有名称为“username”的参数时,该方法就拒绝此次请求。

此外,Spring4.3之后引入了一系列@RequestMapping的变种。如下:

  • @GetMapping
  • @PostMapping
  • @PutMapping
  • @PatchMapping
  • @DeleteMapping

2.2.3 headers属性

对于请求头,@RequestMapping注解的headers属性可以指定某一种请求头类型,当请求数据头的类型符合指定值时,才能进行响应:

@Controller
public class UserController
{
    @RequestMapping(value = "/getUserName",headers = "contentType:text/html;charset=UTF-8")
    public String getUserName()
    {
        System.out.println("只接受请求头中contentType为:text/html;charset=UTF-8的请求");
        return "pan_junbiao的博客";
    }
}

该配置表示,当一个请求头中的contentType为“text/html;charset=UTF-8”的参数时,该方法才会处理此次请求。

2.2.4 consumes属性

@RequestMapping注解的consumes属性表示处理请求的提交内容类型(Content-Type),例如“application/json,text/html”。

@Controller
public class UserController
{
    @RequestMapping(value="/addUser",method=RequestMethod.POST,consumes="application/json")
    public void addUser(UserModel userModel)
    {
        //忽略具体逻辑...
    }
}

该配置表示方法仅处理request的Content-Type为“application/json”类型的请求。

2.2.5 produces属性

@RequestMapping注解的produces属性表示返回的内容类型,仅当request请求头中的(Accept)类型中包含该指定类型时才返回。

@Controller
public class UserController
{
    @RequestMapping(value="/getUser",method=RequestMethod.GET,produces="application/json")
    @ResponseBody
    public UserModel getUser(String userId)
    {
        //忽略具体逻辑...
    }
}

该配置表示方法仅处理request请求中Accept头中包含“application/json”的请求,同时暗示了返回的内容类型为“application/json”。

小贴士:指定consumes和produces可以规范请求的Content-Type内容类型。

【示例】通过设置@RequestMapping注解的produces属性,解决SpringMVC返回字符串中文乱码问题。

/**
 * SpringMVC返回字符串结果,并解决中文乱码问题
 *
 * @author pan_junbiao
 */
@RequestMapping(value = "/getMessage", produces = {"text/html;charset=UTF-8;", "application/json;"})
@ResponseBody
public String getMessage()
{
    return "您好,欢迎访问 pan_junbiao的博客";
}

3、综合实例

【实例】使用@Controller与@RequestMapping注解实现用户控制器类,模拟用户信息的增删改查操作,并显示用户信息。执行结果如下图:

(1)Controller控制器类:用户控制器(UserController.java)。

package com.pjb.mvc.controller;

import com.pjb.mvc.model.UserModel;
import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RequestMethod;
import org.springframework.web.servlet.ModelAndView;

/**
 * 用户控制器
 * 使用@Controller注解来标识它是一个控制器
 * 使用@RequestMapping注解指定一个URL映射名
 * @author pan_junbiao
 **/
@Controller
@RequestMapping("/user")
public class UserController
{
    /**
     * 获取用户
     * 使用@RequestMapping注解为方法指定一个URL映射名
     */
    @RequestMapping(value="/getUser",method=RequestMethod.GET)
    public ModelAndView getUser()
    {
        //获取用户信息(模拟Service层的业务)
        UserModel userModel = new UserModel();
        userModel.setUserId(1);
        userModel.setUserName("pan_junbiao的博客");
        userModel.setBlogUrl("https://blog.csdn.net/pan_junbiao");
        userModel.setRemark("您好,欢迎访问 pan_junbiao的博客");

        //创建返回结果ModelAndView对象
        ModelAndView modelAndView = new ModelAndView();
        //相当于request的setAttribut方法
        modelAndView.addObject("userInfo",userModel);
        //指定视图
        modelAndView.setViewName("/userInfo");
        return modelAndView;
    }

    /**
     * 新增用户
     */
    @RequestMapping(value="/addUser",method=RequestMethod.POST)
    public void addUser(UserModel userModel)
    {
        //忽略具体逻辑...
    }

    /**
     * 修改用户
     */
    @RequestMapping(value="/updateUser",method=RequestMethod.POST)
    public void updateUser(UserModel userModel)
    {
        //忽略具体逻辑...
    }

    /**
     * 删除用户
     */
    @RequestMapping(value="/deleteUser",method=RequestMethod.POST)
    public void deleteUser(int userId)
    {
        //忽略具体逻辑...
    }
}

(2)Model模型类:用户信息模型类(UserModel.java)。

package com.pjb.mvc.model;
 
/**
 * 用户信息模型类
 * @author pan_junbiao
 **/
public class UserModel
{
    private int userId; //用户编号
    private String userName; //用户姓名
    private String blogUrl; //博客地址
    private String remark; //备注
 
    //省略getter与setter方法...
}

(3)View视图:创建名称为userInfo.jsp的JSP页面,用于显示用户信息。

<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<html>
<head>
    <title>用户信息</title>
    <meta name="author" content="pan_junbiao的博客">
    <style>
        table { border-collapse: collapse;}
        table,table tr th, table tr td { border:1px solid #000000; padding: 5px 10px;}
    </style>
</head>
<body>
    <table align="center">
        <caption>用户信息</caption>
        <tr>
            <th>用户编号</th>
            <td>${userInfo.userId}</td>
        </tr>
        <tr>
            <th>用户姓名</th>
            <td>${userInfo.userName}</td>
        </tr>
        <tr>
            <th>博客地址</th>
            <td>${userInfo.blogUrl}</td>
        </tr>
        <tr>
            <th>备注信息</th>
            <td>${userInfo.remark}</td>
        </tr>
    </table>
</body>
</html>
发布了354 篇原创文章 · 获赞 208 · 访问量 165万+

猜你喜欢

转载自blog.csdn.net/pan_junbiao/article/details/103727318