`

Spring4MVC之使用 Servlet API 作为入参

 
阅读更多

 

使用 Servlet API 作为入参

 

MVC 的 Handler 方法可以接受哪些 ServletAPI 类型的参数:

 

HttpServletRequest

HttpServletResponse

HttpSession

java.security.Principal

Locale

InputStream

OutputStream

Reader

Writer

 

示例

 

1. 添加JSP页面

 

        <li>使用 Servlet API作为入参
            <ul>
                <li><a href="user/testServletAPI">使用 Servlet API作为入参</a></li>
                <li><a href="user/testServletAPI2">使用 Servlet API作为入参</a></li>
            </ul>
        </li>

 

2. 添加处理器类

 

/**
	 * 可以使用Servlet原生的API作为目标方法的参数 具体支持以下类型
	 * 
	 * HttpServletRequest
	 * HttpServletResponse
	 * HttpSession
	 * java.security.Principal
	 * Locale
	 * InputStream
	 * OutputStream
	 * Reader
	 * Writer
	 * 
	 */
	@RequestMapping("testServletAPI")
	public String testServletAPI(HttpServletRequest request,HttpServletResponse response)
	{
		System.out.println("------testServletAPI HttpServletRequest: " + request +  "------");
		System.out.println("------testServletAPI HttpServletResponse: " + response +  "------");
		return LOGIN;
	}
	
	@RequestMapping("testServletAPI2")
	public void testServletAPI2(Writer writer) throws IOException
	{
		System.out.println("------testServletAPI2 Writer: " + writer +  "------");
		StringBuffer sb = new StringBuffer();
		sb.append("<html><body>");
		sb.append("<br/><a href='/org.rabbitx.web.spring4mvc/index.jsp'>Back TO Home Page</a>");
		sb.append("</body></html>");
		writer.write(sb.toString());
	}

 

原理分析

 

1. 在 testServletAPI方法中打断点并使用debug模式启动服务器;

2. 在浏览器端点击对应连接启动调试;

3. 在调试窗口选中AnnotationMethodHandlerAdapter$ServletHandlerMethodInvoker(HandlerMethodInvoker).invokeHandlerMethod(Method, Object, NativeWebRequest, ExtendedModelMap) line: 175



 其中,resolveHandlerArguments为解析处理参数方法。

 

4. 进入resolveHandlerArguments方法;

5. 找到resolveHandlerArguments方法中resolveCommonArgument方法并进入;

6. 找到resolveCommonArgument方法中resolveStandardArgument方法并进入;

7. 在方法resolveStandardArgument上使用Ctrl+T快捷键并选择"ServletHandlerMethodInvoker"进入;



 

8. 查看方法resolveStandardArgument可以知道SpringMVC本质上还是从原生ServletAPI中获取相应的对象;

 

@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.equals(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);
		}

 

 

  • 大小: 12.2 KB
  • 大小: 48 KB
  • 大小: 58.8 KB
分享到:
评论

相关推荐

    Spring3MVC注解教程.ppt

    使用Servlet API对象作为入参 使用Spring的Servlet API代理类 使用IO对象作为入参 其他类型的参数 HttpMessageConverter HttpMessageConverter实现类 使用@RequestBody/@ResponseBody 使用...

    第三章 Spring MVC Servlet API与Json的支持

    NULL 博文链接:https://1151461406.iteye.com/blog/2390744

    Spring.MVC.A.Tutorial.2nd.Edition.1771970316

    Table of Contents Introduction Chapter 1: The Spring Framework Chapter 2: Model 2 and the MVC Pattern Chapter 3: Introduction to Spring MVC Chapter 4: Annotation-Based Controllers Chapter 5: Data ...

    Spring MVC 3.0实战指南.ppt

    使用Servlet API对象作为入参 使用Spring的Servlet API代理类 使用IO对象作为入参 其他类型的参数 HttpMessageConverter HttpMessageConverter实现类 使用@RequestBody/@ResponseBody 使用...

    spring4-mvc-rest-example:使用Servlet 3,带有Java配置的Spring 4和带有Mongo存储库的Spring数据的示例Rest API应用程序

    使用Servlet 3,带有Java配置的Spring 4和带有Mongo存储库的Spring数据的示例Rest API应用程序 将应用程序导入到eclipse中。 使用gradle cleaneclipse eclipse 要使用这些API,可以使用Postman或curl。 支持的方法...

    Spring_Framework_ API_5.0.5 (CHM格式)

    Spring Web Reactive 在 spring-webmvc 模块中现有的(而且很流行)Spring Web MVC旁边的新的 spring-web-reactive 模块中。 请注意,在 Spring5 中,传统的 SpringMVC 支持 Servlet3.1 上运行,或者支持 JavaEE7 的...

    spring mvc 基础笔记 源代码

    spring mvc 基础笔记 源代码. 下载后倒入到eclipse当中。 请重新倒入Tomcat安装目录lib文件夹下的servlet-api.jar. 如果是jQuery.js文件有红色叉表示错误的话请无视。

    Spring MVC 3.0实战指南

    支持REST风格的URL 添加更多注解,可完全注解驱动 引入HTTP输入输出转换器...和数据转换、格式化、验证框架无缝集成 对静态资源处理提供特殊支持 更加灵活的控制器方法签名,可完全独立于Servlet API

    Spring-MVC-Source-Code:Spring MVC源代码和实践-mvc source code

    新建maven项目,只需添加Spring MVC和Servlet的依赖就可以即可。 &lt; groupId&gt;javax.servlet &lt; artifactId&gt;javax.servlet-api ${servlet.version} &lt; scope&gt;provided &lt; groupId&gt;org.springframework ...

    Spring API

    6.8.4. 在Spring应用中使用AspectJ加载时织入(LTW) 6.9. 更多资源 7. Spring AOP APIs 7.1. 简介 7.2. Spring中的切入点API 7.2.1. 概念 7.2.2. 切入点运算 7.2.3. AspectJ切入点表达式 7.2.4. 便利的切入...

    spring-mvc3-javaconfig:配置为不使用XML的Java Spring MVC 3应用程序。 还使用Servlet 3 API绕过web.xml

    Spring @MVC 3.1 Java配置这是一个使用Spring的Java配置而不是XML的简单示例。 我的解释了此示例。 这是一个伪造的登录应用程序。 在现实生活中,您可能会改用Spring Security。 有一个服务和数据访问层,但是存储库...

    servletmvc-api:模仿spring mvc开发的一个简易的mvn控制器

    servletmvc-api 模仿spring mvc开发的一个简易的mvn控制器 mvn clean install 安装到本地maven库

    Spring3_MVC注解

    spring3 mvc 注解 支持REST风格的URL 添加更多注解,可完全注解驱动 引入HTTP输入输出转换器(HttpMessageConverter) 和数据转换、格式化、验证框架无缝集成 对静态资源处理提供特殊支持 更加灵活的控制器方法签名...

    Spring MVC 3.0实战指南--陈雄华

    Spring MVC 3.0新特性: 1.支持REST风格的URL 2.添加更多注解,可完全注解驱动 3.引入HTTP输入输出转换器(HttpMessageConverter)和数据转换、格式化、验证框架无缝集成 4.对静态资源处理提供特殊支持 5.更加...

    Spring3_MVC注解教程

    Spring3_MVC注解教程 支持REST风格的URL 添加更多注解,可完全注解驱动 引入HTTP输入输出转换器(HttpMessageConverter) 和数据转换、格式化、验证框架无缝集成 对静态资源处理提供特殊支持 更加灵活的控制器方法...

    202305-Spring MVC面试题(2023最新版)思维导图.zip

    - Spring MVC - Spring Data - Spring Security - Spring Cloud 4. Web开发: - HTML、CSS、JavaScript - HTTP协议 - Servlet、JSP - AJAX、JSON、XML 5. 框架和工具: - MyBatis - Hibernate - ...

    spring4.3.9相关jar包

    外部依赖spring-context, Servlet API, (JSP API, JSTL, Commons FileUpload, COS)。 spring-webmvc.jar :这个jar 文件包含Spring MVC 框架相关的所有类。包含国际化、标签、Theme、视图展现的FreeMarker、...

    Spring.Essentials.178398

    Build lightning-fast web applications and REST APIs using Spring MVC and its asynchronous processing capabilities with the view technologies of your choice Explore simplified but powerful data access ...

Global site tag (gtag.js) - Google Analytics