SpringMVC入门系列篇3:@RequestMapping & @RequestHeader & @CookieValue详解与REST风格请求

Posted thinmoon

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了SpringMVC入门系列篇3:@RequestMapping & @RequestHeader & @CookieValue详解与REST风格请求相关的知识,希望对你有一定的参考价值。

一、@RequestMapping

1.@RequestMapping

  • value:value属性可以用来设置请求路径,值是一个字符串数组,可以设置成多个路径共同访问一个方法,下面代码就是firstsecond请求共同访问show方法。

    @RequestMapping(value={"/first", "/second"})
    public String show(HttpServletRequest request) {
    
    String id = request.getParameter("id");
    String name = request.getParameter("name");
    System.out.println(name + " " + id);
    return "/first.jsp";
    }
    
  • method:用来设置映射的请求方式,值是RequestMethod类型的数组。如果没有写,则没有限制,post与get都可以请求到对应的方法,如果指定了请求类型,则必须得是相应的请求才能访问到对应的方法。

    下面代码表示该方法只接受get请求。

        @RequestMapping(value={"/first", "/second"}, method = RequestMethod.GET)
        public String show(HttpServletRequest request) {
    
            String id = request.getParameter("id");
            String name = request.getParameter("name");
            System.out.println(name + " " + id);
            return "/first.jsp";
        }
    

    下面方法表示接收get、post请求

        @RequestMapping(value={"/first", "/second"}, method = {RequestMethod.GET,RequestMethod.POST})
        public String show(HttpServletRequest request) {
    
            String id = request.getParameter("id");
            String name = request.getParameter("name");
            System.out.println(name + " " + id);
            return "/first.jsp";
        }
    
  • params:必须设置对应的请求参数和请求值才能访问到对应的内容,下面代码表示请求中必须要有name=thinmoon,而且id不等于1才能访问到方法。

    @RequestMapping(value = "/second", params = {"name=thinmoon", "id!=1"})
    public String show2(@RequestParam(value = "id") Integer idKey , String name) {
    
    System.out.println(name + " " + idKey);
    return "/first.jsp";
    }
    
  • headers:发送的请求头必须要与设置的请求相同时,才能够访问到对应的方法

    下面代码表示只有主机为localhost,并且是http://localhost/页面发来的请求才接收

    @RequestMapping(value = {"/first"} , headers = {"Host=localhost", "Referer=http://localhost/"})
    public String show(HttpServletRequest request) {
    
    String id = request.getParameter("id");
    String name = request.getParameter("name");
    System.out.println(name + " " + id);
    return "/first.jsp";
    }
    
  • Ant风格地址

    我们请求路径可以使用Ant风格的地址,采用通配符的方式进行地址匹配

    ?:一个?匹配一个字符
    *:匹配任意字符
    **:匹配多重路径

二、REST请求风格

我们平时使用的请求都是get请求后面加参数的形式,例如:

<a href="${pageContext.request.contextPath}/first?id=101&name=thinmoon">跳转</a>

REST风格请求

  • REST 即 Representational State Transfer (资源)表现层状态转化
  • 用URL定位资源,用HTTP描述操作
  • 是目前最流行的一种互联网软件架构
  • 它结构清晰、符合标准、易于理解、扩展方便,所以正得到越来越多网站的采用
  • 使用POST, DELETE, PUT, GET 分别对应 CRUD
  • Spring3.0 开始支持 REST 风格的请求

传统的CRUD操作我们一般使用以下形式:

http://localhost:8080/get.action?id=10  	  查询 get
http://localhost:8080/add.action              新增 post
http://localhost:8080/update.action           修改 post
http://localhost:8080/delete.action?id=10     删除 post

使用rest风格我们可以写成以下形式:

http://localhost:8080/goods/1		查询GET
http://localhost:8080/goods			新增POST
http://localhost:8080/goods			更新PUT
http://localhost:8080/goods/1		删除DELETE

可以看到,我们通过url直接定位到资源,然后利用请求方式的不同进行CRUD操作。

rest风格请求使用

假设我们有get请求如下:

<a href="${pageContext.request.contextPath}/first/1">跳转first</a>

我们可以在控制器中这样接收:

@RequestMapping("/first/{id}")
public String show(@PathVariable Integer id) {

    System.out.println(id);
    return "/first.jsp";
}

form表单put与delete请求

默认情况下Form表单是不支持PUT请求和DELETE请求的,spring3.0添加了一个过滤器HiddenHttpMethodFilter,可以将post请求转换为PUT或DELETE请求。

在web.xml中配置如下过滤器:

<!--配置HiddenHttpMethodFilter 实现rest风格请求-->
<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>

假如我们有以下form表单请求:注意要使用POST

<form action="${pageContext.request.contextPath}/rest" method="post">
    <%--定义一个隐藏表单 name值必须为_method value为请求方式--%>
    <input type="hidden" name="_method" value="put">
    <input type="text" name="name" value="Thinmoon">
    <input type="submit" value="提交">
</form>

我们在表单中定义一个隐藏表单,是我们程序可以使用put请求方式接收。

@RequestMapping(value = "/rest", method = RequestMethod.PUT)
public String show5(String name) {
System.out.println(name);
return "toAnother";
}

@RequestMapping("toAnother")
public String show6() {
return "redirect:first.jsp";
}

注入事项:

上面代码如果直接请求转发到jsp页面会发生405错误 JSPs only permit GET POST or HEAD**

解决方式:

  • 使用重定向的形式跳转到对应jsp
  • 直接把对应jsp的 isErrorPage="true"

三、@RequestHeader & @CookieValue

我们可以通过@RequestHeader和@CookieValue获取请求头与cookie信息

@RequestMapping("testHeader")
public String show7(@RequestHeader("Host") String host,
@RequestHeader("Referer") String referer,
@RequestHeader("Cookie") String cookie,
@CookieValue("JSESSIONID") String jsessionid) {
System.out.println(host);
System.out.println(referer);
System.out.println(cookie);
System.out.println(jsessionid);
return "first.jsp";
}


以上是关于SpringMVC入门系列篇3:@RequestMapping & @RequestHeader & @CookieValue详解与REST风格请求的主要内容,如果未能解决你的问题,请参考以下文章

SpringMVC 从入门到精通系列 03——常用注解

SpringMVC 从入门到精通系列 05——Ajax的实现方式总结

SpringMVC 从入门到精通系列 01——SpringMVC 概述与入门案例

SpringMVC入门系列-SpringMVC简介与入门

SpringMVC 从入门到精通系列 07——SpringMVC框架中的拦截器

SpringMVC 从入门到精通系列 07——SpringMVC框架中的拦截器