java.restful风格

restful风格

RESTful架构,就是目前最流行的一种互联网软件架构。它结构清晰、符合标准、易于理解、扩展方便,所以正得到越来越多网站的采用。

RESTful(即Representational State Transfer的缩写)其实是一个开发理念,是对http的很好的诠释。Representational State Transfer的含义就是“表现层的状态转化”。

使用RESTful这种架构理念就需要对http请求进行一系列的规范:

1、对url规范,写成RESTful的格式的url

非REST的url:http://..../queryGoods?id=001&itemType=服装

REST风格的url:http://..../queryitem/001/服装

特点:url简洁,将参数通过url传到服务端

2、http的方法规范

不管是删除、添加、更新、使用url是一致的,如果进行删除,需要设置http的方法为delete,同理添加

后台controller方法:判断http方法,如果是delete执行删除,如果是post执行添加。

默认的只能使用get或post方法,

3、对http的contentType规范

请求时指定contentType,要json数据,设置成json格式的type。

  1. 在web.xml中配置过滤器,用来支持get,post以外的请求

    <filter>
        <filter-name>methodFilter</filter-name>
        <filter-class>org.springframework.web.filter.HiddenHttpMethodFilter</filter-class>
        <init-param>
            <param-name>methodParam</param-name>
            <param-value>mym</param-value> <!-- 不配置就默认为 _method -->
        </init-param>
    </filter>
    <filter-mapping>
        <filter-name>methodFilter</filter-name>
        <url-pattern>/*</url-pattern>
        <!-- <servlet-name>mcpMvc</servlet-name> -->
    </filter-mapping>
  1. index.jsp页面

    <h3>
        <a href="${pageContext.request.contextPath}/beautyOpreation/39.html">RestFul-GET</a>
    </h3>
​
    <form method="post" action="${pageContext.request.contextPath}/beautyOpreation">
        <input type="text" name="bname" value="李思思"/><br/>
        <input type="text" name="bage" value="30"/><br/>
        <input type="text" name="cat.cname" value="tomcat"/><br/>
        <input type="text" name="cat.cage" value="3"/><br/>
        <input type="submit" value="RestFul-POST"/>
    </form>
​
    <form method="post" action="${pageContext.request.contextPath}/beautyOpreation/988/yellow">
        <input type="text" name="bname" value="李思思put"/><br/>
        <input type="text" name="bage" value="30"/><br/>
        <input type="text" name="cat.cname" value="tomcatput"/><br/>
        <input type="text" name="cat.cage" value="3"/><br/>
        <input type="hidden" name="mym" value="PUT"/>
        <input type="submit" value="RestFul-PUT"/>
    </form>
​
​
    <form method="post" action="${pageContext.request.contextPath}/beautyOpreation">
        <input type="text" name="bname" value="李思思DELETE"/><br/>
        <input type="text" name="bage" value="30"/><br/>
        <input type="text" name="cat.cname" value="tomcatDELETE"/><br/>
        <input type="text" name="cat.cage" value="3"/><br/>
        <input type="hidden" name="mym" value="DELETE"/>
        <input type="submit" value="RestFul-DELETE"/>
    </form>
<hr style="border: 1px dashed gold;"/>

注: input type="hidden" name="_method" value="put" 会被配置的过滤器处理为PUT请求

  1. Handler方法

/**
 * Resful风格里:
 * 1: 无论是 增删改查 都可能访问同一个url , 通过 提交方式来区分
 *  get: 查   post: 增   put:改  delete:删
 *
 *  put 和 delete 请求 需要 使用 HiddenHttpMethodFilter 来进行 底层过滤修改
 *  在post模式下  给表单添加一个 隐藏域 添加一个 名为 _method 的 请求参数  值写为put / delete
 _method 可以在 过滤器配置时修改.
 *
 * 2: 把 请求路径里的部分 获取为请求参数
 */
@RestController
public class RestFulController {
​
    @GetMapping("/beautyOpreation/{bid}.html")
    public String queryBeauty(@PathVariable(name="bid") Integer bid){
        return "server - get -"+bid;
    }
​
    @PostMapping("/beautyOpreation")
    public String addBeauty(){
        return "server - post";
    }
​
    @PutMapping("/beautyOpreation/{bid}/{skincolor}")
    public Beauty updateBeauty(@PathVariable(name="bid") Integer bid,
                               @PathVariable(name="skincolor") String skin,
                               Beauty beauty){
        System.out.println(bid);
        System.out.println(skin);
        return beauty;
    }
​
    @DeleteMapping("/beautyOpreation")
    public String deteleBeauty(){
        return "server - delelte";
    }
}

路径变量: @pathvariable 将restful风格请求路径里的参数绑定到 handler方法入参中 . /beauty/{id} 路径变量可以直接使用.


矩阵变量: @MatrixVariable 可以将restful风格请求路径里的矩阵参数 绑定到 handler方法入参中. 矩阵变量需要开启配置

介绍:

根据 URI 规范 RFC 3986 中 URL 的定义,路径片段中可以可以包含键值对。规范中没对对应的术语。一般 “URL 路径参数” 可以被应用,尽管更加独特的 “矩阵 URI” 也经常被使用并且相当有名。在 Spring MVC 它被成为矩阵变量

矩阵变量可以出现在任何路径片段中,每一个矩阵变量都用分号(;)隔开。比如 “/get;name=zhihao;age=18”。多个值可以用逗号隔开,比如 “age=18,20,25”,或者分开写 “age=18;age=20;age=25”。

如果你希望一个 URL 包含矩阵变量,那么请求映射模式必须用 URI 模板来表示这些矩阵变量。这样的话,不管矩阵变量顺序如何,都能够保证请求可以正确的匹配。

  1. SpringMVC默认未开始 对 矩阵变量 解析和封装为handler方法入参, 需要在配置文件中开启 矩阵变量的使用 .

<mvc:annotation-driven enable-matrix-variables="true"/>
  1. 页面中设计表单

    <form action="${pageContext.request.contextPath}/user/97;name=zhangsasn;age=1,2,3" method="post">
        <input type="text" name="myparam" value="修改"/>
        <input type="hidden" name="mym" value="PUT">  
        <input type="submit" value="提交">
    </form>

这里过滤器的要处理的参数名已经改为了sm 不改默认的method 也可以.

  1. 控制层

    @PutMapping("/user/{uid}")
    @ResponseBody
    public List<Integer> testUpdate(@PathVariable Integer uid,
                             @MatrixVariable String name,
                             @MatrixVariable List<Integer> age){
        System.out.println(uid);
        System.out.println(name);
        System.out.println(age);
        return age;
    }


解决 字符编码过滤器 和 hiddenMethod过滤器 restful乱码:

<mvc:annotation-driven>
        <mvc:message-converters>
            <bean class="org.springframework.http.converter.StringHttpMessageConverter">
                <property name="supportedMediaTypes">
                    <list>
                        <value>
                            text/plain;charset=utf-8
                        </value>
                        <value>
                            text/html;charset=utf-8
                        </value>
                        <value>
                            application/json;charset=utf-8
                        </value>
                    </list>
                </property>
            </bean>
        </mvc:message-converters>
</mvc:annotation-driven>
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值