关于struts2页面数据处理的分析

关于struts2页面数据处理的分析

前言:struts2中怎样获取页面数据呢?是valueStack,是ognl,是struts2还是xwork?
Struts 2是WebWork的升级,而不是Struts 1的升级,甚至在Apache的Struts 2的官方文档都提到:WebWork到Struts 2是一次平滑的过渡。实际上,Struts 2.0其实是WebWork 2.3而已,从WebWork2.2迁移到Struts 2.0不会比从WebWork 2.1到2.2更麻烦。在很多方面,Struts 2仅仅是改变了WebWork下的名称,因此,如果开发者具有WebWork的开发经验,将可以更加迅速地进入Struts 2的开发领域。
WebWork是由OpenSymphony组织开发的,致力于组件化和代码重用的拉出式MVC模式J2EE Web框架。现在的WebWork2.x前身是Rickard Oberg开发的WebWork,但现在WebWork已经被拆分成了Xwork1和WebWork2两个项目。 Xwork简洁、灵活功能强大,它是一个标准的Command模式实现,并且完全从web层脱离出来。 Xwork提供了很多核心功能:前端拦截机(interceptor),运行时表单属性验证,类型转换,强大的表达式语言(OGNL – the Object Graph Notation Language),IoC(Inversion of Control倒置控制)容器等。 WebWork2建立在Xwork之上,处理HTTP的响应和请求。WebWork2使用ServletDispatcher将HTTP请求的变成 Action(业务层Action类), session(会话)application(应用程序)范围的映射,request请求参数映射。WebWork2支持多视图表示,视图部分可以使用JSP, Velocity, FreeMarker, JasperReports,XML等。在WebWork2.2中添加了对AJAX的支持,这支持是构建在DWR与Dojo这两个框架的基础之上.
事实上struts2也分为struts2与xwork两部分。作用与webWork的WebWork2、Xwork1相同。

1.struts1.X中利用ActionForm从页面表单中获取数据,或者直接用request.getparameter从页面表单中获取数据。
当使用ActionForm时候,其实是ActionForm利用java反射机制将request.getparameter中的值赋给对应的form属性。也可以利用commons-beanutils.jar中的org.apache.commons.beanutils.BeanUtils类的copyProperties(vo, form)方法将form对象的拷贝到vo对象。BeanUtils提供对 Java反射和自省API的包装。其主要目的是利用反射机制对JavaBean的属性进行处理。

2.在struts2的默认配置文件struts-default.xml中,可以看到:
<interceptor name="params" class="com.opensymphony.xwork2.interceptor.ParametersInterceptor"/>
此拦截器用来拦截Action的参数,也就是get,set方法与页面的数据交互拦截。它有一个参数:excludeParams,用来设置不拦截的属性名,值为正则表达式形式。这个拦截器将在Action的execute()方法执行之前调用,作用是将request请求的参数值通过表达式语言设置到相应Action的模型里。例如:reg.jsp里的<input type="text" name="user.username">,它输入的值会由Action类的getUser()和User类的setUserName("…")设置到这个User模型里。假设你在注册页面输入用户名"liudong",提交表单ParametersInterceptor就会下面的操作:首先从请求中取得参数的名字和名字对应的值,分别为:"user.username"和"liudong",根据这个名字,从OgnlValueStack中取得堆栈最上面的getUser().setUsername("liudong")操作,即取得Action对象的User模型,并设置username属性的值为"liudong"。原来,我们的Action是通过XWork的拦截器ParametersInterceptor从提交的表单中取得请求的参数和值,再通过OgnlValueStack来执行表达式,调用Action和模型里相应的get或set方法,将从请求中取得的值设置到模型中去。reg.jsp中Input输入框的name="user.username"是必需要遵守OGNL的命名规则。也正是很多拦截器的使用,使得我们的Action类和Web实现了完全的解耦,让我们的Action能如此的简单、优雅!

3.ParametersInterceptor 扩展了抽象类AroundInterceptor。并在其预处理方法(before)中实现了数据的转换。数据转换的过程并不复杂:
1). 首先由ActionContext获得Map型的参数集parameters。
2). 由ActionContext获得值栈(OgnlValueStack)。
3). 遍历 parameters中的各项数据。
4). 通过 OgnlValueStack,根据数据的键值,为Model 对象填充属性数据。


4.MVC框架的运作流程拆分为以下几部分加以讨论:
1).将Web页面中的输入元素封装为一个(请求)数据对象。
2).根据请求的不同,调度相应的逻辑处理单元,并将(请求)数据对象作为参数传入。
3).逻辑处理单元完成运算后,返回一个结果数据对象。
4).将结果数据对象中的数据与预先设计的表现层相融合并展现给用户

5.struts2执行过程:所有以.action结尾的服务请求将由ServletDispatcher接管。ServletDispatcher 接受到Servlet Container 传递过来的请求,将进行一下几个动作:
1). 从请求的服务名(例如:/login.action)中解析出对应的Action名称(login)
2). 遍历 HttpServletRequest、HttpSession、ServletContext 中的数据,并将其复制到Webwork的Map实现中,至此之后,所有数据操作均在此Map结构中进行,从而将内部结构与Servlet API相分离。至此,Webwork 的工作阶段结束,数据将传递给XWork(即struts2) 进行下一步处理。从这里也可以看到Webwork和xwork之间的切分点,Webwork为xwork提供了一个面向Servlet 的协议转换器,将Servlet 相关的数据转构转换成xwork所需要的通用数据格式,而xwork将完成实际的服务调度和功能实现。这样一来,以xwork为核心,只需替换外围的协议转换组件,即可实现不同技术平台之间的切换(如将面向Servlet的Webwork替换为面向JMS的协议转换器实现,即可在保留应用逻辑实现的情况下,实现不同外部技术平台之间的移植)。
3). 以上述信息作为参数,调用ActionProxyFactory创建对应的ActionProxy实例。ActionProxyFactory 将根据Xwork 配置文件(xwork.xml)中的设定,创建ActionProxy实例,ActionProxy中包含了Action的配置信息(包括Action名称,对应实现类等等)。
4). ActionProxy创建对应的Action实例,并根据配置进行一系列的处理程序。包括执行相应的预处理程序(如通过Interceptor 将Map 中的请求数据转换为Action
所需要的Java 输入数据对象等),以及对Action 运行结果进行后处理。ActionInvocation 是这一过程的调度者。而com.opensymphony.xwork.DefaultActionInvocation 则是XWork 中对ActionInvocation 接口的标准实现,如果有精力可以对此类进行仔细研读,掌握了这里面的玄机,相信XWork的引擎就不再神秘。"params"大概是Webwork 中最重要、也最常用的一个Interceptor。上面曾经将MVC工作流程划分为几个步骤,其中的第一步:“将 Web 页面中的输入元素封装为一个(请求)数据对象”就是通过"params"拦截器完成。Interceptor 将在Action 之前被调用,因而,Interceptor 也成为将Webwork传来的MAP 格式的数据转换为强类型Java 对象的最佳实现场所。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值