层框架,那么就采取双向,性能很重要啊,否则后果很严重,这种设计和性能不匹配也是目前面向对象领域需要解决的另外一个问题。
通过在子对象UserPropery配置中引入many-to-one ,然后在父对象User配置中规定inverse="true" 来实现双向,Hibernate会通过和insert或update一条SQL语句完成关系设定。
Java EE/J2EE面向对象编程之道(4)
时间:2011-02-04
表现层Struts聚合实现
前面我们完成了Hibernate的映射配置,下面是表现层的映射配置,这是使用标签库来实现,我们使用Struts的标签库来实现:在界面主要实现下图效果:
当进行用户User资料增删改查时,需要一个如图录入页面,部门是通过下来菜单选择,用户属性UserPropery是通过一行行属性名称和属性值输入的,主要是在user.jsp中完成:
< html:form action="/userSaveAction.do" method=''post''> < html:hidden property="action" />
< !-- 下拉菜单选择部门,通过使用Struts的Action串联,产生deptListForm新ActionForm-->
< html:select property="dept.deptId" >
< logic:notEmpty name="deptListForm" >
< html:optionsCollection name="deptListForm" property="list" value="deptId" label="name"/>
< /logic:notEmpty>
< /html:select>
< br>
UserId:< html:text property="userId" />
< br>
Username:< html:text property="username" />
< table>
< tr>< td>属性Id< /td>< td>属性名称< /td>< td>属性值< /td>< /tr>
< tr>< td>
< html:hidden property="userProp[0].propId" />
< /td>< td>
< html:text property="userProp[0].name" />
< /td>< td>
< html:text property="userProp[0].value" />
< /td>< /tr>
< tr>< td>
< html:hidden property="userProp[1].propId" />
< /td>< td>
< html:text property="userProp[1].name" />
< /td>< td>
< html:text property="userProp[1].value" />
< /td>< /tr>
< tr>< td>
< html:hidden property="userProp[2].propId" />
< /td>< td>
< html:text property="userProp[2].name" />
< /td>< td>
< html:text property="userProp[2].value" />
< /td>< /tr>
< /table>
< br>< input type=''submit'' value=''submit''>< /input>
< /html:form>
相应的UserActionForm和User Model内容差不多,不同之处:为接受多个动态属性的输入,需要设定一个特定的方法:
public class UserForm extends ModelForm { .....
public UserProperty getUserProp(int index) {
return (UserProperty)((List)userProps).get(index);
}
.....
}
增删改查和批量查询根据JdonFramework的简化可迅速配置实现,这里不再描述,整个项目的代码结果如下图:也就是10个类左右,而且都是和业务有关,简要,扣主题,整个案例代码是免费自由下载,作为JdonFramework应用源码下载之一的sample。
总结
一个真正面向对象的JavaEE或J2EE系统,应该是一个围绕领域模型的多层架构,以面向对象OO思维进行领域模型提炼和重构,继续以OO思维进行 |