5_RestFul 风格请求

是什么

REST:即 Representational State Transfer (资源)表现层 状态转化,是目前最流行的一种互联网软件架构

具体说,就是 HTTP 协议里面, 四个表示操作方式的动词:

  • GET用来获取资源
  • POST用来创建新资源
  • PUT用来更新资源
  • DELETE用来删除资源

通过修改 http 的状态值来标记请求的目的


怎么玩

HiddenHttpMethodFilter:浏览器 form 表单只支持 GET 和 POST ,不支持 DELETE 和 PUT请求

解决措施:添加过滤器,将这些请求转换为 标准的 http 方法 ,支持 GET,POST,DELETE,PUT 请求

步骤1: web.xml 添加HiddenHttpMethodFilter 配置
<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: Controller 中实现 增删改查 等操作

核心代码:

@Controller
public class RestFulController {
	 @RequestMapping(value = "/restful",method = RequestMethod.GET)
     @RequestMapping(value = "/restful",method = RequestMethod.POST)
     @RequestMapping(value = "/restful",method = RequestMethod.PUT)
     @RequestMapping(value = "/restful",method = RequestMethod.DELETE)
}

完整代码:

@Controller
public class RestFulController {
    //restful传值:
    //使用{id}方式占位
    //使用@PathVariable("id")获取占位的值
    @RequestMapping(value = "/restful/{name}/{age}",method = RequestMethod.GET)
    public String get(@PathVariable("name") String userName, @PathVariable("age") int userAge){
        System.out.println("get请求");
        System.out.println(userName);
        System.out.println(userAge);
        return "getSuccess";
    }
    @RequestMapping(value = "/restful/{name}/{age}",method = RequestMethod.POST)
    public String post(@PathVariable("name") String userName, @PathVariable("age") int userAge){
        System.out.println("post请求");
        System.out.println(userName);
        System.out.println(userAge);
        return "postSuccess";
    }

    @RequestMapping(value = "/restful/{name}/{age}",method = RequestMethod.PUT)
    public @ResponseBody String put(@PathVariable("name") String userName, @PathVariable("age") int userAge){
        System.out.println("put请求");
        System.out.println(userName);
        System.out.println(userAge);
//        return "redirect:putSuccess.jsp";
        return "putSuccess";
    }
    @RequestMapping(value = "/restful/{name}/{age}",method = RequestMethod.DELETE)
    public @ResponseBody String delete(@PathVariable("name") String userName, @PathVariable("age") int userAge){
        System.out.println("delete请求");
        System.out.println(userName);
        System.out.println(userAge);
//        return "redirect:deleteSuccess.jsp";
        return "deleteSuccess";
    }
}
步骤3:前端jsp页面

核心代码:

更新和删除操作时:method 一定要为post请求,name 一定要为_method

原因:代表 post 请求,但是 HiddenHttpMethodFilter 将把本次请求转化成标准的 put 请求方式

put_更新操作:
<input type="hidden" name="_method" value="PUT">
delete_删除操作:
<input type="hidden" name="_method" value="DELETE">

完整代码:

<!--restful传值:使用/方式拼接-->
<form action="/restful/李四/18" method="get">
    <input type="submit" value="获取_get">
</form>
<form action="/restful/李四/19" method="post">
    <input type="submit" value="创建_post">
</form>
<!--restful特殊的请求格式:使用post并加上指定的input-->
<form action="/restful/李四/20" method="post">
    <input type="hidden" name="_method" value="PUT">
    <input type="submit" value="更新_put">
</form>
<form action="/restful/李四/21" method="post">
    <input type="hidden" name="_method" value="DELETE">
    <input type="submit" value="删除_delete">
</form>
步骤4:RestFul 请求获取路径参数

(1)使用{id}方式占位

(2)使用@PathVariable("id")获取占位的值

@RequestMapping(value = "/restful/{name}/{age}",method = RequestMethod.GET)
public String get(@PathVariable("name") String userName, @PathVariable("age") int userAge){
    System.out.println("get请求");
    System.out.println(userName);
    System.out.println(userAge);
    return "getSuccess";
}

405 错误处理方式

​ 访问 put 和 delete 请求的时候,可能会出现下列错误:
在这里插入图片描述

此时,查看 web.xml 文件:

此配置表示对所有请求(不包括.jsp结尾的)由 spring mvc 进行解析,即不会匹配到.jsp结尾的请求

<servlet>
    <servlet-name>springMVC</servlet-name>
    <servlet-class>org.springframework.web.servlet.DispatcherServlet</servlet-class>
    <init-param>
        <param-name>contextConfigLocation</param-name>
        <param-value>classpath:springMVC.xml</param-value>
    </init-param>
</servlet>
<servlet-mapping>
    <servlet-name>springMVC</servlet-name>
    <url-pattern>/</url-pattern>
</servlet-mapping>

此过滤器表示对 所有的请求 (包括 .jsp 结尾的)进行转换为标准http请求

<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>

举例:

现有一个put请求,Controller 对 标准 http 请求进行处理:

@RequestMapping(value = "/restful/{name}/{age}",method = RequestMethod.PUT)
public  String put(@PathVariable("name") String userName, @PathVariable("age") int userAge){
    System.out.println("put请求");
    System.out.println(userName);
    System.out.println(userAge);
    return "putSuccess";
}
原因:

处理完成后返回 putSuccess ,经过 spring mvc 解析后,返回的是putSuccess.jsp这个时候过滤器就会对putSuccess.jsp 这个请求进行标准化http处理。即 spring 认为这应该是个JSP接口,但是现在 jsp 仅支持getpost方法,所以会提示错误

解决办法:

方式一:

将过滤器的请求地址由/*改为/

<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>

方式二:

在方法返回类型前面添加@ResponseBody注解:

@RequestMapping(value = "/restful/{name}/{age}",method = RequestMethod.DELETE)
public @ResponseBody String delete(@PathVariable("name") String userName, @PathVariable("age") int userAge){
    System.out.println("delete请求");
    System.out.println(userName);
    System.out.println(userAge);
    return "deleteSuccess";
}

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值