- 浏览: 716851 次
- 性别:
- 来自: 西安
文章分类
最新评论
-
cuqing:
laogao598599 写道匿名内部类不一定是局部内部类,还 ...
匿名内部类访问外部类中的局部变量必须是final属性 -
laogao598599:
匿名内部类不一定是局部内部类,还可以作为成员变量
匿名内部类访问外部类中的局部变量必须是final属性 -
stand_star:
非常给力!
struts2验证规则配置文件命名方式 -
wenlongsust:
嗯, 将返回值修改为html的确就可以了
EasyUI form ajax submit后,在IE下提示下载内容的解决办法 -
勇往直前wwt:
这样是自动增长,但每次id还得插入,如何只插入其他字段而让id ...
把主键定义为自动增长标识符类型
关于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 对象的最佳实现场所。
前言: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 对象的最佳实现场所。
发表评论
-
StrutsUtils 未定义”错误
2011-04-02 00:14 1881使用s:optiontransferselect标签必须放在s ... -
struts2.xml method属性不配置时,url链接不能带参数
2011-03-31 14:21 1557如下: <action name="linkA ... -
s:iterator使用begin、end、step
2011-02-28 18:29 9519<s:iterator value="list ... -
s:doubleselect不换行
2011-01-21 13:55 1772属性 labelposition=left 换行 labelp ... -
struts2 中 OGNL表达式的使用
2010-12-17 13:46 1167GNL是Object Graph Navigation L ... -
webwork中变量的存放有两种方式
2010-12-17 13:37 19481.web app通用的方式,即是:放入sesson,requ ... -
paramsPrepareParamsStack
2010-12-17 12:43 1908paramsPrepareParamsStack在Struts ... -
struts2自己定义拦截器
2010-12-17 12:42 1505Interceptor(拦截器), ... -
struts2与webWork2的区别
2010-12-17 11:31 37041.Struts2更加优雅一些,至少Action变成了一个纯粹 ... -
配置了sitemesh后用struts2标签就报错
2010-12-17 09:49 1642配置了sitemesh后用struts2标签就报错,用ognl ... -
struts2验证器
2010-12-15 11:25 1322在Struts2框架中Validator必须在系统中注册,如果 ... -
struts2 json插件
2010-12-15 11:24 1215<package name="default& ... -
STRUTS2 ACTION的跳转类型说明
2010-12-15 11:23 1292chain:Action链式处理的结果类型,也就是将结果转发到 ... -
struts2拦截器简介
2010-12-15 11:08 1271拦截器简介: 1:拦截器-Exception <int ... -
struts2调用javabean中的方法
2010-09-27 16:28 16291.<s:set name="str" ... -
struts2 result type=chain、dispatcher、redirect
2010-08-23 17:14 2968dispatcher:用于页面转发,页面跳转过程一直是同一个线 ... -
struts2取url参数
2010-08-16 15:21 2095取url参数,用request.getParameter(na ... -
struts2.1.8.1+jquery1.4.2返回json数据
2010-08-16 10:10 13191、引入包(本文中的包全部引自struts-2.1.8.1\l ... -
struts2 alert 错误消息
2010-08-05 17:55 1223<s:if test="hasFieldErr ... -
struts2的result type="plainText"
2010-07-13 14:46 63191.作用:将response中的数据直接打印到当前页面指定的地 ...
相关推荐
此外,Struts2支持多种结果类型,如dispatcher(用于转发到JSP页面)、stream(用于处理文件下载)和redirect(用于重定向)。这些结果类型可以通过结果映射在struts.xml中进行配置。 关于类图,它们有助于我们理解...
### 关于Struts2中利用JavaScript刷新window.showModalDialog的父页面 在Web开发中,尤其是在使用Struts2框架进行项目开发时,我们经常会遇到需要弹出模态对话框(modal dialog)的需求。其中一个常见的场景就是...
Struts2是一个强大的Java ...通过分析和学习这个小案例,你可以深入理解Struts2框架的工作原理,如何组织代码,以及如何有效地使用Struts2特性来构建实际的Web应用。同时,这也会帮助你掌握MVC模式在实际开发中的应用。
8. **表单处理**:Struts2提供了强大的表单处理能力,可以自动绑定请求参数到Action的属性,实现数据验证,并将错误信息回显到页面。 9. **异常处理**:Struts2通过全局异常映射(Global Exception Mapping)来统一...
Struts2是一个强大的Java web应用程序框架,用于...通过分析源代码,可以深入理解Struts2的工作原理、配置机制以及MVC模式在实际项目中的应用。对于初学者,这是一个很好的实践平台,能帮助他们掌握Web开发的基本技能。
- **适用范围**:Struts2广泛应用于企业级Java Web项目的开发中,特别是那些需要处理大量用户交互和数据展示的应用。 #### 二、Struts2入门案例 - **Hello Struts2**:通过创建一个简单的“Hello World”示例,...
在提供的“struts2 demo”压缩包中,你可以找到这些概念的具体实现,包括Action类、视图页面、配置文件等,通过分析和运行这些示例,你可以深入理解Struts2的工作原理和用法。这个压缩包对于初学者来说是一个很好的...
通过深入研究和分析struts2-showcase项目,开发者能够全面了解Struts2的特性和最佳实践,从而在实际项目中更好地利用这一强大的框架。同时,它也是一个很好的学习资源,帮助初学者快速上手Struts2开发。
在本压缩包中,包含的是张孝祥关于Struts2的视频教程源码,通过分析这两个示例,我们可以深入理解Struts2的核心概念和工作原理。 1. **Struts2框架概述** Struts2是Apache软件基金会下的一个开源项目,它是Struts1...
通过分析这个Struts2项目源码,你可以学习以下技能: 1. 如何创建Action类,并定义其方法与用户请求对应。 2. 理解配置文件`struts.xml`的结构和作用。 3. 掌握Action与视图的交互,了解结果类型的应用。 4. 学习...
7. **异常处理**:Struts2有强大的异常处理机制,可以捕获并统一处理Action执行过程中的异常,同时支持自定义异常处理策略。 8. **国际化与本地化**:Struts2支持多语言环境,通过资源包(Properties文件)实现国际...
在探讨“Struts2与JSON整合”的主题时,我们深入分析了如何在Struts2框架中集成JSON技术,实现前后端数据的高效交互。Struts2作为一款流行的Java Web开发框架,提供了丰富的功能来简化Web应用程序的开发过程。而JSON...
通过分析和运行这些示例,初学者可以快速掌握Struts2的基本用法和流程,为进一步深入学习打下基础。记得在实际操作中,不仅要理解代码的含义,还要理解它们在Struts2框架中的作用,这样才能更好地运用到自己的项目中...
Struts2是一个强大的Java web框架,它为构建MVC(模型-视图-控制器)架构的应用程序提供了全面的支持。...通过分析和理解这个实例,开发者可以更好地掌握Struts2框架的使用,为自己的项目开发打下坚实的基础。
根据提供的文件信息,我们可以推断出这是一套关于Struts2框架的教学视频资料,由知名的教育机构传智播客在2015年9月发布。下面将对Struts2框架进行详细介绍,并基于该视频资料可能涵盖的核心知识点进行展开。 ### ...
5. 参数绑定问题:Struts2使用OGNL进行对象属性与表单字段的绑定,如果数据类型不匹配,会导致转换错误。确保表单字段与Action类属性类型一致。 6. 安全问题:Struts2存在一些已知的安全漏洞,如S2-005和S2-045,应...
通过阅读《Struts2 in action》这本书,你可以深入学习Struts2的各个方面,包括最佳实践、高级特性和案例分析,从而在实际项目中更加熟练地运用这个框架。无论你是初学者还是经验丰富的开发者,这本书都将为你的Java...
- **Action类**:在Struts2中,Action类是处理用户请求的中心组件,它封装了业务逻辑,并通过调用Service层来处理实际的业务操作。 - **配置文件**:`struts.xml`是Struts2的主要配置文件,用于定义Action、结果...
通过分析这个"北大青鸟 struts2 项目源代码",你可以了解到Struts2框架的实战应用,包括请求处理流程、配置文件的编写、Action的设计和实现、视图的渲染以及拦截器的使用。这有助于你更深入地理解和掌握Struts2框架...
在这个留言板项目中,`struts.xml`会包含关于留言板Action的配置,例如Action的映射路径、结果页面的跳转规则等。 4. **Action类** Action类是Struts2的核心组件,负责处理用户请求。每个Action类对应一个具体的...