- 浏览: 227120 次
- 性别:
- 来自: 深圳
文章分类
- 全部博客 (96)
- J2EE (11)
- Spring (11)
- Oracle (3)
- Struts2 (7)
- Hibernate (1)
- Struts1.x (0)
- 职场内外 (1)
- Java (31)
- JSP基础 (3)
- 英语点滴 (1)
- Linux (2)
- JavaScript (12)
- ANT (5)
- 计算机基础知识 (2)
- 开发工具 (4)
- Java网络编程 (3)
- Swing (2)
- JVM (3)
- 网络协议 (3)
- 算法与数据结构 (5)
- Ext JS (1)
- Spring JUnit (1)
- XML (1)
- 搜索引擎 (1)
- NoSQL (1)
- 搜索(引擎) Solr Lucene (2)
- UML (1)
- Design Pattern (1)
最新评论
-
chokee:
struts2如何获取页面参数 -
mengfei86:
顶顶!
jstat的使用方法 -- 分析JVM的使用情况 -
yifzeng:
感谢楼上两位!!!
Struts2 验证框架不起作用的几种可能[转] -
xianqi_h:
如果所要用的形容词是几个,而且是上述所列的归类之外的词,如: ...
英语形容词的排列顺序 -- 重点记忆 -
skzr.org:
fixbug——在IE7下面:IE无法打开站点XXXX,无法操 ...
struts2开发中ie无法打开XXX站点 已终止操作
1. 前面讲的自定义类型转换器是基于 OGNL 的 DefaultTypeConverter 类并实现 convertValue() 方法,两个转换方向的逻辑都写在这一个方法中。而 Struts 2 为我们提供了一个 DefaultTypeConverter 的抽象子类 StrutsTypeConverter 来继承,并实现其中两个抽象方法 convertFromString() 和 convertToString(),这要简单易懂。对比 Struts 1 的转换器是要实现 org.apache.commons.beanutils.Converter 接口,以及它的 convert() 方法的。
2. 注意,上面的 convertFromString() 的第二个参数是一个字符串数组,所以可为请求的数组(如请求串为 ?u=1&u=2&u=3)定义转换器,Action 中相应的属性就应为数组或 List,这一方法的返回值也该为相应的类型(数组或List,要通过第三个参数 toClass 来判断是返回数组还是 List 了)。
3. 字符串(如 "user,pass") 转换成 Action 中的复合属性(如 User user) 前面是自定了类型转换器。除此之外,还可以 Struts 2 内置的 OGNL 表达式,更简单的转换,不用写转换器。例如,你的 Action 有属性 User user,只要在 jsp 页面的输入框命名为 user.name 和 user.pass 即可:
<input type="text" name="user.name"/> 或用标签:<s:textfield name="user.name" label="用户名"/>
<input type="text" name="user.pass"/> 或用标签:<s:textfield name="user.pass" label="密 码"/>
提交后,Struts 2 即会帮你构造 User 对象(user = new User()),并赋上属性值(user.setName(),user.setPass()),最后 user 对象赋给 Action (xxxAction.setUser(user))。所以要明白有三个必备的东西:
1) User 要用一个默认构造方法 2) User 要有对应 name 和 pass 的设置方法 setName() 和 setPass() 3) Action 要有 user 属性的设置方法 setUser(),getUser() 也是要的,至于功用后面能看到。
其实在 Struts 1 中也有这种用法,不过那是在 BeanUtils 中实现的。
4. 如果 Action 中的属性是 Map<String, User> users; 那么与此对应的表单写法就是:(用标签来写)
<s:textfield name="users['one'].name" label="第一个用户名"/>
<s:textfield name="users['one'].name" label="第一个密码"/>
<s:textfield name="users['two'].name" label="第二个用户名"/>
<s:textfield name="users['two'].name" label="第二个密码"/>
应该不难想像,这个表单提交后,users 中存储的是什么吧!
如果是对于 Action 中的 List 属性,List<User> users; 那么与此对应的表单写法就是:
<s:textfield name="users[0].name" label="第一个用户名"/>
<s:textfield name="users[0].name" label="第一个密码"/>
<s:textfield name="users[1].name" label="第二个用户名"/>
<s:textfield name="users[1].name" label="第二个密码"/>
5. 归纳前面3、4、5 几点,Struts2 的 Action 在设置每一个属性时都会 get 一下相应的元素 getUser() 或 getUsers()。
对于 3,在设置 user.name 和 user.pass 之前都会 getUser() 来获取 user 属性,如果 user 为 null 就构造 User 对象,然后设置相应的值。假如声明的时候就已构造好 User 对象,如有其他属性如 age=18,并不会被覆盖。
对于 4 和 5,也是在设置每一个属性前都会调用 getUsers() 判断声明的 Map 或 List 是否为 null,是则构造对应的 HashMap 或 ArrayList() 对象;接着根据 Key 或下标去获取相应位置的元素,如果不存在或为 null 则构造之,然后设置相应属性值。由此可见,若某元素的某个属性未重设值则保留原值,若原来Map或List 已有多个元素,也只会改变到 Key 或索引所对应元素的某个属性。对于 List 有可能出现跳空的情况,如页面只有索引不从 0 开始
<s:textfield name="users[1].name" label="第二个用户名"/>
<s:textfield name="users[1].name" label="第二个密码"/>
提交后就会发现,List 属性 users 的第一个元素为 null 了。同时如果尝试一下,你就会发现这里的 List 不能替代为数组 User[] users。
这种样法,可在 Struts 1 中实现,但要略施些小节,见我的另一篇日志:提交多行数据到Struts的ActionForm的List属性中 ,行为表现完全一致,只是换到 Struts 2 中一切都不用自己操心。
6. 看第四点,Action 之所以知道该构造什么类型的元素完全是由泛型告诉它的。如果不用泛型(比如用的是 JDK1.4),Action 中仅仅声明的是 Map users; 或 List users; Action 该如何处理呢?它也不知道,只能够帮你构造出无类型的 HashMap 和 ArrayList(),填充不了元素。这就必须在局部类型转换的配置文件中来指定集合元素的类型。例如 Action 为 LoginAction,就要在 LoginAction-conversion.properties 中声明了,格式如下:
#Element_xxx=复合类型,基中 Element 是固定的,xxx 为属性名
#下面表示为 List 属性 users 的元素为 com.unmi.vo.User 类型
Element_users=com.unmi.vo.User
对于 Map,须分别指定 Key 的类型和 Value 的类型
#Key_xxx=复合类型,基中 Key 是固定的,xxx 为 map 属性名,下面写成 String 都不行的
Key_users=java.lang.String
指定 Map 的 Value 的类型与指定 List 元素类型是一样的
Element_users=com.unmi.vo.User
难 怪 Struts 2 要与 1.5 以上 JDK 使用,泛型比配置来得方便。如果硬要用 1.4 JDK,就只有配置类型了,会多很多 conversion 文件的。在 提交多行数据到Struts的ActionForm的List属性中 中类型的确定由 AutoArrayList() 的构造参数完成。
7. Set 是无序集合,所以无法像 List 那样用数字下标来访问,幸好 Struts 2 可为其指定索引属性。例如,LoginAction 声明为 Set users; (这里好像用泛型只能省得了 Element_users 说明,KeyProperty_users 少不了)。则需在 LoginAction-conversion.properties 中写下:
#指定 Set 的元素类型
Element_users=com.unmi.vo.User
#KeyProperty_集合属性名=集合元素的索引属性名,这里为 User 的 name 属性
KeyProperty_users=name
此时提交页面这么写,最好提交前能根据输入的用户名自动修动输入框的 name。
用户名: <input name="users('scott').name"/>
密 码: <input name="users('scott').pass"/>
显示的时候页面可用标签
用户名: <s:property value="users('scott').name"/>
密 码: <s:property value="users('scott').pass"/>
注意前面,访问 Set 元素是用的圆括号,而不同于 Map、List、数组是用中括号。我想一般也犯不着非要用 Set 而不用 List,Struts 2 中用 Set 比在 Struts 1 中似乎还麻烦。
8. Struts 2 内建了一批转换器:boolean、char、int、long、float、double 和它们的包装类型;Date,日期格式使用请求所在 Locale 的 SHORT 格式;数组,默认元素为字符串,其他类型则要转换每一个元素?(好像是一次性转换完成的); 集合,默认元素为字符串 XWorkList(String.class, Object[]),其他如 List<Integer> ids,类型为 XWorkList(Integer.class, Object[]),XWorkList 继承自 ArrayList。
9. 类型转换出错由 Struts 来帮你处理,在默认拦截器栈中提供了 conversionError 拦截器,不用你写一点代码逻辑。conversionError 在出错时将错误封装成 fieldError,并放在 ActionContext 中。你所要做的就是遵循它的规则,1) 你的 Action 要继承自 ActionSupport,2)在 struts.xml 中声明名为 "input" 的 result,出错时会在 input 逻辑视图显示信息。3)尽量用标签来写输入域(如<s:textfield name="number" label="数量"/>),这样转换出错后,就会像校验失败一样把错误信息显示在每个输入框上面(视模板而定),否则要手工用 <s:fielderror/> 输出在某处。
默认时输出错误信息为(比如是属性 number,输入的是字符串时):Invalid field value for field "number".你可以改变默认显示,在全局国际化资源文件中加上xwork.default.invalid.fieldvalue={0}字段类型转换失败!。在某些时候,可能还需要对特定字段指定特别的提示信息,那么在名为 ActionName.properties 的局部资源文件中加上 invalid.fieldvalue.属性名=提示信息 (如 invalid.fieldvalue.number=数量格式错误)
10. 最后是集合属性转换错误时的显示,对于页面中的同名输入框,有多个出错误,如果手工用 <s:fieldError/> 只会显示一条错误,但要是输入页是用标签(如<s:textfield name="number" label="数量"/>),仍会在每一个出错的输入框上都提示。至此类型转换的内容也就完结了。
发表评论
-
运行mvn eclipse:eclipse 报插件不存在或者版本不对错误
2013-07-26 20:59 1150我的maven版本是2.2.1,当我使用mvn eclip ... -
eclipse 安装velocity插件
2013-07-14 21:09 894安装velocity的eclipse插件步骤: ... -
java日志,需要知道的几件事 -- 转
2013-03-07 14:16 887http://blog.csdn.net/su ... -
构建高可扩Web架构和分布式系统实战 -- 转
2013-01-24 11:34 995http://www.csdn.net/articl ... -
Java中的ReentrantLock和synchronized两种锁定机制的对比 -- 转
2013-01-07 09:45 1170阅读本文,使我从对比的角度重新审视了两种锁的机制。 分享 ... -
ant jsch.jar -- 一个异常及解决方法
2012-12-11 14:49 3422运行build.xml出现异常: Cause: Cou ... -
struts2 拦截器 -- 转
2012-11-20 15:46 841深入认识struts2拦截器(甚至是struts2的ac ... -
web.xml文件中配置(servlet, spring, filter, listenr)的加载顺序 (转)
2012-11-20 14:44 834servlet: 项目的运 ... -
spring 事务架构 - Spring Transaction Architecture
2012-10-17 09:15 1436Spring Transaction Architecture ... -
全局事务与本地事务的区别应用
2012-10-15 15:44 1291http://blog.csdn.net/sunitjy ... -
搜索服务器Solr部署使用
2012-09-21 10:56 982本文肤浅探讨MySQL + Solr + Solr ... -
JAVA - DOM4J - XML 转化成String字串
2012-09-07 10:20 5319import org.dom4j.Document; imp ... -
JVM "Out of swap space"错误常见的原因
2012-08-01 15:31 1158Out of swap space error general ... -
Java中static、final用法小结
2012-05-18 14:02 1106一、final 1.final变量: 当 ... -
ConcurrentHashMap 详解
2012-05-15 15:03 0java.util.concurrent.Concurrent ... -
JAVA泛型简析
2012-05-11 15:13 1073泛型是JDK1.5支持的新功 ... -
Struts2的对象工厂(ObjectFactory)及其在Struts2与Spring整合中的作用
2012-05-08 20:32 1446ObjectFactory,是xwork中很重要的一个类,是产 ... -
Ant之build.xml详解
2012-05-08 14:55 1143Ant的概念 可能有些读 ... -
hashcode 与 equals 方法详解 --- 透彻,详尽
2012-01-15 20:41 0如果函数返回类型不同,子类的同名函数不能继承父类的同名函数 ... -
Java Hash算法大全
2012-01-15 20:35 1428/*** Hash算法大全<br>* 推荐使用FN ...
相关推荐
服务器可以接收到的来自用户的数据只能是字符串或者是字符串数组,而在服务器上的对象中 ,这些数据往往有多种不同的类型,如日期(Date) 整数(int) 浮点数... 要实现 上述的转换 ,Struts2中 提供了 converter。
转换器(Converter),struts 实例学习,一步步教你如何实现一个示例
05 转换器(Converter)——Struts 2.0中的魔术师 06 在Struts 2.0中实现表单数据校验(Validation) 07 Struts 2的基石——拦截器(Interceptor) 08 在Struts 2中实现IoC 09 在Struts 2中实现文件上传 10 在Struts...
05 转换器(Converter)——Struts 2.0中的魔术师 06 在Struts 2.0中实现表单数据校验(Validation) 07 Struts 2的基石——拦截器(Interceptor) 08 在Struts 2中实现IoC 09 在Struts 2中实现文件上传 10 在Struts...
·Struts2.0转换器(Converter) ·Struts 2.0中实现表单数据校验(Validation) ·拦截器(Interceptor) ·Struts 2中实现IoC ·Struts 2中实现文件上传 ·Struts 2中的OGNL ·Strus 2的新表单标签的使用 ...
转换器(Converter)——Struts 2.0中的魔术师 在Struts 2.0中实现表单数据校验(Validation) Struts 2的基石——拦截器(Interceptor) 在Struts 2中实现IoC 在Struts 2中实现文件上传 在Struts 2中实现CRUD ...
05 转换器(Converter)——Struts 2.0中的魔术师 06 在Struts 2.0中实现表单数据校验(Validation) 07 Struts 2的基石——拦截器(Interceptor) 08 在Struts 2中实现IoC 09 在Struts 2中实现文件上传 10 在Struts...
example6 : 转换器(Converter)——Struts 2_0中的魔术师
4 1.3.2. 受控目录 5 2. 入门例子 5 2.1. 项目 5 2.2. 在WEB.XML中,配置FILTERDISPATCHER过滤器 6 2.3. 配置STRUTS.PROPERTIES 6 2.4. 编写一个简单的ACTION类 7 2.5. STRUTS.XML配置文件 8...
1-helloworld 2-常用标签 3-action 4-I18N国际化 5-转换器Converter 6-表单数据验证 ... 15-AJAX
NULL 博文链接:https://corrinejtt.iteye.com/blog/548160
尚硅谷stuts2练习中的自定义类型转换器练习
struts2的小例子,包括切换语言,converter(转换器),CRUD(新增,读取,更新,删除),文件上传,interceptor(拦截器),OGNL(Object-Graph Navigation Language),springIOC,validation(验证框架)
1.为Struts 2.0做好准备 2.常用的Struts 2.0的标志(Tag)介绍 3.Struts 2.0的Action讲解 ...5.转换器(Converter)——Struts 2.0中的魔术师 在6.Struts 2.0中实现表单数据校验(Validation) 7....... 8.......
converter 转换器 i18n struts2 spring MVC 拦截器 interceptor 过滤器 filter web.xml implements filter filterchain arg2.doFilter(req,resp); 监听器 servlet application /session /request 6/8 个 ...
8.3.3 关联转换器与UI Component实例 8.3.4 转换器的生命周期 8.3.5 定制转换器 8.4 Faces验证系统 8.4.1 Long Range Validator 8.4.2 Double Range Validator 8.4.3 Length Validator 8.4.4 必需的工具Required ...
8.3.3 关联转换器与UI Component实例 8.3.4 转换器的生命周期 8.3.5 定制转换器 8.4 Faces验证系统 8.4.1 Long Range Validator 8.4.2 Double Range Validator 8.4.3 Length Validator 8.4.4 必需的工具Required ...