使用 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); }
相关推荐
在本章中,我们将深入探讨Spring MVC框架与Servlet API以及JSON支持的相关知识。Spring MVC是Spring框架的一个核心模块,主要用于构建Web应用程序,它提供了一种优雅的方式来处理HTTP请求和响应,实现了模型-视图-...
Spring Web MVC 是基于 Servlet API 构建的原始 Web 框架,它从 Spring 框架诞生之初就被包含其中。正式名称“Spring Web MVC”来源于其源模块 `spring-webmvc`,但在实际使用中更常见地被称为“Spring MVC”。 与 ...
使用Servlet API,开发者可以创建各种类型的Web应用,包括简单的HTTP服务、MVC框架(如Spring MVC)、RESTful Web服务,甚至可以与其他Java EE技术(如JSP、EJB、JPA)集成,构建复杂的企业级解决方案。 总结一下,...
Spring MVC 是一个基于 DispatcherServlet 的 MVC 框架,它是当前主流的 Web 框架之一。要想灵活运用 Spring MVC 来应对大多数的 Web 开发,就必须要掌握它的配置及原理。 一、Spring MVC 环境搭建 1. jar 包引入 ...
Servlet+JSP与Spring+MVC是两种在Java Web开发中常见的技术栈,它们用于构建动态、交互式的Web应用程序。本指南将深入介绍这两种技术及其整合应用,通过配套的源码帮助初学者更好地理解概念和实践操作。 Servlet是...
Servlet、JSP和Spring MVC是Java Web开发中的三个重要技术,它们在构建动态网页和企业级应用程序中扮演着核心角色。下面将详细解释这三个技术及其相互关系。 **Servlet** 是Java编程语言中的一种接口,由Java ...
MVC(Model-View-Controller)框架如Spring MVC、Struts等,虽然提供了更高级别的抽象,但底层仍然基于Servlet API处理请求和响应。 综上所述,Servlet API是构建Java Web应用的基础,提供了处理HTTP请求的核心...
4. **第4部分:Spring 3 MVC的Tiles支持与Eclipse中的插件教程** - Tiles框架是一种用于管理页面布局的强大工具,本节介绍如何将其与Spring MVC结合使用。 5. **第5部分:Spring 3 MVC的国际化与本地化教程** - 讨论...
【Spring3.0 MVC框架简介】 Spring3.0 MVC是Spring框架的重要组成部分,专注于构建高性能、健壮的Web应用程序。这个框架具有高度可配置性,允许开发者将各个逻辑和功能模块进行分离,增强了代码的可维护性和可扩展性...
Spring3MVC是Spring框架的一个重要模块,用于构建基于Java的Web应用程序。它提供了一个模型-视图-控制器(MVC)架构,帮助开发者将业务逻辑、数据处理和用户界面分离,实现更清晰的代码组织和更高的可维护性。在这个...
这个"ServletAPI.rar"压缩包包含的文档可能是Servlet API的官方Javadoc,这对于理解并使用Servlet技术至关重要。下面将详细阐述Servlet API的主要概念和关键知识点。 1. **Servlet**: Servlet是一个Java类,它扩展...
【标题】"mavin spring4 mvc mybatis 整合 带事务,REST风格" 涉及到的是一个基于Java技术栈的Web应用程序开发,整合了Maven、Spring4 MVC、MyBatis框架,并且实现了RESTful API设计以及事务管理。下面将对这些关键...
现在,开发者更倾向于使用Spring MVC或Spring WebFlux等高级框架,它们提供了更简洁、更强大的Web开发方式,但底层依然基于Servlet API。 总的来说,servlet-api.jar是Java Web开发的基础,它定义了Servlet的生命...
本篇文章将围绕jakarta-servletapi-4-src.zip这个源码包,深入剖析Servlet API 4.0的关键特性与实现原理。 一、Servlet接口与生命周期 Servlet接口是所有Servlet的基础,它定义了Servlet的主要方法,如`init()`, `...
9. **MVC模式支持**:虽然Java Servlet API本身不直接支持Model-View-Controller(MVC)模式,但可以通过设计模式和框架(如Spring MVC)在Servlet基础上实现MVC架构。 10. **部署描述符(web.xml)**:这是Web应用的...
- 许多Model-View-Controller (MVC)框架,如Spring MVC,基于Servlet API构建,简化了Web应用的开发和维护。 10. **异步处理** - Servlet 3.0引入了异步处理能力,允许Servlet在`service()`方法内部启动一个后台...
综上所述,Spring MVC作为Spring Framework的重要组件,以其强大的功能和简洁的API设计,极大地提高了开发效率和代码质量,是Java Web开发者的首选工具。通过深入理解MVC设计模式和Spring MVC的工作原理,开发者能够...
4. **Servlet 相关库**:Spring MVC 需要与 Servlet 容器进行交互,因此需要 `servlet-api.jar` 和 `jsp-api.jar`。这两个 jar 包通常由服务器提供,但在开发环境中可能需要手动添加。 5. **JSTL(JavaServer Pages...
Spring MVC 是一个强大的Java框架,用于构建Web应用程序,特别是对于基于模型-视图-控制器(MVC)架构的应用。在本文中,我们将深入探讨如何利用Spring MVC创建RESTful服务,这些服务可以处理字符串、JSON和XML数据...