1、重构人员采用一组与特定应用系统领域和业务有关的组件或顶层中的组件系统来构造每个应用系统。结合J2EE,让我们首先了解J2EE体系中的组件构成情况,如图2所示。图2J2EE组件打包策略在上图中可以看出,不同的组件归档到不同的文件包中,这样就保证了一个组件的插拔不会影响到其它的组件。根据应用系统组件的功能,我们可以把它们分为动态组件和静态组件。静态的组件包含网页文件,主要用于放置教学资料和参考文章。动态组件则包括各种功能模块,如论坛系统、模拟测验系统等。应用系统组件之下是于特定业务有关的组件。在这里,我们可以添加非Java编写的一些程序,用于处理特定内容下的操作,比如模拟测验系统中的出题模块。当然
2、,要考虑到上层组件调用的正面接口问题。对于这层组件,我们能够随时替换,只要其提供的数据符合上级正面的要求。以上两级组件之下是J2EE应用服务器和操作系统,整体如图3所示。图3 计算机组成原理网站系统组件架构图(三)利用J2EE模式开发组件系统下面着重介绍开发过程中使用的J2EE模式,这些模式都是通用类型的。本系统采用MVC开发模型,即Model-View-Controller。Model是指应用程序的数据,以及对这些数据的操作;View是指用户界面;Controller负责用户界面和程序数据之间的同步。这种模型的好处在于分离不同功能的代码,便于以后的维护,还有利于在项目小组内按照小组成员各自的
3、擅长进行分工,有利于三个部分并行开发、加快项目进度。为了使各开发人员协调一致,为其他组件提供一致和标准的正面,增强系统的可维护性和可复用性,我们广泛采用了SUN公司提出的基于MVC的设计模式。图4是用户注册模块的UML图,我们将结合这个模块具体阐述各模式的特点和在本系统中的实际应用。图4 表示层模式明确了所采用的体系和模式,下面具体设计类的属性和方法,通过设计完善的接口和继承、重载等方法进行重构。模块的UML的类图表示如下:图5 模块的UML的类图结合上图,让我们看看这个模块中都运用了哪些模式。1. 表示层模式系统的表示层集中了MVC模式中的View与Controller。该系统用JSP代表V
4、iew,用Servlet代表Controller。在Controller这一模块中,又采用了视图助手、分发者与值对象模式,以增强系统的模块化,提高维护性。(1)前端控制器控制器通常表现为Servlet形式,其UML表示如下:图6 前端控制器根据Model-View-Controller的开发思想,使用控制器作为处理请求的最初联系点。该控制器管理着请求的处理,包括调用安全服务,比如验证和授权、委托业务处理、管理合适的视图选择、处理错误,以及管理内容创建逻辑的选择。也可以把前端控制器看成一个触发器,由它来启动流程。下面是功能代码的样本。其中出现的RegisterHelper、Command等类,接
5、下来会有详细介绍。 public void performTask(javax.servlet.http.HttpServletRequest request, javax.servlet.http.HttpServletResponse response) throws javax.servlet.ServletException, java.io.IOException RegisterHelper rh=new RegisterHelper(request,response);/启动注册视图助手 Command command=rh.getCommand();/由视图助手中获得并初始化C
6、ommand CustomerBean cb=rh.getCustomerBean();/由视图助手中获得并初始化值对象 request.setAttribute(customerbean,cb); String dispatcher=rh.getDispatcher();/由视图助手中获得并初始化分发者type,rh.getType();/设置上下文属性 try command.execute(Helper)rh);/执行业务代码 catch(javax.ejb.DuplicateKeyException de) errorbean,new ErrorBean(对不起,已经有人注册了该用户名
7、!);/注册重名处理 dispatch(request,response,dispatcher);/分发并移交控制权 return; catch(Exception e) 对不起,数据库出错!/出错处理 优点:通过集中化决策点和控制,控制器有助于减少嵌入在JSP中Java代码(Scriptlet)的数量,保持View功能的纯洁性。它的位置如图5中Controller所示。(2)视图助手表示层更改经常发生,而且当业务数据访问逻辑和表示格式化逻辑被混杂时,表示层更改很难开发和维护。这使系统灵活性更差,更缺乏可用性,而且对变化的适应性更弱。图7 视图助手视图包含格式化代码,把其处理责任委托给其助手类
8、。助手也存储该视图的中间数据,如表单、URL参数等,并且充当业务数据适配器。public class RegisterHelper implements Helper static String dispatcher = RegisterDispatcher; private CustomerBean customer = null; private String type = null; public RegisterHelper( javax.servlet.http.HttpServletRequest request, javax.servlet.http.HttpServletRes
9、ponse response) setType(request); setCustomerBean(request); /* * 定义页面类型:HTML or XML */ public void setType(javax.servlet.http.HttpServletRequest request) type = request.getParameter(); * 获取Command public Command getCommand() RegisterCommand rc = new RegisterCommand(); return rc; * 向值对象中填充数据 public v
10、oid setCustomerBean(javax.servlet.http.HttpServletRequest request) customer = new CustomerBean(); customer.setUsername(request.getParameter(username customer.setPassword(request.getParameter(password customer.setEmail(request.getParameter(email customer.setTruename(request.getParameter(truename cust
11、omer.setId(request.getParameter(id customer.setService(this.setService(request); * 获取值对象 public CustomerBean getCustomerBean() return this.customer; * 获取分发者 public String getDispatcher() return this.dispatcher; * 获取类型 public String getType() return type;在助手中而不是在视图中封装业务逻辑会增强应用程序的模块化,并且更有利于组件重用。助手有大量的
12、责任,包括收集视图和控制需要的数据,以及存储中间模型。它的位置如图5中Helper所示。(3)Command模式Command中包含纯业务代码,如注册、登陆、检验等。在样例模块中,它的职责是将注册信息传递给Entity Bean。图8 Command功能代码如下所示: public void execute(Helper helper) throws Exception RegisterHelper rh = (RegisterHelper) helper;/获取视图助手 CustomerBean cb = rh.getCustomerBean();/从视图助手中获取值对象 ServiceLo
13、cator sl = ServiceLocator.getInstance();/初始化服务定位器 CustomersHome ch = (CustomersHome) sl.getHome(ServiceLocator.Services.CUSTOMERS);/从服务定位器中获取Entity Bean本地接口 try Customers customers = ch.create(cb);/将注册信息导入数据库 catch(javax.ejb.DuplicateKeyException e) throw new javax.ejb.DuplicateKeyException(); catch(Exc
copyright@ 2008-2022 冰豆网网站版权所有
经营许可证编号:鄂ICP备2022015515号-1