实现自定义MVC自动填充参数

简介:

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

总体思路:

  我还不是太明白。

步骤一:创建WebConfig.class继承WebMvcConfigurerAdapter类,重写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 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方法:对参数的值进行注入。

 

你可能感兴趣的:(实现自定义MVC自动填充参数)