随笔-78  评论-682  文章-3  trackbacks-3

第三章 一个轻量级的Project Management Tool(LPMT)

在这里我们引入一个轻量级的Project Management Tool(LPMT)的例子,以此利用MVC设计模式和Struts技术来构建一个结构清晰、可扩展、可复用的Web应用程序,并借此说明如何使用Struts来实现MVC设计模式,以及在Struts的使用过程中如何构建清晰的系统架构以及实现WebForm和代码复用。这里我们假定一个Project、服务或者产品就是一个Issue;在每个Issue的开发周期内,当Issue在各个开发小组中流转的时候会生成一个或多个任务称为IssueData;每个IssueData都有相应的开始时间、结束时间和提交时间;IssueData的结束时间和提交时间是可更改的,每次更改系统自动生成一个Log记录这种更改。LPMT需要实现对上述IssueIssueDataLog的显示、管理和其他必要的功能。本人所在的三人小组将以JavaHibernate Struts Framework技术为依托实现上述需求。

3.1 LPMT的用户需求

我们通过采用与用户面谈的方式,初步抽象了以下的用户需求(系统功能)

标识

                          功能

分类

Y1.1

显示issue的启动时间,完成时间和工作组。

明显

Y1.2

TL可设定issue完成时间并公布。

明显

Y1.3

TL可修改原定完成时间。(注:需注明原因)

明显

Y1.4

issue进度修改后自动给相关TLe-mail

明显

Y1.5

可记录issue原状态及修改后状态。

明显

Y1.6

可查询issue目前进度或变更情况。

明显

Y1.7

可统计issue的各项情况(如从完成到启动的时间间隔等)并生

报表。

明显

Y1.8

各部门完成各自进度后系统自动给相关人员发e-mail

明显

Y1.9

PM可设置或调整issue的优先级。(手动)

明显

由于用户的需求是模糊不确定、可扩展的,故由此构建的系统必须满足结构清晰、可复用、可扩展等要求。

3.2 LPMT的需求实现

通过架构设计和编码,我们最终实现了上述大部分需求。

4-5.jpg 

 

6-7.jpg

 

8-9.jpg

10-11.jpg

第四章 LPMT中的MVC多层架构实现

LPMT中,为了使得系统可扩展、易维护、易修改、结构清晰,我们采用MVC设计模式,构建多层的体系结构,通过各层的协调配合,实现系统需求。

4.1 系统架构

LPMT中,我们设置了ViewControllerLogicModelData Persistence五个逻辑层,通过各逻辑层之间的配合,应用MVC设计模式,实现系统需求。

4.1.1 Data Persistence

也称数据持久层。数据持久层负责数据库映射,隔离数据库操作,将数据库操作设计成Java APIs。此逻辑层可由HibernateDAOConnection Pool等多种技术实现。在LPMT中,我们采用Hibernate技术,将数据库的表映射成为对象(issuecontrol.objects ),比如Issue表对应Issue.javaFlag表对应Flag.javaIssueData表对应IssueData.java等,将对数据库的各种操作封装在IssueDAOUserDAO两个DAO类中。DAO类代码见附录。

4.1.2 Logic

也称事务逻辑层。在一个规范的J2EE架构中,不同层的数据表示应该被限制在层内,而不应该扩散到其它层,这样可以降低层间的耦合性,提高J2EE架构整体的可维护性和可扩展性。比如说View层的逻辑进行了修改,那么只需要修改ActionForm的结构,而不需要触动Data Persistence层和Logic层的代码修改。同样,当数据库表进行了小的调整,那么也只需要修改Data Persistence层数据表示,而不需要触动Model层代码和View层代码。因此,我们在Model层和Data Persistence层中间插入Logic层,以降低Data PersistenceModel层之间的耦合关系。Logic层类以Bean结尾,如IssueBean.javaUserBean.javaModel通过Logic Bean调用Data Persistence层的DAO类,实现对数据库操作以及其他业务逻辑操作。Bean类代码见附录。

4.1.3 Model

也称对象层。包括所有Action类、ActionForm类、和其他显示类(issuecontrol.actionform包、issuecontrol.action包、issuecontrol.view)

issuecontrol.actionform包中的所有类都派生自ActionForm,与View层的表单页面一一对应,用于定义客户端显示表单,封装业务数据,在LogicModelControllerView各逻辑层之间作为数据传输媒介。在J2EE架构里面,ActionForm可以由Entity BeanSession Bean来表示,以期实现业务逻辑重用。

Issuecontrol.view包为显示包,其中的类为显示类,负责特殊对象表单的显示,比如分页显示的Issue等。

Issuecontrol.action包中的所有类都派生自Action,用于封装具体的处理逻辑,调用Logic层的业务逻辑类,实现业务操作,读写ActionForm类,并将结果返回View层显示。部分ActionActionForm见附录。

4.1.4 Controller

也称控制层。包括ActionServletActionMappingRequestProcessorStruts类。ActionServlet负责接受用户请求,并将用户请求引导到正确的页面。ActionMapping包含ActionServlet的目标映射,RequestProcessor负责与Action交互。ActionMapping的目标映射在struts-config.xml配置文件中完成。Struts-config.xml代码见附录。

4.1.5 View

也称显示层。由JSP页面组成。每个JSP页面由HTMLStruts 标签库实现控制和显示逻辑。部分View代码见附录。

4.2 MVC模式的实现逻辑

上述各逻辑层各司其职,互相配合,尽量降低逻辑层之间的耦合性,提高内聚性。图11为上述逻辑层之间的关系。

12.jpg

(1)     客户端向服务器提交Http请求

(2)     ActionServlet接受客户端提交的Http请求,载入属性文件(Properties files),选择目标Action,将控制权交给RequestProcessor

(3)     RequestProcessor根据URLstruts-config.xml中的actionmapping寻找相应的Action;新建或者复用对应的ActionForm,封装包含在请求信息中的表单属性,检查数据的合法性,并将ActionFor传递给目标Action

(4)     目标Action接受传递过来的ActionForm,读出ActionForm里面的属性,调用Logic层的业务逻辑Bean,而Bean则调用相应DAO类的方法,进行持久对象的持久化操作,最终完成相应的业务逻辑操作。操作过程一旦出现异常,Action也将一并处理。在完成业务逻辑操作后,Action返回一个ActionMapping对象,告诉RequestProcessor指向目标View页面。

(5)     View页面利用既定接口,将结果显示给客户端。

4.3 分页显示IssueMVC模式实现

下面以分页显示所有Issue为例,说明上述各逻辑层之间是如何配合以完成既定操作。

(1)     客户端向服务器提交URL请求:http://localhost:8000/issuecontrol/issueAction.do

(2)     ActionServlet通过RequestProcessor将请求提交到IssueAction

(3)     Action判断此次的请求类型为显示,参数action = “view”;通过HttpServletRequest.getParameter方法取得当前页码viewPage;假如viewPage为空,则当前页码为1;设定每页显示的行数pageSize = 8;调用IssueBean.getIssueByPage(new Page(pageNum,pageSize))方法,将结果封装到一个PageView对象selectPageView中;调用httpServletRequest.setAttribute方法将结果放到HttpServletRequest中;返回一个ActionMapping对象,内包含目标映射viewIssue指向IssueList.jsp,将控制权交还给RequestProcessorIssueBean.getIssueByPage方法是通过调用IssueDAO.getIssueByPage方法完成其业务逻辑的。

(4)     RequestProcessor将页面导向IssueList.jsp

(5)     IssueList.jsp将结果显示在客户端。

Action中的代码块示例如下:

    String viewPage=httpServletRequest.getParameter("viewPage");

    int pageNum=1;

    String address = "viewIssue";

    //查看所有的Issue

    if(("view".equals(action)) || (action == null)) {

      address = "viewIssue";

      if((viewPage!= null)&&(viewPage.length()!= 0)){

        pageNum = Integer.parseInt(viewPage);

      }

      int pageSize=8;

      //1.先进行参数分析

      //2.下面调用逻辑层方法得到显示的对象

      PageView selectPageView=IssueBean.getIssueByPage(new Page(pageNum,pageSize));

      //3.放到request中然后转发

      httpServletRequest.setAttribute("items",selectPageView.getItems());

      httpServletRequest.setAttribute("selectPageView",selectPageView);

      httpServletRequest.setAttribute("action",action);

}

posted on 2005-01-27 14:48 eamoi 阅读(2011) 评论(2)  编辑  收藏 所属分类: Java

评论:
# re: MVC设计模式的Struts技术实现(2) 2005-04-16 23:51 | LILY
后面的章节呢?  回复  更多评论
  
# re: MVC设计模式的Struts技术实现(2) 2005-04-18 09:58 | eamoi
不是在blog上贴全了嘛.  回复  更多评论
  



标题  
姓名  
主页
验证码 *  
内容(请不要发表任何与政治相关的内容)  
  登录  使用高级评论  新用户注册  返回页首  恢复上次提交      
该文被作者在 2005-01-27 14:57 编辑过
 
 
相关链接:
网站导航: