(小莫同学对本文亦有贡献)
上一篇里提到一个JODD,今儿个就说说它。
先列举一下我对JODD的基本了解:
1.估计国内大多数知道JODD的JSPer的都是“惊其艳”于SpringSide1;
2.JODD里面其实有很多工具,不过大家最多还是用它来绑定页面数据;
3.SpringSide2、3里不用了,还不知道为啥;
说到数据绑定,肯定得先说Struts的FormBean,这玩意儿真是想说爱你不容易,随便整个系统都得千儿八百个页面,页面也是千奇百怪,变来变去,谁那么多功夫写FormBean捏?
好了,现在分析一下JODD的绑定功能
1.数据获取-BeanUtil.load(Object bean, Object source)
Source的数据类型可以是:
1. Map
2. MultipartRequest (文件上传)
3. MultipartRequestWrapper(文件上传)
4. HttpServletRequest
5. ResultSet
6. ServletContext
7. HttpSession
针对 BeanUtil.load要求表单域名必须与Bean属性名完全一致做以下分析:
a.一般说来,BeanUtil.load对于一个单一Bean的表单数据获取,基本足够了;
所以PT项目中的单Bean管理流程中就使用了它。
b. 对于内含复杂逻辑的情况,可以在页面用JS实现:
举例:
》用户密码的修改其实需要三个密码框:原密码、新密码、确认密码,
表单提交前将确认无误的新密码框value赋值给原密码;
》某属性flag实为根据十个表单域的值而确定,可以在表单设置隐藏域flag,表单提交前以JS方式给其赋值。
c.对于非常复杂的页面
比如Order(订单)对象里有个GoodsList(商品列表),按照现有开发规范,表单域的命名为“表名”+“字段名”,那BeanUtil.load就搞不定了。
还好在我们原框架包中发现了ParamUtils.generateObject(Class cl, String inputPrefix)(原是个半成品,修正了一下,就可以用了):
Class cl:要生成的Bean原类(**Dto.getClass())
String inputPrefix:表单域前缀(我们系统一般就是表名了)
2.数据展示-<jodd:form beans="bean1,bean2,bean3" scopes="session,request,request">
JODD里Bean的展示是最值得称道的,想想我最早学JSP时,写一个select展示时,要写一堆类似下面的代码
<option <%=if("1".equals(**))?"selected":""%> value="1">1</option>
<option <%=if("2".equals(**))?"selected":""%> value="2">2</option>
呵呵,现在有了jodd:form,新增页面和编辑(修改)页面可以完全用一个页面了。
因此,正是有了JODD FORM,让我们的JSP开发变得更加轻松。
灵活运用它,让我们做个“懒人”吧:)
关于JODD的信息源:
1.JODD的官网请见 http://jodd.sourceforge.net/,jodd.jar可以在里面下载
2.Calvin-江南白衣提到JODD的原文 http://www.blogjava.net/calvin/archive/2005/08/24/10914.html
3.这儿一篇不错的介绍JODD使用的帖子,人家好不容易写出来的,我直接引网址啦:)
http://czcoding.blogbus.com/logs/3898327.html
最后补充一下“Jodd Form taglib 简介”, 以下出自 SpringSide1使用手册
Jodd Form的使用极其简单,因为太简单了,才会名不见经传而被我们选用,让我们罔顾各大Framework的Form Tag.
他只要把<form>的头尾以<jodd:form bean= "mybean">包住即可,就会自动绑定mybean的所有同名属性到普通html标记--input, selectbox, checkbox,radiobox.....在这些input框里不用再写任何代码
可见,它的好处一是节约代码,二是保留了html版的form tag, 不需要用一套taglib来代替
而且支持内嵌对象的绑定,如book.category.name。
比那些需要使用非纯html标记的<ww:input>,逐个绑定input框,select框的Form Tag,虽减了些许灵活性,但实在方便得太厉害。
如果属性来自于request,而不是某个java bean,写<jodd:form bean= "request">
jodd采用的是普通的bean反射,调用所有属性的toString()函数。
注意,jodd在html tag不含value="xxx"属性时才会自动绑定。如果某个input框你不希望jodd自动绑定,或者默认的toString()不能满足要求时,可以手工为该input框写上 value="xxxx",jodd看到你已经定义了属性值,就会自动绕开。