SpringMVC使用Servlet的原生API作为参数(部分源码)

<a href="springmvc/testServletAPI">Test ServletAPI</a>

    /**
     * 可以使用 Serlvet 原生的 API 作为目标方法的参数,具体支持一下类型
     * ServletRequest
     * ServletResponse
     * HttpSession
     * Principal
     * Locale
     * InputStream
     * Reader
     * OutputStream
     * Writer
     */

@RequestMapping("/testServletAPI")
    public String testServletAPI(HttpServletRequest request,
            HttpServletResponse response){
        System.out.println(request+"/n"+response);(断点处)
        return SUCCESS;
    }

以 Debug 的方式启动 Tomcat .

一、Debug 找到下图位置

下图中的 args 中传入的就是 request, response.

二、进入 resolveHandlerArguments 方法

下图能看到是在处理注解类型的参数。

三、而我们传入的是一般类型的参数,所以在进入下图 resolveCommonArgument 中

四、点击进入下图中 resolveStandardArgument (标准参数)的实现类 AnnotationMethodHandlerAdapter 里

看到下面的方法

 

 

@Override
        protected Object resolveStandardArgument(Class<?> parameterType, NativeWebRequest webRequest) throws Exception {
        HttpServletRequest request = webRequest.getNativeRequest(HttpServletRequest.class);
       HttpServletResponse response = webRequest.getNativeResponse(HttpServletResponse.class);

            if (ServletRequest.class.isAssignableFrom(parameterType) ||
                    MultipartRequest.class.isAssignableFrom(parameterType)) {
                Object nativeRequest = webRequest.getNativeRequest(parameterType);
                if (nativeRequest == null) {
                    throw new IllegalStateException(
                            "Current request is not of type [" + parameterType.getName() + "]: " + request);
                }
                return nativeRequest;
            }
            else if (ServletResponse.class.isAssignableFrom(parameterType)) {
                this.responseArgumentUsed = true;
                Object nativeResponse = webRequest.getNativeResponse(parameterType);
                if (nativeResponse == null) {
                 throw new IllegalStateException(
                    "Current response is not of type [" + parameterType.getName() + "]: " + response);
                }
                return nativeResponse;
            }
            else if (HttpSession.class.isAssignableFrom(parameterType)) {
                return request.getSession();
            }
            else if (Principal.class.isAssignableFrom(parameterType)) {
                return request.getUserPrincipal();
            }
            else if (Locale.class == parameterType) {
                return RequestContextUtils.getLocale(request);
            }
            else if (InputStream.class.isAssignableFrom(parameterType)) {
                return request.getInputStream();
            }
            else if (Reader.class.isAssignableFrom(parameterType)) {
                return request.getReader();
            }
            else if (OutputStream.class.isAssignableFrom(parameterType)) {
                this.responseArgumentUsed = true;
                return response.getOutputStream();
            }
            else if (Writer.class.isAssignableFrom(parameterType)) {
                this.responseArgumentUsed = true;
                return response.getWriter();
            }
            return super.resolveStandardArgument(parameterType, webRequest);
        }

转载于:https://my.oschina.net/u/3387637/blog/909287

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值