利用Hibernate实现“班级事务浏览”模块
一、准备项目结构
⑴ 事务浏览的执行过程
⑵模块的实现思路及设计要素
⑶ 对设计思路的说明
① 保留原有的视图:将4个视图文件及top.jsp、main.jsp文件都复制到项目中的WebRoot目录下。
② 根据处理逻辑,设计分为三个阶段进行。
•第一阶段:index.jsp视图发出一个请求,要求得到所有的分类信息。
• 第二阶段:通过用户选择,left.jsp视图发出一个请求,要求得到某个类别下的所有班级事务列表。
• 第三阶段:通过用户选择,affairs_list_view.jsp视图发出一个请求,要求得到某条班级事务的具体细节。
③ 每个阶段都要设计Struts要素和Hibernate要素,所以建立了Web项目后要添加Struts支持和Hibernate支持。
⑷准备项目
工作细节:
u 仅添加了Struts支持,组件部分留在设计中实施。
u 添加了Hibernate支持,针对三个数据库表分别创建了映射文件。
u 对项目结构做了调整,将公共部分放在了hibernate包中。
u 创建了DAO类的接口文件,如:IAffairDAO.java(此时文件内容为空,方法的定义留到设计中完成)。
u 建立了DAO工厂,用于得到三个DAO类对象。
⑸做细节上的工作
u让DAO类实现已经定义了的各自的接口;
u在DAO工厂类中编写三个方法,用于得到三个DAO类对象。
通过这些设计,Hibernate_Meeting项目不仅有了Struts和Hibernate的支持,而且形成了DAO层的完整结构,设计中只需设计控制层和业务层即可。
二、第一个阶段的设计
Struts部分的设计
⑴ 修改index.jsp文件的代码。
将文件中的src="left.jsp"改成src="getsort.do",即向Servlet发出一个请求。
⑵ 创建Action及ActionForward组件
工作结束后,查看struts-config.xml文件
⑶ 修改left.jsp文件的代码。
<% Sort sort = new Sort();
List<Sort>list = (ArrayList<Sort>) request.getAttribute("sortList");
%>
………
<td height="100">班级事务浏览
<% intnum = list.size();
for (inti = 0; i < num; i++) {
sort = (Sort) list.get(i);
%>
<a href="XXXX?sortId=<%=String.valueOf(sort.getSortId())%>" target="mainFrame"><%=sort.getName()%></a></p>
<% } %>
</td>
Hibernate部分的设计
⑴ 编写ISortDAO接口方法
这个阶段要从sort表中取出所有的分类信息,要通过DAO类提供的findAll()方法实现,所以在对应的接口类中要定义这个方法。
在ISortDAO.java中定义抽象方法:
public List<Sort> findAll();
这样就可以在业务层通过dao对象调用该方法了。
⑵ 建立并完善service层业务
在src目录下建立一个名为service的包,并创建针对SortDAO的业务层类SortService.java。在Action组件中设定了获取分类信息的业务层方法是getSortList(),所以接下来编写这个方法并调用DAO类中的findAll()方法,完成对数据库表sort所有信息的获取。
SortService.java文件中getSortList()方法的代码如下:
阶段测试
部署项目进行测试,直到出现下图的结果,就表明第一阶段的设计正确无误。
三、第二个阶段的设计
Struts部分的设计
⑴ 修改left.jsp文件的代码 。
将文件中的超级链接以“*.do”的方式提交给Servlet,于是left.jsp中关于超级链接的代码修改为:
<a href="getaffairs.do?sortId=<%=String.valueOf(sort.getSort Id())%>" target="mainFrame"><%=sort.getName()%></a>
其中sortId要向控制器传递分类号,才能依据这个要素在affair表中查询符合条件的所有事务信息。
⑵ 创建Action及ActionForward组件
控制器接收到用户请求后,根据传递过来的分类号要得到两个数据:一个是隶属该分类的所有事务列表;一个是分类名,用于在下一个视图页面显示。
Action组件类AffairListAction.java文件中的核心代码如下:
这一部分工作结束后,struts-config.xml文件中增添了一个<action>元素,内容如下:
<action>
input="/left.jsp"
path="/getaffairs"
type="action.AffairListAction">
<forward name="result" path="/affairs_list_view.jsp" />
</action>
Hibernate部分的设计
⑴ 编写接口方法 。
这个阶段涉及到对两个数据库表的操作:
① 从sort表中取出指定分类号对应的记录,即获取一个
Sort类对象;
② 从affair表中取出隶属某个分类的所有事务信息。
这两个操作分别通过DAO类提供的findById()方法和findBySortId()方法实现,所以在对应的接口类中要定义这两个方法。
ISortDAO.java中定义抽象方法:
public Sort findById(java.lang.Integer id);
IAffairDAO.java中定义抽象方法:
public List<Affair> findBySortId(Object sortId);
这样就可以在业务层通过dao对象调用该方法了。
⑵ 建立并完善service层业务
这个阶段的任务有两个:
① 在SortService.java文件中编写获取某个分类对象的方法,Action组件中设定了该方法的名称为getSort()。
② 在service包中创建针对AffairDAO的业务层类AffairService.java,Action组件中设定了获取隶属于某个分类的所有事务信息的业务方法是getAffairList()。
SortService.java文件中getSort()方法的代码如下(省略部分与getSortList()方法的代码相同):
public staticSortgetSort(Integer sortId) {
ISortDAOdao = DAOFactory.getSortDAO();
try{
Sortsort = dao.findById(sortId);
System.out.println("成功地获得了某个分类信息!");
returnsort;
}catch (HibernateException e) {………}
finally { ……… }
}
AffairService.java中的getAffairList()方法的代码如下:
阶段测试
部署项目进行测试,直到出现下图的结果,就表明第二阶段的设计正确无误。
四、第三个阶段的设计
Struts部分的设计
⑴ 修改affairs_list_view.jsp文件的代码
在视图中点击“详细”超级链接时,要以“*.do”的方式向Servlet提交请求,因此要修改这里的代码。
修改后的代码为:
<a href="getdetail.do?affairId=<%=affair.getAffairId()%>">详细</a>
⑵ 创建Action及ActionForward组件
控制器接收到用户请求后,根据传递过来的事务号要得到两个数据:一个是针对这条事务的一个对象,存储了事务的详细信息;一个是分类名,用于在下一个视图页面显示。
Action组件类AffairDetailAction.java文件中的核心代码如下:
这一部分工作结束后,查看struts-config.xml配置文件
Hibernate部分的设计
⑴ 编写接口方法
这个阶段涉及到对两个数据库表的操作:
① 操作sort表,得到指定了分类号的一个Sort类对象;
② 从affair表中取出指定事务号的某条事务记录。
获取某条事务信息的操作将通过DAO类提供的findById()方法实现,所以在对应的接口类IAffairDAO.java中定义如下方法:
public Affair findById(java.lang.Integerid);
这样就可以在业务层通过dao对象调用该方法了。
⑵ 完善service层业务
在AffairService.java文件中补充getAffair()方法,用于获取Affair对象。
在这个方法里,将依据关键字affairId检索数据表,因此要调用DAO类的findById()方法。
getAffair()方法的代码如下:
阶段测试
部署项目进行测试,直到出现图7-27的结果,就表明第三阶段的设计正确无误。