SpringBoot入门(四)请求参数处理(一)

本文介绍了SpringBoot中处理Web请求参数的方法,包括Rest风格的使用与原理,请求映射的详细过程,以及常见的注解如@RequestMapping、@GetMapping、@PostMapping、@PutMapping和@DeleteMapping的使用。讲解了HiddenHttpMethodFilter在实现Rest风格中的作用,以及请求映射的底层原理。此外,还探讨了@PathVariable、@RequestHeader、@ModelAttribute、@RequestParam、@MatrixVariable、@CookieValue、@RequestBody、@RequestAttribute和@ResponseBody等注解的用法。
摘要由CSDN通过智能技术生成

目录

第七章 Web开发

7.3 请求参数处理

7.3.1 请求映射

        7.3.1.1 Rest使用与原理

        7.3.1.2 请求映射原理

7.3.2 普通参数与基本注解

        7.3.2.1 注解


第七章 Web开发

7.3 请求参数处理

7.3.1 请求映射

7.3.1.1 Rest使用与原理

在一个方法上加注解@RequestMapping,来声明这个方法能处理什么请求,这个声明过程就是请求映射。

  • Rest风格支持:使用Http请求方式的动词来表示对资源的操作
    • 以前:/getUser   获取用户  /deleteUser 删除用户   /editUser  修改用户   /saveUser 保存用户
    • 现在:/user(路径都是一样的) GET-获取用户 DELETE-删除用户 PUT-修改用户 POST-保存用户
    • Rest风格实现的核心Filter:HiddenHttpMethodFilter
      • WebMvcAutoConfiguration类中有一个方法hiddenHttpMethodFilter()

      • OrderedHiddenHttpMethodFilter要继承HiddenHttpMethodFilter

      • 用法:表单method=post,使用post请求方式。隐藏域_method=put

      • SpringBoot中手动开启

@Bean
@ConditionalOnMissingBean({HiddenHttpMethodFilter.class})
@ConditionalOnProperty(
    prefix = "spring.mvc.hiddenmethod.filter",
    name = {"enabled"}
)
public OrderedHiddenHttpMethodFilter hiddenHttpMethodFilter() {
    return new OrderedHiddenHttpMethodFilter();
}
public class OrderedHiddenHttpMethodFilter extends HiddenHttpMethodFilter implements OrderedFilter {
}
public class HiddenHttpMethodFilter extends OncePerRequestFilter {
    private static final List<String> ALLOWED_METHODS;
    public static final String DEFAULT_METHOD_PARAM = "_method";
    private String methodParam = "_method";//后续可以在自定义的组件中修改这个参数实现自定义名字
    
    //允许put、delete、patch
    static {
        ALLOWED_METHODS = Collections.unmodifiableList(Arrays.asList(HttpMethod.PUT.name(), HttpMethod.DELETE.name(), HttpMethod.PATCH.name()));
    }

    
    protected void doFilterInternal(HttpServletRequest request, HttpServletResponse response, FilterChain filterChain) throws ServletException, IOException {
        HttpServletRequest requestToUse = request;
        //需要是post请求方式,参数是_method
        if ("POST".equals(request.getMethod()) && request.getAttribute("javax.servlet.error.exception") == null) {
            //获取_method属性的值
            String paramValue = request.getParameter(this.methodParam);
            if (StringUtils.hasLength(paramValue)) {
                //都会转为大写,因此表单中填属性值时大小写均可
                String method = paramValue.toUpperCase(Locale.ENGLISH);
                if (ALLOWED_METHODS.contains(method)) {
                    requestToUse = new HiddenHttpMethodFilter.HttpMethodRequestWrapper(request, method);
                }
            }
        }
        //放行新的请求方式
        filterChain.doFilter((ServletRequest)requestToUse, response);
    }
}
private static class HttpMethodRequestWrapper extends HttpServletRequestWrapper {
    private final String method;

    public HttpMethodRequestWrapper(HttpServletRequest request, String method) {
        super(request);
        this.method = method;//保存新的请求方式,即从_method中得到的值
    }

    public String getMethod() {
        return this.method;//然后把这个新的请求方式返回
    }
}

   具体实现:

spring:
  mvc:
    hiddenmethod:
      filter:
        enabled: true #手动开启该功能

  • Rest原理(表单提交使用Rest的时候):总体来看就是用一个过滤器把原生请求的getMethod方法重写了,换成了新的请求方式。
    • 表单提交会带上_method&#
  • 0
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值