目录

  • 1 任务一 Eclipse概述及安装
    • 1.1 认识Eclipse
    • 1.2 安装Eclipse
    • 1.3 安装Eclipse插件
    • 1.4 实训
  • 2 任务二 Eclipse的集成开发环境
    • 2.1 Eclipse界面
    • 2.2 常用视图
    • 2.3 透视图
    • 2.4 Java程序编写
    • 2.5 编译和运行
    • 2.6 Java代码调试
    • 2.7 实训
  • 3 任务三 Eclipse中搭建Web开发环境
    • 3.1 Eclipse中Web开发环境的分析
    • 3.2 应用服务器Tomcat的安装与配置
    • 3.3 MyEclipse插件的安装与配置
    • 3.4 数据库的安装与配置
    • 3.5 实训
  • 4 任务四 Eclipse中开发Web项目
    • 4.1 Eclipse中创建Web工程
    • 4.2 建立Servlet处理方式
    • 4.3 建立JavaBean处理方式
    • 4.4 数据库开发
    • 4.5 Eclipse中调试Web项目
    • 4.6 实训
  • 5 任务五 Eclipse开发实例——电子会议厅
    • 5.1 MVC设计模式
    • 5.2 系统分析
    • 5.3 数据库设计
    • 5.4 框架结构设计
    • 5.5 功能设计与实现
      • 5.5.1 动态加载事务类别
      • 5.5.2 添加事务(一)
      • 5.5.3 添加事务(二)
      • 5.5.4 班级事务的编辑与删除
      • 5.5.5 班级事务的查看
    • 5.6 实训
  • 6 任务六   Struts实现MVC设计
    • 6.1 实例介绍
    • 6.2 Struts框架结构
    • 6.3 Struts实例设计
    • 6.4 利用Struts实现“班级事务发布”模块
    • 6.5 实训
  • 7 任务七  Hibernate实现数据持久化
    • 7.1 持久化技术
    • 7.2 Eclipse中开发Hibernate
    • 7.3 Hibernate项目的设计
    • 7.4 利用Hibernate实现“班级事务浏览”模块
    • 7.5 项目的打包与发行
    • 7.6 实训
  • 8 任务八   JUnit单元测试
    • 8.1 关于JUnit
    • 8.2 编写和运行JUnit测试
    • 8.3 JUnit测试案例
    • 8.4 实训
  • 9 任务九  使用CVS进行版本控制
    • 9.1 版本管理与CVS
    • 9.2 CVS服务器的安装与配置
    • 9.3 CVS客户端的配置
    • 9.4 CVS项目管理
    • 9.5 标记版本
    • 9.6 实训
功能设计与实现


功能设计与实现


一、班级事务发布功能

事务发布功能的本质就是在数据表中添加数据。

u  首先要设计视图部分,以便用户提交数据;

u  在Servlet中接收用户数据,存储到数据Bean对象中,调用处理Bean完成数据在表中的存储;根据存储结果,调用视图进行显示。

视图设计 

这个页面有两个问题需要注意:

u  在点击了“事务发布”按钮后,应该转向Sevlet去处理,所以在程序的表单提交中,要设置action属性值。 下拉列表“栏目”中的数据是动态从数据表中获得的







事务发布页面Affairs_add.jsp

控制器设计

⑴SortList.java程序的设计

这个Servlet的功能是要得到sort表中的数据,再传递给affairs_add.jsp页面进行类别选择。由于超链的默认方式是get,所以要编写Servlet的goGet()方法。 

⑵AffairsAdd.java程序的设计

这个Servlet的功能是:通过request对象获取用户提交的数据,再将这些信息存储到数据Bean对象中,把这个对象作为参数传递到处理Bean的方法中进行数据存储,根据存储结果调用视图进行显示。

处理Bean设计

根据前面的分析,程序中涉及到两个处理Bean的方法设计:

u  针对sort表的处理Bean(SortHandle.java):它要完成sort表所有数据的提取,供用户在视图中选择事务类别;

u  针对affair表的处理Bean(AffairHandle.java):到目前为止,在这个Bean中需要完成两项工作:* 统计目前数据表中的记录数;* 完成事务信息的存储。

二、班级事务维护功能

1)事务编辑:对已经“入库”的数据进行各项修改操作,使其满足要求后再次被存储,更新表中的原有数据。

u点击了班级事务维护链接后,要出现事务分类列表,以便用户选择;

u点击将要修改的事务信息的编辑链接,以便进入到编辑界面进行修改操作;

uServlet接收用户的修改数据后,调用处理Bean完成数据的更新;根据更新结果,调用视图显示结果

 

2) 事务删除:对已经“入库”的数据进行删除操作。

u点击了班级事务维护链接后,要出现事务分类列表,以便用户选择;

u 从事务列表中点击将要删除的事务信息的删除链接,出现询问提示;

u Servlet接收了确定信息后,将该条事务信息及与之相关的所有评论一并删除;调用视图显示事务列表,以便进行结果对比。

视图设计

事务修改和删除的页面在前期操作中是相同的,只有在具体选择了以后呈现出差别。下面是这两个功能的相同视图部分。


修改left.jsp文件中关于班级事务维护的超级链接:

<a href="AffairsMaintain" target="mainFrame" >班级事务维护</a> 

建立jsp文件代码  

u   当AffairsMaintain得到分类信息后,交给sorts_list.jsp视图去显示,以便用户先选择维护类别。

u   在显示分类名称的同时程序设计了超链接,并且交给一个名为AffairsListMaintain的Servlet,同时将分类号也传了过去,目的是要获得这个分类下的所有事务信息,以便在视图中显示,供用户浏览。建立代码的文件为affairs_list_maintain.jsp

指定栏目中的默认选项

如果点击编辑,会出现下面的视图 








栏目列表要默认显示所选事务隶属的分类,如:学习竞赛。由于栏目中的分类来自Servlet获得的数据,在视图中是按数据表中的顺序通过循环加载进去的,所以需要在Affair_modify.jsp文件中特别处理。

显示结果页面  

如果点击“删除”按钮,在确认后不仅仅在数据表中删除该记录,还应该再次显示事务列表信息,看到删除数据后的效果,以便加强对比。 





这个页面是affairs_list_maintain.jsp文件。在做这个功能时,为了更好地测试程序设计思路,在comment表中应该事先输入一些评论数据。

控制器设计

 AffairsMaintain.java的设计

这个Servlet的功能是要得到sort表中的数据,再传递给sorts_list.jsp页面进行类别显示。 

⑵AffairsListMaintain.java的设计

这个Servlet的功能是:当用户点击了某一个事务类别后,根据视图传递过来的类别号—sortId,再调用处理Bean中的相应方法,得到所有隶属于这个类别号的事务信息,并调用视图进行显示, 

⑶AffairsModify.java的设计

当用户点击“编辑”链接时,由这个Servlet接收视图传递过来的参数:

  affairId=<%=affair.getAffairId()%>

根据这个affairId号调用处理Bean中的方法得到这条事务的全部信息,交给视图去显示。 

AffairsUpdate.java的设计

  当用户修改完事务信息,点击“提交修改”按钮后,表单的action参数会指向这个Servlet,并将affairId参数也传递过来:

action="AffairsUpdate?affairId=<%=affair.getAffairId()%>“

 此时的工作与事务发布的工作几乎相同。 

⑸AffairsDelete.java的设计

  当用户确定要删除某条事务信息后,这个Servlet开始工作:

u  它从视图获取了两个参数(事务号和分类号)

affairId=<%=affair.getAffairId()%>&sortId=<%=affair.getSortId()%>

u  调用Bean中的方法从数据表里将这条记录删除。u  由于要和删除前的数据做对比,所以仍然要调用显示事务列表视图,为此还要为视图准备一些数据。 

处理Bean设计

在这一阶段的操作中,设计了若干个方法,涉及到数据库中的3张表,这些细节可以在Servlet的设计中找到。下面把新增的方法列出来:

u  针对sort表的处理Bean—SortHandle.java* public Sort getSortInfor(IntegersortId)

得到某个分类的信息,包括分类号、分类名称,以Sort类对象的形式返回。

u针对affair表的处理Bean—AffairHandle.java* public List<Affair> affairsList(Integer sortId)

得到隶属于某个分类的所有事务信息,并存储到List表中返回;

*public Affair getAffair(IntegeraffairId)

根据参数指定的事务号,查找到这条事务信息,以Affair类对象的形式返回;

public booleanupdate(Affair affair,IntegeraffairId)

根据affairId参数,找到数据表中的记录并更新成affair对象中的各个属性值;

public booleandelete(Integer affairId)

删除affairId指定的事务记录。

*public void reSorting(IntegeraffairId)

将表中的affairId字段的值重新排序,使其连续。

u针对comment表的处理Bean—CommentHandle.java* public booleandeleteByAffairId(Integer affairId)

删除事务号是affairId的所有评论记录

三、班级事务浏览功能

本质操作就是在数据表进行查找数据的过程。

u 用户选择了某个浏览类别时,由Servlet根据接收到的事务类别号调用Bean中的方法得到列表信息;

u 用户点击了某条事务的“详细”链接时,由Servlet根据接收到的事务号调用Bean中的方法得到该事务的细节。 



⑴ 显示某一类事务列表

 这个界面与维护界面类似,只是每一条事务信息后面变成了“详细”链接,对应着affairs_list_view.jsp文件。










⑵ 显示某一条事务信息

在显示该界面之前,经过Servlet的处理,得到了某个事务对象及其所属类别的名称后,交由affair_detail.jsp页面显示。














控制器设计

⑴AffairsListView.java的设计

 这个Servlet的功能是要得到某个分类下的所有事务信息,它的代码与前面讲到的AffairsListMaintain.java几乎一样,只是调用了不同的页面视图而已,即:  request.getRequestDispatcher("affairs_list_view.jsp").forward(request,response);

AffairDetail.java的设计

u  这个Servlet要根据视图传递过来的事务号,得到这条事务的详细信息;

u  由于要显示该事务的所属类别,所以还要得到这个数据。

处理Bean设计

 在这个功能模块中,Servlet对数据的处理调用了前面已经设计好的方法,没有出现新方法,所以不再设计处理Bean 

四、班级事务评论功能

u 考虑到用户操作的习惯,在浏览某条事务时,可以看到所有用户对它的评论;

u 用户也可以发表评论; 

u 发表了评论之后,页面仍然返回到该条事务的浏览界面,便于用户查看刚刚提交的评论。



视图设计

我们将视图分两个环节来设计。

⑴评论区设计

当用户浏览到某一条事务信息时,将会在信息的底端看到评论区,此时用户可以书写并提交评论。只需改动affair_detail.jsp文件的代码,加入一个表单即可。









⑵ 显示评论区设计

当发表了评论之后,用户希望立即看见自己的评论,即回到刚才的页面:既可以看到事务信息,又可以看见自己的评论,当然也可以看见其他同学对这条事务的所有评论。需要改动affair_detail.jsp文件的代码,在评论区之前加入对所有评论的显示即可 。









控制器设计

⑴CommentAdd.java的设计:

这个控制器完成“发表评论”后的处理工作,它所做的具体工作有以下四点:

u  根据affairId得到事务对象,保存到request对象中;

u  将sortName保存到request对象中;

u  取出表单中的数据形成comment评论对象,调用Bean中的方法保存到后台数据表中。

u  取出针对这条事务的所有评论,存储到request对象中,调用视图回到评论页面。

⑵AffairDetail.java的修改

affair_detail.jsp视图除了要提供发表评论的区域,还要显示已有的评论,即AffairDetail.java还要提供针对该条事务的所有评论信息,并将数据存储到request中,供视图取出后显示。根据这个设计思路,Servlet必须将取得的评论信息以对应的索引关键字存储到request对象中。 

处理Bean设计

这个模块中涉及到的处理方法都是对comment表的操作,所以在CommentHandle类中进行添加。

u  针对comment表的处理Bean—CommentHandle.java* public booleansave(Comment comment)

将一条评论信息保存到数据表里,评论的各个细节由参数comment对象描述;

* public List<Comment> getCommentList(Integer affairId)

从comment表中筛选出事务号为affairId的所有评论信息,并存储到List表中返回。

五、班级事务查询功能

在这个系统中,选择了两种查询方式:按标题的关键字查询和按时间段查询。

u按标题关键字查询:

用户只需要输入标题中的关键字,即可在后台通过模糊查询得到结果,执行方式比较简单。



u按时间段查询:

 基于两个因素,我们将这种查询方式细化到年和某个学期的选择:

  • * 某个班级的在校时间一般为4年,时间跨度较小;* 

  •  学生的活动以学期为基本单位。

 用户提交的数据有两个:某一年和某学期。

 Servlet则根据这两个数据,在affair数据表中进行细致的筛选,得到某个学期的事务列表,再交给视图进行显示。 

视图设计

⑴选择查询方式

 当用户在主界面选择了“班级事务查询”功能后,会给用户一个选择界面,按照不同的方式进行选择。在query_pattern.jsp中设计两种选择方式,并根据处理细节选择合适的页面或Servlet即可。

⑵ 按标题查询界面设计

用户在这个界面中(query_title.jsp)输入关键字后,会提交数据由Servlet处理,因此程序会设计表单完成这个功能。 

 

⑶ 按时间段查询界面设计

界面中(query_time.jsp文件)出现的设计要素是两个下拉列表,数据来自于Servlet的处理,数据的获取将在控制器中解释。


控制器设计

 ⑴ QueryTitle.java的设计

 这个Servlet要从视图中取得用户输入的关键字,再调用处理Bean中的方法进行模糊查询后,得到数据列表。

 由于要调用affairs_list_view.jsp页面进行显示,所以要准备必要的显示数据:需要将得到的查询结果和类别名称都要存储到内置对象中。

⑵Query.java的设计

这个Servlet要准备时间数据,供query_time.jsp页面使用。主要操作:

u  通过处理方法getYears(),得到这个班自从发布事务信息以来所登记过的时间;

u  将时间划分成全部、春季学期、秋季学期三个时间段;

u  将年份数据和时间段数据分别存储在List列表中,并由内置对象保存,用于视图的显示。

⑶ QueryTime.java的设计

这个Servlet在获取了用户选择的时间段后,调用Bean中的方法查询满足条件的数据,再调用视图进行显示。

u  通过request对象得到参数“year”的数据,恰好是下拉列表中所显示的年份值; 

u  通过request对象得到参数“month”的数据,对应了时间段在下拉列表中的下标值,即:全部、春季学期、秋季学期分别对应字符串"0"、"1"、"2";

u  将得到的查询结果和提示信息存储到内置对象中,用于视图显示。

处理Bean设计

查询功能是针对事务信息进行设计的,所以对表的操作也就只涉及到了affair表。

u 针对affair表的处理Bean—AffairHandle.java* 

public List<String> getYears()

得到班级事务所涉及到的年份数据,以便在视图中显示,让用户进行选择;

*public List<Affair> queryByTitle(String keyTitle)

根据标题关键字进行查询,将结果存储到List表中;

*public List<Affair> queryByTime(String year, String month)

根据年份及时间段数据进行查询,将结果存储到List表中。