• 数据流动之实现自定义MVC自动填充参数


    简介:

      在Controller中的方法中的参数,有许多为MVC自动进行填充值的如HttpServletRequest,HttpServletResponse等参数,该功能为开发提供了很大的方便。本文自定义一个参数让MVC来填充该参数的值。

      注意:WebMvcConfigurerAdapter类在SpringBoot 2.0中被弃用。

    步骤一:创建WebConfig.class继承WebMvcConfigurerAdapter类,重写addArgumentResolvers方法

      1.spring boot为了方便用户扩展spring MVC的配置,提供了WebMvcConfigurerAdapter类,只要我们实现了WebMvcConfigurerAdapter类

      就可以自定义许多的组件;例如,自定义个WebConfig.class就是继承了WebMvcConfigurerAdapter类,在其中使用了addInterceptors()添加了拦截器,

      使用addArgumentResolvers()添加了参数解析器。

      1.创建WebConfig类并使用@Configuration标注,在spring初始化时就会加载该类。

      2.重写addArgumentResolver方法:框架回调该方法,添加一个参数解析器ArgumentResolver。

      

     1 import org.springframework.context.annotation.Configuration;
     2 import org.springframework.beans.factory.annotation.Autowired;
     3 import org.springframework.web.method.support.HandlerMethodArgumentResolver;
     4 import org.springframework.web.servlet.config.annotation.WebMvcConfigurerAdapter;
     5 
     6 @Configuration
     7 public class WebConfig extends WebMvcConfigurerAdapter {
     8     @Autowired
     9     UserArgumentResolver userArgumentResolver;
    10     @Override
    11     public void addArgumentResolvers(List<HandlerMethodArgumentResolver> argumentResolvers) {
    12         argumentResolvers.add(userArgumentResolver);
    13     }
    14 }

    步骤二:创建userArgumentResolver并实现HandlerMethodArgumentResolver接口

      1.创建一个参数解析器类作为上面argumentResolvers.add()方法的参数,需要继成HandlerMethodArgumentResolver

      2.重写其中的两个方法。

      

     1 import com.alibaba.druid.util.StringUtils;
     2 import com.app.miaosha.Pojo.MiaoshaUser;
     3 import com.app.miaosha.Service.MiaoshaUserService;
     4 import org.springframework.beans.factory.annotation.Autowired;
     5 import org.springframework.core.MethodParameter;
     6 import org.springframework.stereotype.Service;
     7 import org.springframework.web.bind.support.WebDataBinderFactory;
     8 import org.springframework.web.context.request.NativeWebRequest;
     9 import org.springframework.web.method.support.HandlerMethodArgumentResolver;
    10 import org.springframework.web.method.support.ModelAndViewContainer;
    11 
    12 import javax.servlet.http.Cookie;
    13 import javax.servlet.http.HttpServletRequest;
    14 import javax.servlet.http.HttpServletResponse;
    15 
    16 @Service
    17 public class UserArgumentResolver implements HandlerMethodArgumentResolver {
    18     @Autowired
    19     MiaoshaUserService miaoshaUserService;
    20     @Override
    21     //该方法用来判断参数的类型是否为MiaoshaUser,如果此方法返回true,执行resolveArgument方法
    22     public boolean supportsParameter(MethodParameter methodParameter) {
    23         Class<?> clazz = methodParameter.getParameterType();
    24         return MiaoshaUser.class==clazz;
    25     }
    26 
    27     @Override
    28     public Object resolveArgument(MethodParameter methodParameter, ModelAndViewContainer modelAndViewContainer, NativeWebRequest nativeWebRequest, WebDataBinderFactory webDataBinderFactory) throws Exception {
    29         //得到request和response
    30         HttpServletRequest request = (HttpServletRequest) nativeWebRequest.getNativeRequest();
    31         HttpServletResponse response = (HttpServletResponse) nativeWebRequest.getNativeResponse();
    32         //得到token
    33         String paramToken = request.getParameter(MiaoshaUserService.TOKEN_NAME);
    34         String cookieToken = getCookieValue(request,MiaoshaUserService.TOKEN_NAME);
    35         //使用cookie得到对象
    36         if (StringUtils.isEmpty(cookieToken)&&StringUtils.isEmpty(paramToken)) {
    37             return "login";
    38         }
    39         String token = StringUtils.isEmpty(paramToken)?cookieToken:paramToken;   //优先取paraToken
    40         MiaoshaUser user = miaoshaUserService.getByToken(token,response);
    41         return user;
    42     }
    43 
    44     private String getCookieValue(HttpServletRequest request, String tokenName) {
    45         Cookie[] cookies = request.getCookies();
    46         for (Cookie c:cookies
    47              ) {
    48             if (c.getName().equals(tokenName)) {
    49                 return c.getValue();
    50             }
    51         }
    52         return null;
    53     }
    54 }

      supportsParameter方法:用来判断当前参数是否为我们需要注入值的参数,如果返回true,执行resolveArgument方法。

      resolveArgument方法:对参数的值进行注入。

    总结

      1.框架加载WebConfig.java类,调用其中的addArgumentResolver方法,WebConfig.java继承WebMvcConfigurerAdapter.java可以扩展自定义的各种组件。

      2.在addArgumentResolver方法中添加一个自定义的参数解析器userArgumentResolver对象。

      3.userArgumentResolver.java继承了HandlerMethodArgumentResolver.interface。

      4.在userArgumentResolver中有两个方法;supportsParameter方法判断参数列表中是否有MiaoshaUser参数。如果有执行resolverArgument方法。

      5.在resolverArgument方法中执行填充MiaoshaUser参数的工作:先由request中获取token,再通过token由redis中获取MiaoshaUser对象。

    参考:https://blog.csdn.net/liujun03/article/details/82779358

  • 相关阅读:
    已经菜到不行了 PAT 1010. Radix (25)
    容斥 或者 单调栈 hihocoder #1476 : 矩形计数 和 G. Snake Rana 2017 ACM Arabella Collegiate Programming Contest
    React的Context的使用方法简介
    canvas的进阶
    canvas的基础入门
    CSS3 中弹性盒模型--容器的属性
    creat-react-app搭建的项目中按需引入antd以及配置Less和如何修改antd的主题色
    D3.js 动画 过渡效果 (V3版本)
    D3.js(v3)+react 制作 一个带坐标轴与比例尺的折线图
    D3.js 弦生成器(V3版本)
  • 原文地址:https://www.cnblogs.com/deijiawoyu/p/12615996.html
Copyright © 2020-2023  润新知