Welcome 微信登录

首页 / 软件开发 / JAVA / Unmi的Struts2学习笔记(七)

Unmi的Struts2学习笔记(七)2011-09-04 Unmi.cc 隔叶黄莺小时候,大人们的谆谆教诲:做人要诚实。并真以此为做人原则。长大后才知 道何谓社会。譬如530,再如艳照门,风声乍起之时,有人辟谣;直东窗事发后, 道貌岸然者有之、恬不知耻者亦有之。原本成功就不属于规矩之人。纵观,无玄 武门之血腥,何来一代宗皇;老毛若不有理而造反,一味守规矩,或为一介书匠 耳。雅各一碗红豆汤便谋得以扫的长子权,再行骗去亚伯拉罕的祝福,并顺理成 章让耶和华与他同在,可见上帝之“贤明”?。高等教育中有一句,顺利的是骗 子,倒霉的是傻子,我是?不还有企业家的原罪吗?有时竟被社会所放任?

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="第二个密码"/>