上一节课我们已经完成了OA项目的基础部分,对DAO和BEAN的基本操作。今日开始学习OA项目中“组织管理”这一部分。在学习的过程中,整体上难度相对比较简单,更多的是项目经验上的学习。但在配置hibernate的映射文件时,大家有些应付不来。我也不例外,一对一映射关系我掌握的不好。但汤兄弟为人正直、善良,他在晚上下课后给我们被了 。
这个项目虽然未详细涉及企业项目开发中各方面细节,但整个框架是按照这个流程走的。
组织机构部分
一、设计部分
1.了解需求:
我们没有进行详细的需求分析,汤兄弟在前天给我发了一个完成的页面层(静态页面)。需求一眼就看穿了。
1) 部门管理:增、删、改、查、(子部门)
2) 岗位管理:增、删、改、查
3) 员工管理:增、删、改、查
正如你所看到的,搞应用不就是对数据库的增、删、改、查吗?Java将应用做的十分好,而且在继续发展。哦!这些对她来说太简单了。
2.设计实体
设计实体的两种方式:
1) 对象-->表:正向工程。(推荐)
2) 表-->对象:反向工程。
在早之前的开发中,常见的是第二种方式先设计数据表格,然后再编程定接口。但随着Java的日益强大,这一过程被反过来了。面向对象的似乎还有很大的潜力!
设计实体时,我们需要考虑用到了哪些(几个)实体?实体之间的关系是什么?实体具有哪些属性?我们所说的实体就是Bean。汤兄弟使用StarUML给大家把所有的实体和实体之间的关系画了出来,我十分喜欢画图,感觉似乎比编码好多了。我在下面也跟着汤兄弟把图画出来了:
然后UML课程在OA项目之后,但看着这图多专业~~!!
我们的实现流程:
设计实体-->JavaBean-->映射文件-->生成表-->...
设计实体-->JavaBean都比较容易,因为我们使用了hibernate所以生成表也不需要我们来做了。这个流程中最为复杂的是映射文件。因为hibernate才讲了三天,OA项目中算是第一次应用hibernate写东西。
部门实体的映射文件(department):
<class name="Department" table="ccoa_department"> <id name="id" column="id"> <generator class="native"/> </id> <property name="name" /> <!-- 与上级部门(多对一) --> <many-to-one name="parent" column="parentId" class="Department" /> <!-- 与子部门(一对多) --> <set name="children"> <key column="parentId" /> <one-to-many class="Department" /> </set> <!-- 部门与员工(一对多关系映射) --> <set name="employees"> <key column="departmentId" /> <one-to-many class="Employee" /> </set> </class> |
职员实体的映射文件(employee):
<class name="Employee" table="ccoa_employee"> <id name="id" column="id"> <generator class="native"/> </id> <property name="name"/> <property name="sex"/> <property name="employTime" type="date" /> <property name="phone" /> <property name="email" /> <property name="description" /> <!-- 员工对部门(多对一关系映射) --> <many-to-one name="department" column="departmentId" /> <!-- 员工对岗位(多对多关系映射) --> <set name="roles" table="ccoa_employee_roles"> <key column="employeeId"></key> <many-to-many class="Role" column="roleId" /> </set> <!-- 员工对帐户(一对一关系映射) --> <one-to-one name="user" class="User"/> </class> |
岗位实体的映射文件(role):
<class name="Role" table="ccoa_role"> <id name="id" column="id"> <generator class="native"/> </id> <property name="name" /> <property name="description" /> <!-- 岗位与员工(多对多关系映射) --> <set name="employees" table="ccoa_employee_roles"> <key column="roleId" /> <many-to-many class="Employee" column="employeeId" /> </set> </class> |
用户实体的映射文件(user):
<class name="User" table="ccoa_user"> <id name="id" column="id"> <generator class="foreign"> <param name="property">employee</param> </generator> </id> <property name="loginName" /> <property name="password" /> <!-- 帐户与员工(一对一关系映射) --> <one-to-one name="employee" class="Employee" constrained="true"/> </class> |
这些映射规则设计的比较合理。但JDO已经比它要简单的多了。我们学习一些hibernate的关系映射也是十分有必要的。今天晚上汤兄弟给我复习了一下hibernate的映射关系,感觉没什么难的。汤兄弟说,如果大家对hibernate有了全局的认识。Hibernate很简单,就那么点东西。
二、实现部分
上边我们完成了设计部分,接下来我们来完成实现部分。汤老师是一位比较有经验的老师,他领着大家做OA时,是由框架到实现,一层一层的去实现我们需要的功能。而不是先设计了一个框架,然后具体去实现某一需求。一层一层的懂吗?就像剥洋葱,一层一层的,而不是切洋葱。
实现部分我们首先实现Action,因为由第一部分我需求我们了解到。每一个管理模块都有增、删、改、查。在我们学习Servlet时,我们编写一个Servlet对应一个操作请求,那我们得写多少个Servlet啊!但我们在学习Struts1时,接触到了一个DispatchAction,我们可以将某一管理模块的操作请求全部放到一个DispatchAction里,所以在这里我们使用了DispatchAction。
我们按原计划使用三层以实现,接下来开始编写Servicen层。哇赛,你知道多么简单吗?因为我们事先编写了BeanDaoImpl,所以在Service层中直接调用BeanDaoImlp实例的方法即可,此时的Service层显得十分没有必要,浪费得很。
继续看,我们的BeanDaoImpl继承自BaseDaoImpl。我们的BeanDaoImpl并未写任何方法,使用的全是父类BaseDaoImpl的方法。此时BeanDaoImpl显得也很浪费,那么我们就将它们“@Deprecated”掉。
我们直接将Service和Dao层合并,并且使用BaseDaoImpl这一个类的实例就可以了!
BaseDaoImpl内部使用Hibernate的session实现对数据库的操作。YEA,Hibernate全帮我们做了。经典!
三、显示部分
显示部分我们使用的全是JSP页面,表单的检验我们使用的是JavaScript,数据显示使用的是JSTL和EL表达式。就这么简单,OK了!
今天我们只完成了Role(职员)管理这一部分,其他的管理模块都按照这个模块的流程来。速度非常之快!
Java特性所能发辉的功力,Java之父早就想到了吗?