`
javasogo
  • 浏览: 1822038 次
  • 性别: Icon_minigender_1
  • 来自: 北京
文章分类
社区版块
存档分类
最新评论

Struts源码粗略分析三:代码剖析

 
阅读更多

非核心内容分析

继续上节,我们继续分析ActionServlet.process中的关键组件RequestProcessor的process方法。

processMultipart的目的就是包装一个可以处理以multipart-data形式发送的表单数据,多用于文件上传。相关内容请参考http://commons.apache.org/fileupload/和http://www.ietf.org/rfc/rfc2388.txt。

processPath,返回一个路径,之后会利用该路径找个一个匹配的ActionMapping,ActionMapping属于一种不可见的关键性组件,它负责组织path,Action,ActionForm,forward并让它们协作。这里的处理包括模块与非模块部分。

processLocale,这个比较有意思,从下面代码以及对应的JavaDoc说明可以得知,Struts的Locale是可以通过配置来决定是否可以自动为客户端选择语言类型。

语言相关内容请参考http://www.openinternetlexicon.com/HowTo/HowToServe.html,它描述了如何用浏览器发送带有指定语言的HTTP请求。当一个页面需要表现多种语言时,我们就可以像下面代码这样在页面的不同区域切换不同语言,虽然这样的场景不多,但确实存在,我就不走运碰到过~~~

至于processContent、processNoCache,没什么好说的,HTTP头相关处理。

processPreprocess,一个没有意义的实现,之所以留有这个方法就是允许我们扩展ActionServlet来定义自己的ActionServlet实现,然后覆盖掉这个方法来添加一些自定义的内容。如果不想写自己的ActionServlet,那这个方法基本上是作废了,没什么使用价值。到此为止,与Struts核心功能组件不相关的内容就结束了~~~(processCachedMessages,看样子是清理Struts框架中的消息,节省资源,但什么时候用过,还真不知道:)

ActionMapping

负责把ActionForm、Action和ActionForward组织起来,让它们协同工作。之前所说的processPath就是帮助我们返回一个可以标识唯一的ActionMapping关键字,这个定位操作就是由processMapping完成的。而接下来的processRoles,则是服务器安全校验,相关内容请参考《Core Servlets and JavaServer Pages, Volume 2: Advanced Technologies, Second Edition》第三章、第四章,此书已有中文版。

ActionForm

processActionForm,创建一个ActionForm并根据对应的ActionMapping中配置信息放入session或reqeust中。processPopulate,这个方法值得一看,其中心内容就是BeanUtils.populate(bean, properties),如何利用一个Map类型对象为一个JavaBean填充数据,具体内容请参考BeanUtils文档。processValidate,先调用form.validate的方法,如果返回内容空或没有错误,则将控制权返回给上层代码,否则返回失败标识并执行跳转动作,以下这些跳转动作都是值得关注的:

  • response.sendError
  • response.sendRedirect
  • getServletContext().getRequestDispatcher(uri).forward(request, response);

Action

processForward和processInclude分别处理ForwardAction和IncludeAction,对应实现分别为doForward和doInclude,这两个实现技巧都非常有用,可以查看具体代码以加深印象!

processActionCreate是用于Action创建的,Struts中所有的Action都是统一管理,且每个定义只有一个实例存在,即单态。因为Servlet是以多线程形式相应客户端,而Action又作为共享资源存在,这里就会有多线程安全问题,所以在创建Action的时候,共享变量actions是被synchronized块所包围的。

有了Action,就可以调用processActionPerform了,这里的设计模式属于模板方法,直接调用我们最熟悉的Action.execute。现在打开/struts1/struts-1.3.10/src/extras/src/main/java下的org.apache.struts.actions,里面罗列了许多Action的实现,对于有些Action的特殊用法,小秘密都集中在execute方法中:)

  • apache/struts/actions/ActionDispatcher.java
  • apache/struts/actions/BaseAction.java
  • apache/struts/actions/DispatchAction.java
  • apache/struts/actions/DownloadAction.java
  • apache/struts/actions/EventActionDispatcher.java
  • apache/struts/actions/EventDispatchAction.java
  • apache/struts/actions/ForwardAction.java
  • apache/struts/actions/IncludeAction.java
  • apache/struts/actions/LocaleAction.java
  • apache/struts/actions/LookupDispatchAction.java
  • apache/struts/actions/MappingDispatchAction.java
  • apache/struts/actions/SwitchAction.java

ActionForward

最后一步就是processForwardConfig,执行跳转或转发操作,之前已经说过,这里就不再重复。

异常控制

如果在struts-config.xml中定义了异常控制句柄,在form.validate或action.execute发生异常时就会调用processException,该方法又会根据异常类型来自动选择异常句柄,主要是利用getClass方法一层层向上查找看是否有合适的处理句柄。

结束语

分析过程虽然粗糙(实在没那么多时间和精力),但主线过程基本都光顾到了,如有遗漏还望指出。

推荐几个参考文档:

《Prentice Hall - Core Servlets and JavaServer Pages, Volume 1 Core Technologies, 2nd Edition》

Prentice Hall -Core Servlets and JavaServer Pages, Volume 2: Advanced Technologies》

《McGraw-Hill -Struts: The Complete Reference

分享到:
评论

相关推荐

    struts2 源码分析

    Struts2 源码分析 Struts2 是一个基于MVC 模式的Web 应用程序框架,它的源码分析可以帮助我们更好地理解框架的内部机制和工作流程。下面是Struts2 源码分析的相关知识点: 1. Struts2 架构图 Struts2 的架构图...

    struts2源代码分析

    在分析Struts2的源代码之前,你需要首先获取Struts2的源代码,可以通过访问http://www.opensymphony.com/xwork/download.action下载XWork的源码,因为它构成了Struts2的核心。下载的源代码压缩包名为struts-2.1.0-...

    struts2源码分析

    struts2源码详细解析51CTO下载-struts2源代码分析(个人觉得非常经典)

    Struts 2.1.8_学习源码

    Struts 2.1.8 学习源码内容 Struts2_01FirstDemo : 跑通第一个Struts2的实例 Struts2_02CURD : 关于Struts2的增、删、改和查 实际业务中数据来自数据库,从DAO层查询,本实例使用静态资源的方式模拟, 主要是关于...

    struts2源码分析总结

    本文将深入探讨Struts2的源码分析,特别是关于StrutsPrepareAndExecuteFilter的初始化过程,这是Struts2的核心组件之一,负责处理HTTP请求。 首先,我们来看`StrutsPrepareAndExecuteFilter`的初始化。这个过滤器...

    struts-1.3.9 源码

    通过分析Struts 1.3.9的源码,开发者可以学习到如何设计一个MVC框架,了解其请求处理流程、视图渲染机制以及如何通过配置文件定制行为。此外,这也有助于开发者在遇到问题时能够追溯源代码,找到问题的根源,或者为...

    Struts2源码分析

    在深入理解Struts2的工作原理时,源码分析是必不可少的步骤。Struts2的核心设计理念和设计模式相比Struts1.x有了显著的变化,这使得它成为一个独立且成熟的框架。 首先,Struts2的架构基于WebWork的核心,这意味着...

    struts2.1.8 struts2源码 Eclipse关联这个可以

    在Eclipse中关联Struts2.1.8源码,可以帮助开发者更好地理解和调试代码。步骤包括: - 下载Struts2.1.8的源码包。 - 在Eclipse中,右键点击项目,选择"Build Path" -> "Configure Build Path" -> "Libraries" -> ...

    struts2部分源码分析

    本篇文章将深入探讨Struts2的运行原理,通过源码分析来揭示其内部工作机制。 首先,我们从核心组件开始。Struts2的核心组件包括Action、FilterDispatcher、Interceptor和Result。Action是业务逻辑的载体,它接收...

    struts2文件上传下载源代码

    这篇博客文章提供的"struts2文件上传下载源代码"旨在帮助开发者理解和实现这些功能。 文件上传功能允许用户从他们的设备上传文件到服务器。在Struts2中,这通常通过表单实现,表单包含一个`<input type="file">`...

    struts-1.2.9-src源码类库

    总的来说,"struts-1.2.9-src"源码库是学习和研究Struts框架的经典资料,通过阅读和分析,开发者可以更好地掌握Java Web开发,特别是Struts框架的应用技巧和内部机制,为实际项目开发提供坚实的理论基础和技术支持。

    Struts2框架源码

    在MyEclipse9中,你可以导入这些源码,通过调试和阅读代码,理解Struts2的工作原理。对于初学者来说,这是一条深入理解MVC框架的好途径。你可以逐步分析Action类如何被调用,拦截器如何影响Action的执行流程,以及...

    struts源码

    通过对源码的阅读和分析,开发者能够更好地定制和优化Struts框架,解决特定场景下的问题,提升开发效率和应用性能。同时,了解Struts的源码也有助于理解和学习其他MVC框架,比如Spring MVC,因为它们遵循相似的设计...

    struts2.3.4源代码

    尽管描述中提到不包含XWork源代码,但XWork是Struts2的基础,它处理Action的执行和异常管理。 在Struts2.3.4源代码中,我们可以深入理解以下关键知识点: 1. **FilterDispatcher**: 这是Struts2框架的入口点,负责...

    struts2 源码

    深入学习Struts2的源码,有助于理解其运行机制,从而更好地优化代码、调试问题,甚至开发自己的扩展。对于Java Web开发者来说,掌握Struts2的基本原理和使用技巧,能够显著提高开发效率和应用质量。

    Struts2源码阅读

    通过阅读Struts2的源码,我们可以深入了解框架如何处理请求、如何调度Action以及如何应用拦截器来扩展功能。这有助于开发者更好地定制和优化他们的应用程序,提高代码质量和性能。在实际开发中,对源码的理解能帮助...

    struts 1 源码分析

    下面我们将深入探讨Struts 1的源码分析,特别是针对Struts 1.2版本。 1. **架构概述** - **DispatcherServlet**:作为Struts的核心,DispatcherServlet负责接收HTTP请求并分发到相应的Action。 - **ActionMapping...

    手动编写struts源码及讲解

    在“MyStruts”这个压缩包中,可能包含的是整个项目的源码结构,包括Action、Form、配置文件、JSP页面等,你可以通过阅读和运行这些代码,亲身体验Struts的工作流程,加深对Struts的理解。如果你对Struts框架感兴趣...

Global site tag (gtag.js) - Google Analytics