Spring请求映射处理 -REST

78 阅读2分钟

REST 表述性状态传递 (Representational State Transfer 简称 REST)

representational [ˌreprɪzenˈteɪʃənl 具象派的; 代表性的

REST 客户端映射到服务器资源的一种架构设计。

restful 一种优雅的URL风格

万维网 http协议

命名混乱

例如: user/getuser.do?id=1
user.do?action=getUser&id=1
user.do?action=a&id=xx
user/chaxunyonghu?id=1
user/xxx_cxyh?id=1
..........

是Roy Fielding 博士2000年 博士论文提出的一种软件架构风格。降低开发的复杂性 提供系统的可伸缩性

一种相较与之前URL所产生的一种更优雅的URL风格。

URL CURD
之前 查询用户 user.do?action=getUser&id=xxx GET 增加用户 user_add.do POST 修改用户 edit_user.do POST 删除用户 deluser.do?id=xxx GET/POST

GET POST PUT DELETE

之前URL用动词 现在用名词

面向资源

现在 查询用户 /xxx/user/1 GET

多个用户 /xxx/users GET 新增用户 xxx/user POST 修改用户 xxx/user/1 PUT 删除用户 xxx/user/1 DELETE

实际开发中 尽量向REST风格靠拢 尽量一个URL映射服务器一个资源


SpringMVC 增删改查 post delete put get

1、控制器

@Controller
@RequestMapping("/rest")
public class RestController {
    @GetMapping("/user/{id}")
    public String getUser(@PathVariable("id") Integer id){
        System.out.println("查询用户ID是"+id);
        return  "/index.jsp";
    }
    @PostMapping("/user")
    public String addUser(User user){
        System.out.println("新增用户"+user);
        return "/index.jsp";

    }
    @PutMapping("/user/{id}")
    public String update(User user,Integer id){
        System.out.println("修改用户"+user);
        return "redirect:/index.jsp";
    }
    @DeleteMapping("/user/{id}")
    public String delete(@PathVariable("id") Integer id){
        System.out.println("删除用户"+id);
        return "redirect:/index.jsp";


    }

2、form表单 因传统html不支持put delete 改为post

<%--
  Created by IntelliJ IDEA.
  User: Administrator
  Date: 2023/2/2
  Time: 9:30
  To change this template use File | Settings | File Templates.
--%>
<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<% //这个地方需要tomcat提供的依赖
request.setAttribute("basepath",request.getContextPath());  %>
<html>
<head>
    <title>Title</title>
</head>
<body>
  <form action="${basepath}/rest/user/1" method="get">
        <input type="submit" value="查询">
  </form>


  <form action="${basepath}/rest/user" method="post">
      <input type="text" name="id" value="666">
      <input type="text" name="username" value="李四">
      <input type="submit" value="添加">
  </form>

  <form action="${basepath}/rest/user/id" method="post">

      <input type="hidden" name="_method" value="put">
      <input type="text" name="id" value="666">

      <input type="text" name="username" value="张三">
      <input type="submit" value="修改">
  </form>
  <form action="${basepath}/rest/user/1" method="post">

      <input type="hidden" name="_method" value="delete">

      <input type="submit" value="删除">
  </form>


</body>
</html>

3、配置过滤器 实现put delete请求。

过滤器按顺序执行 什么时候都要把编码处理的放在前面

<!-- 配置编码过滤器   写到其他过滤器前面-->
<filter>
    <filter-name>CharacterEncodingFilter</filter-name>
    <filter-class>org.springframework.web.filter.CharacterEncodingFilter</filter-class>
    <init-param>
        <param-name>encoding</param-name>
        <param-value>UTF-8</param-value>
    </init-param>
    <!--同时开启请求和响应的比那吗规则-->
    <init-param>
        <param-name>forceEncoding</param-name>
        <param-value>true</param-value>
    </init-param>

</filter>
<!--只过滤request1的servlet-->
<filter-mapping>
    <filter-name>CharacterEncodingFilter</filter-name>
    <servlet-name>dps</servlet-name>
</filter-mapping>

<!--处理HTML不支持rest中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>
    <servlet-name>dps</servlet-name>
</filter-mapping>

4、分析 HiddenHttpMethodFilter

private String methodParam = "_method";
if ("POST".equals(request.getMethod()) && request.getAttribute("javax.servlet.error.exception") == null) {
    String paramValue = request.getParameter(this.methodParam);
    if (StringUtils.hasLength(paramValue)) {
        String method = paramValue.toUpperCase(Locale.ENGLISH);
        if (ALLOWED_METHODS.contains(method)) {
            requestToUse = new HttpMethodRequestWrapper(request, method);
        }
    }
}

HTTP Status 405 – Method Not Allowed

JSPs only permit GET POST or HEAD处理方式

1、Tomcat7 以上的版本对request.method支持更加严格 支支持 GET POST Header,用Tomcat7版本

2、不用转发 用重定向

3、将JSP的page指定 isErrorPage=true 不推荐这么用

4、 自己写过滤器 将request.method 改回post