一Struts中引入ActionForm类的意义与缺陷
在Struts应用程序中ActionForm是一个很重要的概念它的主要功能就是为Action的操作提供与客户表单相映射的数据(如果在客户指定的情况下还包括对数据进行校验)Action根据业务逻辑的需要对数据状态进行修改在改变系统状态后ActionForm则自动的回写新的数据状态并保持程序员对JSP与ActionForm Bean的对应关系通常感到很迷惑JSP与ActionForm到底是:还是N:对此Struts本身对此并没有提出自己的观点无论是一对一还是多对一Struts本身并不关心它都能很好得工作Struts在它的开发文档中指出对于较小规模的开发开发人员可以根据自己的需要每个模块只写一个ActionForm Bean甚至整个应用程序只写一个ActionForm Bean当然Struts也不反对每个ActionForm Bean只对应一个JSP他们之间的对应关系由开发人员自己决定
在我看来正如Entity EJB对JEE的重大贡献一样Entity EJB使得程序员对二维关系数据库的存取对象化了程序员可以使用Set 或者Get等面向对象的方法来操纵关系数据库的数据而ActionForm也使得程序员对网页的数据存取奇迹般的对象化了程序员同样也可以使用Set 或者Get等面向对象的方法存取网页上的数据这是一个开发模式方式上的重大转变基于此我个人认为ActionForm与JSP即VIEW层的关系最好是一对一的关系这样在理解上会更清晰一些但是这样也会带来一个很现实的问题在一个应用程序中也许有非常多得JSP页面如果每个ActionForm 都只对应一个JSP页面那么系统的Java代码就会急剧膨胀起来而且每个ActionForm都是只有很简单的Set或者Get方法存取数据那么如何简化Struts应用程序的开发呢?
在Struts 中Struts引入了DynaActionForm和Dyna Bean试图解决这个问题在我看来DynaActionForm的引入破坏了对网页存取对象化的概念使开发人员重新回到了使用HashTableMapCollectionArrayList等集合对象来实现对数据进行存取的老路上来虽然应用程序的灵活性大大增加了但是代码的可读性也大大降低了开发人员之间的交流难度也增加了
在传统的应用程序对ActionForm Bean的访问中我们通常都写成如下的形式
Connection conn=DriverManagergetConnection(JDBC URL );
sql= select *from some tables ;
PreparedStatement stmt = connprepareStatement(sql);
ResultSet rs = stmtexecuteQuery();
ArrayList array=new ArrayList();
while (rsnext()) {
AActionForm actionForm =new AActionForm ();
actionFormsetId(rsgetString(Id));
actionFormsetName(rsgetString(Name));
arrayadd(actionForm);
}
在Action 的Execute方法中我们 把这个集合用requestsetAttribute(array array)存储起来然后在JSP页面中我们用iterate Tag把数据循环现实出来代码通常都是这个样子
<logic:present name= array scope=request>
<logic:iterate name= array id= array
type=combhskywebisGoods>
<tr align=center>
<td class=table>
<bean:write name= array property=goodsid/>
</td>
<td class=table>
<bean:write name= array property=goodsname/>
</td>
</tr>
</logic:iterate>
</logic:present>
在Struts中对数据的访问和显示的写法通常都是很固定的在VIEW层我们是没有办法简化自己的代码的在Action层其写法通常也很固定只是做一个页面的跳转商业逻辑和对数据得访问通常都是放在JavaBean中那么在此我提出一种运用类反射的机制使应用程序对ActionForm Bean的赋值自动化即应用程序通过一个简单的接口使用一个通用的方法就可以完成对ActionForm Bean的赋值而不必在每个使用ActionFormBean的地方都把数据库中的值手动赋值给ActionForm Bean然后再在JSP页面中显示出来虽然它不能减少ActionForm Bean的数量但是它至少使应用程序对ActionForm Bean的赋值自动化了从而减少了程序出错概率提高了程软件开发效率
二类反射的概念
关于类反射的概念在此我就不详细介绍了它不是本文的重点IBM developerWorks网站上有大量介绍类反射概念的文章大家可以找出来参考一下其实Struts本身就大量利用了类反射的机制