- 浏览: 7339189 次
- 性别:
- 来自: 上海
文章分类
- 全部博客 (1546)
- 企业中间件 (236)
- 企业应用面临的问题 (236)
- 小布Oracle学习笔记汇总 (36)
- Spring 开发应用 (54)
- IBatis开发应用 (16)
- Oracle基础学习 (23)
- struts2.0 (41)
- JVM&ClassLoader&GC (16)
- JQuery的开发应用 (17)
- WebService的开发应用 (21)
- Java&Socket (44)
- 开源组件的应用 (254)
- 常用Javascript的开发应用 (28)
- J2EE开发技术指南 (163)
- EJB3开发应用 (11)
- GIS&Mobile&MAP (36)
- SWT-GEF-RCP (52)
- 算法&数据结构 (6)
- Apache开源组件研究 (62)
- Hibernate 学习应用 (57)
- java并发编程 (59)
- MySQL&Mongodb&MS/SQL (15)
- Oracle数据库实验室 (55)
- 搜索引擎的开发应用 (34)
- 软件工程师笔试经典 (14)
- 其他杂项 (10)
- AndroidPn& MQTT&C2DM&推技术 (29)
- ActiveMQ学习和研究 (38)
- Google技术应用开发和API分析 (11)
- flex的学习总结 (59)
- 项目中一点总结 (20)
- java疑惑 java面向对象编程 (28)
- Android 开发学习 (133)
- linux和UNIX的总结 (37)
- Titanium学习总结 (20)
- JQueryMobile学习总结 (34)
- Phonegap学习总结 (32)
- HTML5学习总结 (41)
- JeeCMS研究和理解分析 (9)
最新评论
-
lgh1992314:
[u][i][b][flash=200,200][url][i ...
看看mybatis 源代码 -
尼古拉斯.fwp:
图片根本就不出来好吧。。。。。。
Android文件图片上传的详细讲解(一)HTTP multipart/form-data 上传报文格式实现手机端上传 -
ln94223:
第一个应该用排它网关吧 怎么是并行网关, 并行网关是所有exe ...
工作流Activiti的学习总结(八)Activiti自动执行的应用 -
ZY199266:
获取不到任何消息信息,请问这是什么原因呢?
ActiveMQ 通过JMX监控Connection,Queue,Topic的信息 -
xiaoyao霄:
DestinationSourceMonitor 报错 应该导 ...
ActiveMQ 通过JMX监控Connection,Queue,Topic的信息
本篇主要通过实例来讲述Struts2中各种各样的参数传递。这个参数传递的过程主要指数据从View层传递到Control层时Struts2的工作方式。根据前两篇文章的知识,我们知道,Struts2完成参数传递处理工作的基础是OGNL和ValueStack。而在这个过程中,我也把Struts2所要做的工作大致归纳为两个方面:
1. 对OGNL操作进行封装,完成OGNL表达式所表示的值到Java对象的值传递机制
2. 在参数传递的过程中,做恰当的类型转化,保证页面上的字符串能够转化成各式各样的Java对象
接下来,通过四个不同的角度,来具体讲述Struts2在这两个方面的工作。
最简单的参数传递
使用OGNL的最基本的功能,就能完成普通的Java对象的赋值工作。Struts2在内部已经完成了OGNL的基本封装。这些封装包括对OGNL表达式到Java对象的赋值机制,以及对基本的Java类型的类型转化支持。这些基本类型包括String、Number(以及其基本类型int、float、double等)、Boolean(boolean)、数组、Class、Date等类型。
在这里我想额外强调的是XWork对JDK5.0中的Enum类型和Date类型的支持。
Enum类型
枚举类型是JDK5.0引入的新特性。枚举类型也能解决很多实际问题,是J2EE编程中的最佳实践之一。XWork中,有一个专门的EnumTypeConverter负责对Enum类型的数据进行转化。
- public class EnumTypeConverter extends DefaultTypeConverter {
- /**
- * Converts the given object to a given type. How this is to be done is implemented in toClass. The OGNL context, o
- * and toClass are given. This method should be able to handle conversion in general without any context or object
- * specified.
- *
- * @param context - OGNL context under which the conversion is being done
- * @param o - the object to be converted
- * @param toClass - the class that contains the code to convert to enumeration
- * @return Converted value of type declared in toClass or TypeConverter.NoConversionPossible to indicate that the
- * conversion was not possible.
- */
- public Object convertValue(Map context, Object o, Class toClass) {
- if (o instanceof String[]) {
- return convertFromString(((String[]) o)[0], toClass);
- } else if (o instanceof String) {
- return convertFromString((String) o, toClass);
- }
- return super.convertValue(context, o, toClass);
- }
- /**
- * Converts one or more String values to the specified class.
- * @param value - the String values to be converted, such as those submitted from an HTML form
- * @param toClass - the class to convert to
- * @return the converted object
- */
- public java.lang.Enum convertFromString(String value, Class toClass) {
- return Enum.valueOf(toClass, value);
- }
- }
有了这个类,我们就可以比较轻松的对枚举类型进行数据赋值了。
通过上面的代码,就完成了对枚举类型的赋值。不过这里有一点需要特别指出:那就是XWork在XWork-2.1.X的版本之前,枚举类型不被默认支持。如果你需要获得枚举类型的自动赋值,还需要增加一个配置文件xwork-conversion.properties到classpath下:
java.lang.Enum=com.opensymphony.xwork2.util.EnumTypeConverter
对于使用新的版本的XWork的朋友,则不需要增加这个配置文件。
Array、List、Map等容器类型的参数传递 具体来说,upload的拦截器,必须在params的拦截器之前
除了简单的基于JavaBean方式的参数传递支持,Struts2还支持对Array、List、Map等容器类型的数据结构做数据赋值。不过历史一路走来,XWork针对容器类型的数据赋值一直有变化,让我们慢慢解读这些变化,从而也来看看编程思路是如何改变的。
1. 2004年,XWork-1.0.X的年代
当时XWork所支持的针对容器的数据赋值还比较土。这方面moxie在论坛上有一篇文章专门来讲述:http://www.iteye.com/topic/8770。
总的来说,那个年代对于容器的数据赋值,需要依赖于XWork的辅助类。我们可以看到,如果你要对List进行赋值,需要新建一个XWorkList的实现类,并把所需要进行数据赋值的Java类传递到XWorkList的构造函数中。而对Map等对象的赋值,也同理可得。
这种数据赋值的方式的优缺点都非常明显。优点在于简单,你不需要额外定义任何其他的内容,而是直接使用XWork的辅助类来实现类型转化。缺点在于扩展性很弱,很明显,针对某一个具体的容器,就需要一个XWork的实现类,List有XWorkList对应,Map有XWorkMap对应。甚至在那个时候,还没有Set的支持,因为没有XWorkSet的实现。所以使用这种方式,在扩展性方面需要遭受严重的考验。
2. 2006年,XWork-2.0.X的年代
也许是XWork团队看到了扩展性上的问题,所以在XWork和Webwork同时升级以后,采用了新的方式来处理容器赋值。而此时,Javaeye上也涌现出了新的文章,Tin同学对新的方式做了详细的表述:http://www.iteye.com/topic/17939。
不过这个新的整合方式似乎并不被大家所看好。
这种新的整合方式,实际上只是解决了针对容器赋值,不需要依赖XWork的辅助类这样的一个问题,不过其付出的代价,却是多了一个配置文件,这也让人非常郁闷。好好的类型转化,平白无故多出了一个同package下的配置文件,这也无形中增加了编程的复杂度。
3. 现在,拥抱了泛型和Annotation的年代
实际上,在XWork发展到XWork-2.0.X之后,也开始注重了对泛型和Annotation的支持。所以,容器类型的转化,我们也可以尝试一下使用JDK的新特性来进行,当然这也是目前最为推荐的做法。
下面分别给出使用泛型和Annotation的代码示例:
由此可见,泛型和Annotation,在一定程度上,还是可以简化我们很多工作的。
文件上传
文件上传其实也是参数传递的一种,所以从方案上来讲,Struts2同样使用了一个拦截器来处理。而这个拦截器,同样来自于原来的Webwork,基本上没有做什么很大的改变。有关这个拦截器的详细内容,我们也留一个悬念,在后续章节中详细讲解。目前,你只要知晓,这个拦截器能帮助你完成一切文件上传相关的机制。
早在2005年,Quake Wang就对Webwork的文件上传机制有了详细的讲解:http://www.iteye.com/topic/10697
在这里我简单小结一下在进行文件上传时的三大要点:
1. 在配置文件上传时,拦截器的顺序非常关键
2. 拦截器额外提供了一些额外的文件信息
FileName: 实际的文件名
在上面的action例子里, 那么有uploadFilesContentType和uploadFilesFileName这2个属性, 也能够被自动绑定
3. 拦截器提供的文件上传功能,你得到的是一个临时文件
评论
但是通常都是使用泛型比多.支持一下
这种情况在struts2.x注解时,采用注解使用比较好。
但是通常都是使用泛型比多.支持一下
发表评论
-
整合Struts2+JasperReport Web报表应用示例
2013-04-22 13:56 2289整合Struts2+JasperReport Web报表应用 ... -
Struts2+JFreeChart制作图标
2011-11-26 13:52 2101前言 关于Struts2入门以及提高等在这里就不介绍了 ... -
Struts2.0中获取项目的上下文的两种方式
2010-01-19 13:42 3288Struts2.0中获取项目的上下文的两种方式 方 ... -
Struts2.0中通过OGNL访问常量必须注意的一个配置
2010-01-19 13:34 2629在项目的开始阶段,由于没有学习Struts2.0中OGNL的 ... -
Struts2.0 中值栈的实现以及解析OGNL以及值堆栈的原理
2010-01-14 13:19 4669OGNL的值栈实现的堆栈动态OGNL的表达式。何时设置 ... -
关于Struts2.0 标签中采用%{}%的处理原理
2010-01-14 13:08 2711项目中采用struts2.0 ... -
struts 2配置文件解说
2010-01-13 13:09 1402struts 2框架有两个核心配置文件: struts.xml ... -
struts2.0的ognl表达式 研究
2010-01-13 13:05 2660OGNL —— 完美的催化剂 为了解决数据从 ... -
Struts2和OGNL
2010-01-13 10:57 2067OGNL是XWork引入的一个非常有效的数据处 ... -
Struts2.0的不同版本针对枚举转换器应用
2010-01-13 10:39 2845Struts2.0 的Apache项目中从Strut ... -
Struts2.0 中支持的基本数据类的转换的类XWorkBasicConverter的分析
2010-01-13 10:25 4595项目中Struts2.1.6不支持基本数据类型的自动转换, ... -
Struts2.0加載配置順序
2009-12-28 13:33 2516Struts2.0默認的加载顺序: Constants ... -
Struts2.0的IOC方式注入SessionAware, CookiesAware
2009-12-10 19:59 4002在Action实现相应的 private Map<S ... -
Struts2工作原理和框架扩展点
2009-12-08 18:49 3881上图来源于Struts2官方站点,是Struts ... -
Struts2.0 和JQuery實現AjaX的調用功能
2009-11-27 12:47 2355开发过程忽略: 重点注意点解释以下: (1)将Ac ... -
在Struts2.0中批量操作(update Or Add)的實現和注意點
2009-11-15 16:41 3050在項目中,需要針對一批数据进行或添加或着修改操作。使用S ... -
在Struts2.0 中将Enum对象与组件的绑定
2009-08-19 13:05 4169在项目使用一个下拉框绑定或单选或复选框的绑定的应用: ... -
struts2 标签针对字符串截取的处理
2009-06-18 13:16 6202struts2 标签截取字符串的功能 <td> ... -
Struts2中 用OGNL表达式
2009-06-18 12:40 3481具体记录如下:<s:set ... -
struts2的学习(复杂的遍历标签)
2009-06-18 12:36 2399例如我有个此结构的map ...
相关推荐
总的来说,Struts2提供了多种方式来向结果传递参数,这使得它在处理复杂的业务逻辑和页面跳转时具有高度的可定制性。根据项目的具体需求,选择合适的方法可以提高代码的可维护性和效率。在实践中,结合使用不同的...
### Struts2中的参数传递 #### 一、概述 在Web开发中,Struts2框架因其灵活、高效的特点被广泛采用。Struts2的核心之一就是它对于参数传递的支持能力,这一点主要依赖于OGNL(Object-Graph Navigation Language)...
在本场景中,我们将探讨如何使用AJAX来传递JSON数组,并在Struts2的Action中接收和处理这些数据。 首先,JSON(JavaScript Object Notation)是一种轻量级的数据交换格式,它易于人阅读和编写,同时也易于机器解析...
Struts2作为一款流行的Java Web框架,为开发者提供了丰富的功能,其中包括通过方法上传递参数的能力。这种方法使得在处理用户请求时更加灵活,不需要依赖特定的注解,而是直接通过参数名来获取界面传递的参数信息。...
### Struts2中Action间的参数传递方法 在Struts2框架中,经常需要实现Action之间的跳转,并在跳转过程中传递必要的参数。这种需求在实际开发中非常常见,尤其是在需要根据用户的不同操作来调用不同的业务逻辑时。...
2. **传递参数**:在Struts2中,可以通过不同的方式传递参数,如表单参数、URL参数、Action上下文参数等。例如,在`main.jsp`中可以使用表单元素将数据提交到服务器,然后在Action类中通过`@ActionParams`注解或者...
2. 在 JSP 页面中,使用表单或其他方式将参数传递给 Action。 3. 在 Action 中,使用设定的属性接收参数,例如 `userName`。 例如,在 Action 中定义了 `userName` 属性,可以在 JSP 页面中使用 `user1!add?...
在Struts2中,接收参数是常见的操作,这涉及到用户通过HTTP请求传递的数据如何被框架捕获和处理。这篇博客文章可能深入探讨了Struts2如何在Action类中获取和管理这些参数。 首先,Struts2的核心是DispatcherServlet...
在处理用户请求时,Struts2允许开发者通过Action类来接收和处理参数,包括中文参数。当我们需要通过POST方法提交包含中文字符的数据时,可能会遇到编码问题,因为HTTP请求默认使用的是ASCII编码,而中文字符需要UTF-...
本篇文章将深入探讨Struts1.x和Struts2.x在向Action中填充JSP参数的原理。 Struts1.x的工作原理: Struts1的核心是ActionServlet,它是一个实现了Servlet接口的控制器。当用户发起HTTP请求时,请求会被Dispatcher...
在Struts2框架中,参数传递是连接前端页面与后台Action类的重要环节,使得用户交互的数据能够被正确处理。在本文中,我们将深入探讨几种在Struts2中进行参数传递的方法。 1. **Action中直接参数法** 这是最基本的...
5. **OGNL(Object-Graph Navigation Language)**:Struts2使用OGNL作为默认表达式语言,用于在Action和视图之间传递数据。通过OGNL,可以在JSP页面中直接访问Action中的属性,或者在Action中动态设置模型数据。 6. ...
“Struts2.3.1.2_API.chm”文档包含了Struts2框架的详细API,其中涵盖了各个主要类和接口的解释、方法签名、参数说明以及返回值类型。开发者可以通过查阅此文档,快速查找特定功能的实现方式,例如ActionSupport类,...
本篇文章将深入探讨Struts2中Action接收参数的多种方式,以及相关源码解析。 首先,最常见的接收参数方式是通过方法签名直接接收。例如,如果在JSP页面上有这样一个表单: ```jsp 提交" /> ``` 对应的Action...
7. 请求与响应的处理,包括参数传递和数据封装 8. 实例演示:使用Struts2+Jquery+Ajax实现动态加载数据或表单验证 "struts2 jar"文件包含了Struts2框架的核心库,可能包括struts2-core、struts2-convention、struts...
### Struts2 接受参数的几种方式 #### 第一种方式:直接在 Action 中设置变量 这种方式是最直接的参数接收方式。当从前端传递参数到后端时,我们需要确保 Action 类中有与这些参数名称相匹配的变量。例如,如果...
### Struts2 学习重点知识点总结 #### 一、Struts2 概念与架构 **1.1 Struts2 简介** - **定义**:Struts2 是 Apache 组织提供的一个基于 MVC 架构模式的开源 Web 应用框架。 - **核心**:Struts2 的核心其实是 ...
这是根据uploadify3 2结合struts2搭建的文件上传环境 可以直接导入eclipse运行 每步实现基本都加了注释 以下是我碰到的问题: 1 判断session是否失效 本实例没测试这个问题 但在工作项目中碰到了 但原因在这里...
4. **OGNL(Object-Graph Navigation Language)**:OGNL是Struts2中的默认表达式语言,用于在视图和模型之间传递数据。它允许开发者在JSP或其他视图层中直接访问Action对象的属性,或者设置模型数据。例如,`${user...
Struts2的安全漏洞通常涉及OGNL(Object-Graph Navigation Language),这是一个强大的表达式语言,用于在Struts2中传递数据和执行逻辑。例如,S2-045、S2-052、S2-063等都是知名的OGNL注入漏洞,允许攻击者通过精心...