SpringMVC-2 使用@RequestMapping映射请求

本文详细介绍了Spring MVC框架中@RequestMapping注解的使用方法,包括如何使用URL、请求方式、请求参数、请求头以及带占位符的URL进行请求映射。此外还探讨了RESTful风格的API设计以及HiddenHttpMethodFilter的配置。

  @RequestMapping注解可以使用请求URL、请求方式、请求参数、请求头和带占位符的URL等方式来映射请求。使用@RequestMapping映射请求的具体实现代码下载地址:http://download.csdn.net/download/bingbeichen/9791533


1. 使用请求URL映射请求

  使用@RequestMapping注解为控制器指定其可以处理哪些URL请求,其不仅可以标注方法也可以标注类,测试代码如下:

// 当前控制器的testRequestMapping()方法仅可处理URL=test/testRequestMappingde的请求
@Controller
@RequestMapping("/test")
public class TestRequestMapping {

    private static final String SUCCESS = "success";

    /**
     * @RequestMapping注解 : 不仅可以标注在方法定义处,也可以标注在类定义处
     *  1). 类定义处:提供初步的请求映射信息,其相对于WEB应用的根目录
     *  2). 在方法处:提供进一步细分的请求映射信息,其相对于类定义处的URL
            若类定义处未标注 @RequestMapping,则方法处标记的URL直接相对于WEB应用的根目录
     * @return
     */
    @RequestMapping("/testRequestMapping")
    public String testRequestMapping() {
        return SUCCESS;
    }

}

2. 使用请求方式映射请求

  @RequestMapping注解除了可以使用请求URL映射请求外,还可以使用请求方法、请求参数及请求头来映射请求;其中,@RequestMapping注解的value、method、params和headers属性分别表示请求URL、请求方法、请求参数及请求头的映射条件,联合使用多个条件可让请求映射更加精确化。测试代码如下:

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

3. 使用请求参数或请求头映射请求

  【了解】可以使用@RequestMapping的params和headers属性来更加精确地映射请求,其支持简单的表达式,具体说明如下:

  • param1:表示请求必须包含名为param1的请求参数;
  • !param1:表示请求不能包含名为param1的请求参数;
  • param1 != value1:表示请求必须包含名为param1的请求参数,但其值不能为value1;
  • {“param1=value1”, “params2”}:表示请求必须包含名为param1和param2的请求参数,且param1参数值必须为value1。

4. 使用Ant风格资源地址映射请求

  【了解】@RequestMapping支持Ant风格的URL,而Ant风格资源地址支持三种匹配符,即:

  • ?:匹配文件名中的一个字符,如/user/?/name可匹配/user/a/name、/user/b/name等;
  • *:匹配文件名中任意个字符,如/user/*/name可匹配/user/a/name、/user/abc/name等;
  • **:匹配多层路径,如/user/**/name可匹配/user/name、/user/aa/name等。

5. 使用@PathVariable映射URL中绑定的占位符

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

/**
 * @PathVariable 可以用来映射URL中的占位符到目标方法的参数中
 *  请求URL为test/testPathVariable/135时,控制台输出为testPathVariable : 135
 */
@RequestMapping("/testPathVariable/{id}")
public String testPathVariable(@PathVariable("id") Integer id) {
    System.out.println("testPathVariable : " + id);
    return SUCCESS;
}

6. REST与HiddenHttpMethodFilter

  资源表现层状态转化(Representational State Transfer,简称REST)是目前最为流行的一种互联网软件框架,具有结构清晰、符合标准、易于理解和扩展方便的优点。其核心思想是,在HTTP协议中,表示操作方式的GET、POST、DELETE和PUT共四个动词,分别对应数据库的增删改查操作,即GET用来获取资源、POST用来新建资源、DELETE用来删除资源、PUT用来更新资源。
  然而,浏览器的form表单仅支持GET和POST请求,Spring 3.0添加了HiddenHttpMethodFilter过滤器,根据POST请求中“_method”参数值(可以为DELETE或PUT)将其转换为标准的DELETE和PUT请求。
  具体实现步骤说明如下:
  第一步:在web.xml文件中配置HiddenHttpMethodFilter过滤器;

<!-- 配置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>

  第二步:在index.jsp页面创建HTTP协议的GET、POST、DELETE和PUT请求;

<a href="test/testRest/8">TEST REST GET</a>
<br><br>

<form action="test/testRest" method="post">
    <input type="submit" value="TEST REST POST" />
</form>
<br><br>

<form action="test/testRest/88" method="post">
    <input type="hidden" name="_method" value="DELETE"/>
    <input type="submit" value="TEST REST DELETE" />
</form>
<br><br>

<form action="test/testRest/888" method="post">
    <input type="hidden" name="_method" value="PUT"/>
    <input type="submit" value="TEST REST PUT" />
</form>
<br><br>

  第三步:在控制器中添加对应的处理方法;

/**
 * REST风格的URL,以CRUD为例:
 *  新增:/order   HTTP POST
 *  修改:/order/1 HTTP PUT
 *  获取:/order/1 HTTP GET
 *  删除:/order/1 HTTP DELETE
 *  
 * 如何发送PUT请求或DELETE请求呢?
 *  1). 需要在web.xml文件中配置HiddenHttpMethodFilter,其url-pattern为/*
 *  2). 需要发送POST请求,并携带name="_method"的隐藏域,其值为DELETE或POST
 * 
 * 在SpringMVC的目标方法中如何获取id呢?需要借助带占位符的URL和@PathVariable注解来获取
 * 
 * @param id
 * @return
 */
@RequestMapping(value="/testRest/{id}", method=RequestMethod.GET)
public String testRestGET(@PathVariable("id") Integer id) {
    System.out.println("testRestGet : " + id);
    return SUCCESS;
}

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

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

@RequestMapping(value="/testRest/{id}", method=RequestMethod.PUT)
public String testRestPUT(@PathVariable("id") Integer id) {
    System.out.println("testRestPUT : " + id);
    return SUCCESS;
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值