`

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
分享到:
评论

相关推荐

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

    在本章中,我们将深入探讨Spring MVC框架与Servlet API以及JSON支持的相关知识。Spring MVC是Spring框架的一个核心模块,主要用于构建Web应用程序,它提供了一种优雅的方式来处理HTTP请求和响应,实现了模型-视图-...

    Spring Web MVC外文翻译

    Spring Web MVC 是基于 Servlet API 构建的原始 Web 框架,它从 Spring 框架诞生之初就被包含其中。正式名称“Spring Web MVC”来源于其源模块 `spring-webmvc`,但在实际使用中更常见地被称为“Spring MVC”。 与 ...

    javaEE servlet-api

    使用Servlet API,开发者可以创建各种类型的Web应用,包括简单的HTTP服务、MVC框架(如Spring MVC)、RESTful Web服务,甚至可以与其他Java EE技术(如JSP、EJB、JPA)集成,构建复杂的企业级解决方案。 总结一下,...

    spring MVC配置详解

    Spring MVC 是一个基于 DispatcherServlet 的 MVC 框架,它是当前主流的 Web 框架之一。要想灵活运用 Spring MVC 来应对大多数的 Web 开发,就必须要掌握它的配置及原理。 一、Spring MVC 环境搭建 1. jar 包引入 ...

    Servlet+JSP和Spring+MVC初学指南 书籍配套源码

    Servlet+JSP与Spring+MVC是两种在Java Web开发中常见的技术栈,它们用于构建动态、交互式的Web应用程序。本指南将深入介绍这两种技术及其整合应用,通过配套的源码帮助初学者更好地理解概念和实践操作。 Servlet是...

    Servlet JSP Spring MVC初学指南(alin书签).pdf

    Servlet、JSP和Spring MVC是Java Web开发中的三个重要技术,它们在构建动态网页和企业级应用程序中扮演着核心角色。下面将详细解释这三个技术及其相互关系。 **Servlet** 是Java编程语言中的一种接口,由Java ...

    servlet api servlet api

    MVC(Model-View-Controller)框架如Spring MVC、Struts等,虽然提供了更高级别的抽象,但底层仍然基于Servlet API处理请求和响应。 综上所述,Servlet API是构建Java Web应用的基础,提供了处理HTTP请求的核心...

    spring3.0 MVC中文教程

    4. **第4部分:Spring 3 MVC的Tiles支持与Eclipse中的插件教程** - Tiles框架是一种用于管理页面布局的强大工具,本节介绍如何将其与Spring MVC结合使用。 5. **第5部分:Spring 3 MVC的国际化与本地化教程** - 讨论...

    spring3.0 mvc中文实例教程

    【Spring3.0 MVC框架简介】 Spring3.0 MVC是Spring框架的重要组成部分,专注于构建高性能、健壮的Web应用程序。这个框架具有高度可配置性,允许开发者将各个逻辑和功能模块进行分离,增强了代码的可维护性和可扩展性...

    spring3mvc导入包

    Spring3MVC是Spring框架的一个重要模块,用于构建基于Java的Web应用程序。它提供了一个模型-视图-控制器(MVC)架构,帮助开发者将业务逻辑、数据处理和用户界面分离,实现更清晰的代码组织和更高的可维护性。在这个...

    ServletAPI.rar

    这个"ServletAPI.rar"压缩包包含的文档可能是Servlet API的官方Javadoc,这对于理解并使用Servlet技术至关重要。下面将详细阐述Servlet API的主要概念和关键知识点。 1. **Servlet**: Servlet是一个Java类,它扩展...

    mavin spring4 mvc mybatis 整合 带事务,REST风格

    【标题】"mavin spring4 mvc mybatis 整合 带事务,REST风格" 涉及到的是一个基于Java技术栈的Web应用程序开发,整合了Maven、Spring4 MVC、MyBatis框架,并且实现了RESTful API设计以及事务管理。下面将对这些关键...

    servlet-api.jar 下载地址

    现在,开发者更倾向于使用Spring MVC或Spring WebFlux等高级框架,它们提供了更简洁、更强大的Web开发方式,但底层依然基于Servlet API。 总的来说,servlet-api.jar是Java Web开发的基础,它定义了Servlet的生命...

    jakarta-servletapi-4-src.zip servlet源码

    本篇文章将围绕jakarta-servletapi-4-src.zip这个源码包,深入剖析Servlet API 4.0的关键特性与实现原理。 一、Servlet接口与生命周期 Servlet接口是所有Servlet的基础,它定义了Servlet的主要方法,如`init()`, `...

    Java Servlet API 2.5

    9. **MVC模式支持**:虽然Java Servlet API本身不直接支持Model-View-Controller(MVC)模式,但可以通过设计模式和框架(如Spring MVC)在Servlet基础上实现MVC架构。 10. **部署描述符(web.xml)**:这是Web应用的...

    Servlet API(中文版)

    - 许多Model-View-Controller (MVC)框架,如Spring MVC,基于Servlet API构建,简化了Web应用的开发和维护。 10. **异步处理** - Servlet 3.0引入了异步处理能力,允许Servlet在`service()`方法内部启动一个后台...

    Spring5MVC源码.docx

    综上所述,Spring MVC作为Spring Framework的重要组件,以其强大的功能和简洁的API设计,极大地提高了开发效率和代码质量,是Java Web开发者的首选工具。通过深入理解MVC设计模式和Spring MVC的工作原理,开发者能够...

    Spring MVC所需jar包

    4. **Servlet 相关库**:Spring MVC 需要与 Servlet 容器进行交互,因此需要 `servlet-api.jar` 和 `jsp-api.jar`。这两个 jar 包通常由服务器提供,但在开发环境中可能需要手动添加。 5. **JSTL(JavaServer Pages...

    spring mvc restful service

    Spring MVC 是一个强大的Java框架,用于构建Web应用程序,特别是对于基于模型-视图-控制器(MVC)架构的应用。在本文中,我们将深入探讨如何利用Spring MVC创建RESTful服务,这些服务可以处理字符串、JSON和XML数据...

Global site tag (gtag.js) - Google Analytics