功能设计与实现
一、班级事务发布功能
事务发布功能的本质就是在数据表中添加数据。
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表中。