SpringMVC学习笔记——@RequestMapping以及相关注解

注解位置

  1. 类定义处
    提供初步的请求映射信息。相对于WEB应用的根目录。
  2. 方法处
    提供进一步的细分映射信息。相对于类定义处的URL,若类定义处未标注@RequestMapping,则方法处标记的URL相对于WEB应用的根目录。
    如:
@RequestMapping("/springmvc")
@Controller
public class SrpingMVCTest {

    private static final String SUCCESS = "success";

    /**
     * 1. @RequestMapping 除了修饰方法,还可修饰类
     * 2. 区别:
     * 1). 类定义处:提供初步的请求映射信息。相对于WEB应用的根目录。
     * 2). 方法处:提供进一步的细分映射信息。相对于类定义处的URL,
     * 若类定义处未标注@RequestMapping,则方法处标记的URL相对于WEB应用的根目录。
     * @return
     */
    @RequestMapping("/testRequestMapping")
    public String testRequestMapping() {
        System.out.println("testRequestMapping");
        return SUCCESS;
    }
}

访问http://localhost:8080/springMVC1/springmvc/testRequestMapping,会被该方法处理,注意其中是类定义的@RequestMapping和方法的@RequestMapping共同拼成的URL(springmvc/testRequestMapping)。

请求方式

HTTP请求分为POST和GET请求(DELETE、PUT),通过@RequestMapping中的method属性,可以设置处理请求的请求方式。
Java代码如下:

/**
     * 常用:使用method属性指定请求方式
     */
    @RequestMapping(value = "/testMethod", method = RequestMethod.POST)
    public String testMethod() {
        System.out.println("testMethod");
        return SUCCESS;
    }

Jsp访问代码如下:

<body>
    <form action="springmvc/testMethod" method="POST">
        <input type="submit" value="submit">
        </from>
        <a href="springmvc/testMethod">Test Method</a>
        <br />
        <a href="springmvc/testRequestMapping">Test RequestMapping</a>
        <br />
        <a href="helloworld">Hello World</a>
</body>

请求参数和请求头(了解)

在@RequestMapping中,有两个属性,params设置请求参数,headers设置请求头,从命名上看,是复数,说明可以设置多个值。
params和headers支持简单的表达式
- param1:表示请求必须包含名为param1的请求参数
- !param1:表示请求不能包含名为param1的请求参数
- param1 != value1:表示请求包含名为param1的请求参数,但其值不能为value1
- {“param1=value1”,”param2”}:请求必须包含名为param1和param2的两个请求参数,且param1参数的值必须为value1
headers同理,也可以设置。
示例代码:

    /**
     * 了解: 可以使用params和headers来更加精确的映射请求,params和headers支持简单的表达式
     * 请求参数中必须含有username和age两个属性,求age不能等于10
     */
    @RequestMapping(value = "/testParamsAndHeaders", params = { "username",
            "age!=10" }, headers = "Accept-Language=zh-CN")
    public String testParamsAndHeaders() {
        System.out.println("testParamsAndHeaders");
        return SUCCESS;
    }

URL通配符

@RequestMapping支持Ant风格资源地址的3种通配符
- ? :匹配一个字符
- * :匹配任意多个字符
- ** :匹配任意多层路径
示例代码:

    /**
     * 该方法处理/testAndPath/任意字符串/abc
     */
    @RequestMapping("/testAndPath/*/abc")
    public String testAndPath() {
        System.out.println("testAndPath");
        return SUCCESS;
    }

@PathVariable(映射URL绑定的占位符)

带占位符的URL是Spring3.0新增的功能,该功能在SoringMVC向REST目标挺进发展过程中具有里程碑的意义。
通过@PathVariable可以将URL中占位符参数绑定到控制器处理方法的入参中:URL中的{XXX}占位符可以通过@PathVariable(“XXX”)绑定到操作方法的入参中。
示例代码:

    /**
     * @PathVariable 可以来映射URL中的占位符到目标方法的参数中
     */
    @RequestMapping("/testPathViariable/{myId}")
    public String testPathViariable(@PathVariable("myId") int id) {
        System.out.println("testPathViariable " + id);
        return SUCCESS;
    }

注意:占位符{X}要与@PathVariable(“X”)的X名字一致。

REST

  • REST:即 Representational State Transfer。(资源)表现层状态转化。是目前最流行的一种互联网软件架构。它结构清晰、符合标准、易于理解、扩展方便,所以正得到越来越多网站的采用。
  • 资源(Resources):网络上的一个实体,或者说是网络上的一个具体信息。它可以是一段文本、一张图片、一首歌曲、一种服务,总之就是一个具体的存在。可以用一个URI(统一资源定位符)指向它,每种资源对应一个特定的 URI 。要获取这个资源,访问它的URI就可以,因此 URI 即为每一个资源的独一无二的识别符。
  • 表现层(Representation):把资源具体呈现出来的形式,叫做它的表现层(Representation)。比如,文本可以用 txt 格式表现,也可以用 HTML 格式、XML 格式、JSON 格式表现,甚至可以采用二进制格式。
  • 状态转化(State Transfer):每发出一个请求,就代表了客户端和服务器的一次交互过程。HTTP协议,是一个无状态协议,即所有的状态都保存在服务器端。因此,如果客户端想要操作服务器,必须通过某种手段,让服务器端发生“状态转化”(State Transfer)。而这种转化是建立在表现层之上的,所以就是 “表现层状态转化”。具体说,就是 HTTP 协议里面,四个表示操作方式的动词:GET、POST、PUT、DELETE。它们分别对应四种基本操作:GET 用来获取资源,POST 用来新建资源,PUT 用来更新资源,DELETE 用来删除资源。

HiddenHttpMethodFilter

浏览器 form 表单只支持 GET与 POST 请求,而DELETE、PUT 等 method 并不支持,Spring3.0 添加了一个过滤器,可以将这些请求转换为标准的 http 方法,使得支持 GET、POST、PUT 与DELETE 请求。
HiddenHttpMethodFilter可以将POST转换成DELETE或PUT请求,过程如下。

配置过滤器

在/WEB-INF/web.xml中增加如下代码:

    <!-- 配置 org.springframework.web.filter.HiddenHttpMethodFilter : 可以把POST请求转为 DELETE 
        或 PUT请求 -->
    <filter>
        <filter-name>HiddenHttpMethodFilter</filter-name>
        <filter-class>org.springframework.web.filter.HiddenHttpMethodFilter</filter-class>
    </filter>

    <filter-mapping>
        <filter-name>HiddenHttpMethodFilter</filter-name>
        <url-pattern>/*</url-pattern>
    </filter-mapping>

编写代码

在源码中增加如下代码:

    /**
     * Rest风格的URL.
     * 以CRUD为例:
     * 新增: /order POST          传统方式↓
     * 修改: /order/1 PUT         update?id=1
     * 获取: /order/1 GET         get?id=1
     * 删除: /order/1 DELETE      delete?id=1
     * 
     * 如何发送PUT请求和DELETE请求呢?
     * 1. 需要配置HiddenHttpMethodFilter
     * 2. 需要发送POST请求
     * 3. 需要在发送POST请求时,携带一个name="_method"的隐藏域,值为DELETE或PUT
     * 
     * 在SpringMVC的目标方法中如何得到id呢?
     * 使用@PathVariable注解
     */
    @RequestMapping(value = "/testRest/{id}", method = RequestMethod.PUT)
    public String testRestPut(@PathVariable("id") int id) {
        System.out.println("testRest Put: " + id);
        return SUCCESS;
    }

    @RequestMapping(value = "/testRest/{id}", method = RequestMethod.DELETE)
    public String testRestDelete(@PathVariable("id") int id) {
        System.out.println("testRest Delete: " + id);
        return SUCCESS;
    }

    @RequestMapping(value = "/testRest", method = RequestMethod.POST)
    public String testRest() {
        System.out.println("testRest POST");
        return SUCCESS;
    }

    @RequestMapping(value = "/testRest/{id}", method = RequestMethod.GET)
    public String testRest(@PathVariable("id") int id) {
        System.out.println("testRest GET: " + id);
        return SUCCESS;
    }

编写前端代码

    <form action="springmvc/testRest/1" method="post">
            <input type="hidden" name="_method" value="PUT">
            <input type="submit" value="TestRest PUT">
    </form>
    <br />
    <form action="springmvc/testRest/1" method="post">
        <input type="hidden" name="_method" value="DELETE">
        <input type="submit" value="TestRest DELETE">
    </form>
    <br />
    <form action="springmvc/testRest" method="post">
        <input type="submit" value="TestRest Post">
    </form>
    <br />

    <a href="springmvc/testRest/1">Test Rest Get</a>
    <br />

其中,要form表单有一个input,类型为hidden,name为“_method”,value=“转换的指定请求类型DELETEPUT”。
这样请求可以通过过滤器修改成响应的请求方式,被相应的处理器方法处理。

猜你喜欢

转载自blog.csdn.net/u012525096/article/details/81297053