SpringMVC_Ant和Restful风格

本文介绍了RESTful风格的概念,包括资源、表现层和状态转化的定义,以及GET、POST、PUT、DELETE等HTTP方法在RESTful中的作用。接着,通过URL风格示例展示了RESTful如何操作资源。最后,讨论了SpringMVC中HiddenHttpMethodFilter过滤器的作用,它是如何使Spring支持DELETE、PUT等HTTP方法的,并概述了其配置和使用。

一、Ant路径风格

 * 
 * URL地址可以写模糊的通配符:
 * 	?:能替代任意一个字符
 * 	*:能替代任意多个字符,和一层路径
 * 	**:能替代多层路径
 *
 */
@Controller
public class RequestMappingTest {
	
	@RequestMapping("/antTest01")
	public String antTest01(){
		System.out.println("antTest01...");
		return "success";
	}
	
	/**
	 * ?匹配一个字符,0个多个都不行;
	 * 		模糊和精确多个匹配情况下,精确优先
	 * 
	 * @return
	 */
	@RequestMapping("/antTest0?")
	public String antTest02(){
		System.out.println("antTest02...");
		return "success";
	}
	
	/**
	 *   *匹配任意多个字符
	 * @return
	 */
	@RequestMapping("/antTest0*")
	public String antTest03(){
		System.out.println("antTest03...");
		return "success";
	}
	
	/**
	 *  *:匹配一层路径
	 * @return
	 */
	@RequestMapping("/a/*/antTest01")
	public String antTest04(){
		System.out.println("antTest04...");
		return "success";
	}

    /**
     * 匹配多层路径
     * @return
     */
	@RequestMapping("/a/**/antTest01")
	public String antTest05(){
		System.out.println("antTest05...");
		return "success";
	}
	
	//路径上可以有占位符:  占位符 语法就是可以在任意路径的地方写一个{变量名}
	//   /user/admin    /user/leifengyang
	// 路径上的占位符只能占一层路径
	@RequestMapping("/user/{id}")
	public String pathVariableTest(@PathVariable("id")String id){
		System.out.println("路径上的占位符的值"+id);
		return "success";
	}

}

二、Restful风格

什么是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 用来删除资源。

② URL风格
示例:
/order/1 HTTP GET :得到 id = 1 的 order
/order/1 HTTP DELETE:删除 id = 1的 order
/order/1 HTTP PUT:更新id = 1的 order
/order HTTP POST:新增 order
③ HiddenHttpMethodFilter
浏览器 form 表单只支持 GET 与 POST 请求,而DELETE、PUT 等 method 并不支持,
Spring3.0 添加了一个过滤器,可以将这些请求转换为标准的 http 方法,使得支持 GET、POST、PUT 与 DELETE 请求。

代码实现:

① 配置HiddenHttpMethodFilter过滤器

<!-- 支持REST风格的过滤器:可以将POST请求转换为PUT或DELETE请求 -->
	<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>

②编写Controller层

@Controller
public class BookController {
    /**
     * 图书查询
     * @param id
     * @return
     */
    @RequestMapping(value = "/book/{bid}",method = RequestMethod.GET)
    public String getBook(@PathVariable("bid")Integer id){
        System.out.println("查询到了"+id+"号图书");
        return "success";
    }
    /**
     * 图书删除
     * @param id
     * @return
     */
    @RequestMapping(value = "/book/{bid}",method = RequestMethod.DELETE)
    public String deleteBook(@PathVariable("bid")Integer id){
        System.out.println("删除到了"+id+"号图书");
        return "success";
    }

    /**
     * 图书添加
     * @param id
     * @return
     */
    @RequestMapping(value = "/book/{bid}",method = RequestMethod.POST)
    public String addBook(@PathVariable("bid")Integer id){
        System.out.println("添加了"+id+"号图书");
        return "success";
    }

    /**
     * 图书修改
     * @return
     */

    @RequestMapping(value = "/book/{bid}",method = RequestMethod.PUT)
    public String updateBook(@PathVariable("bid")Integer id){
        System.out.println("更新了"+id+"号图书");
        return "success";
    }

}

③ 编写jsp页面:

<!-- 发起图书的增删改查请求;使用Rest风格的URL地址;
请求url	请求方式	表示含义
/book/1	GET:	查询1号图书
/book/1	DELETE:	删除1号图书
/book/1	PUT:	更新1号图书
/book	POST:	添加1号图书

从页面发起PUT、DELETE形式的请求?Spring提供了对Rest风格的支持
1)、SpringMVC中有一个Filter;他可以把普通的请求转化为规定形式的请求;配置这个filter;
<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>
2)、如何发其他形式请求?
按照以下要求;
1、创建一个post类型的表单
2、表单项中携带一个_method的参数,
3、这个_method的值就是DELETE、PUT

-->
<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<html>
  <head>
    <title>$Title$</title>
  </head>
  <body>
  <a href="book/1">查询图书</a><br/>
  <form action="book/1" method="post">
      <input type="submit" value="添加1号图书"/>
  </form><br/>


  <form action="book/1" method="post">
      <input name="_method" value="delete">
      <input type="submit" value="删除1号图书"/>
  </form><br/>

  <form action="book/1" method="post">
      <input name="_method" value="put">
      <input type="submit" value="更新1号图书"/>
  </form><br/>
  </body>
</html>

三、HiddenHttpMethodFilter过滤器源码分析

@Override
    protected void doFilterInternal(HttpServletRequest request, HttpServletResponse response, FilterChain filterChain)
            throws ServletException, IOException {
     //获取表单上_method带来的值(delete\put)
        String paramValue = request.getParameter(this.methodParam);
     
     //判断如过表单是一个post而且_method有值
        if ("POST".equals(request.getMethod()) && StringUtils.hasLength(paramValue)) {
          //转为PUT、DELETE
            String method = paramValue.toUpperCase(Locale.ENGLISH);
            //重写了request.getMethod();前端控制器会根据getMethod方法获取method,告知@RequestMapping该方法是GET,POST,DELETE ,还是PUT
            //实现了HttpServletRequest,并且HttpServletRequest该类重写了getMethod方法
            HttpServletRequest wrapper = new HttpMethodRequestWrapper(request, method);

            //wrapper.getMethod()===PUT;
            filterChain.doFilter(wrapper, response);//重新进行请求的转发!
        }
        else {
             //直接放行
            filterChain.doFilter(request, response);
        }
    }
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值