实用J2EE设计模式编程指南 宾馆管理员用例 本节介绍管理员角色交互的用例,包括: Commission hotel(增加宾馆项目) · Decommission hotel(删除宾馆项目) View Hotel details(浏览宾馆细节) 由于这些用例的格式非常相似,因此可以找出一个公用解。简单介绍每个用例之后, 我们将介绍其模式标识与实现 Commission Hotel用例 管理员可以创建新宾馆项目,包括选择条件。此外,还要在系统中部署一组描述新宾 馆的Web页面(如图22所示) 子 Hotel Administrator Commission Ho 图22 求值用例的步骤如下 Use Case Preconditions 提供了访问权限 On Successful Outcome of the Use Case 已经创建的新宾馆项目和增加新宾馆的Web页面 On Failed Outcome of the Use Case 未能创建新宾馆项目 Decommission hotel用例 管理员可以从系统中删除宾馆项目,包括删除实体相关Web页面(如图2.3所示 子 Hotel Administrator Decommission Hotel 图23 求值用例的步骤如下: Use Case Preconditions 系统中存在要删除的宾馆项目,包括所有相关web页 On Successful Outcome of the Use Case 顺利地从系统中删除宾馆项目,包括相关信息
第2章Web层设计模式 On Failed Outcome of the Use Case 未能从系统中删除宾馆项目及相关信息 View Hotel Details用例 浏览宾馆细节包括浏览作为每个宾馆搜索条件的一组条件,如宾馆名称、类型、连锁, 等等(如图24所示)。 子 Customer View Hotel Details 图24 Use Case Preconditions 系统中存在所选宾馆项目,包括所有相关Web页面 On Successful Outcome of the Use Case 顺利显示宾馆项目及所有相关信息 On Failed Outcome of the Use Case 未能显示宾馆项目及所有相关信息 标识模式 要确定完成上述用例所需的模式,就要解决与这种Web应用程序相关的域区域中的主要 问题。我们标识了五大问题域,需要加以考虑,包括 ·请求处理 ·会话管理 ·视图管理 验证 客户端安全 下面几节介绍前四个问题域,客户端安全域第5章介绍。在这些问题域情境中,我们要 开发系统的 Hotel administrator部分。 请求处理 大多数软件应用程序都需要某种形式的请求处理,这是个非常有趣的应用程序设计问 题,特别是在Web应用程序中。在简单情形中,请求处理可以是面向页面的,每一页管理臼 己的请求和响应处理。这时很可能产生大量重复代码并造成应用程序行为的不一致,使维护 扩展代码非常困难 要解决请求处理问题,最好引人控制器
实用J2EE设计樸式编程指南 Front Controller设计模式 Front Controller设计模式对常见请求处理工作采用集中控制,并委托给卜一个视图 集中请求处理保证这个逻辑不会交织在不同视图中,在不同视图之间是相同的,使维护!扌 展大为便利。 Front Controller还促进表示逻辑j导航逻辑分开,这是非常有用的,因为可以 改变导航逻辑而不影响表示逻辑。 控制器模式可以实现为小服务或JSP页面中嵌入的 Javabean。图25显示了 Front Controlle 模式的结构 发送请求控制器 客户机 派遭器 easerver 小服务前端 JSP前端 助器k Front Controller模式的参与者如下 Controller(控制器) 处理请求和委托到下一视图的初始点 Dispatcher(派遣器) 负责视图管理与导航 view(视图) 向客户机表示和显示信息 per(帮助器) 帮助视图或控制器完成处理工作 在宾馆应用程序中,我们用小服务控制器实现 Front Controller模式,使用命令与控制 器策略。我们用小服务控制器而不用JSP实现方法的原因如下: JSP页面通常与显示格式有关,而不是与请求处理相关。用JSP实现控制器会混淆这 两个不同目的。 在小服务控制器实现中,请求处理代码更容易维护,因为它与HTML分开。 这个策略可以将控制器委托任务分配到不同命令对象,进一步分离委托过程。 Command 设计模式将命令或操作表示为对象,将其行为分离,允许命令日志与撤销操作之类的其他可 插入功能。 Front Controller实现 这个模式用 AdminHotelController类实现。 AdminHotelController扩展 Http Servlet类,集 中处理宾馆请求。这个类的源代码如下
第2章Web层设计模式 kage hotel. presentationtier: importjavax.servlethttpHttpservletrequEst; importjavax.servlet.http.HttpservletrespOnse import javax. servlet ServletException import javax. servlet RequestDispatcher; import java. io. IOExceptic import hotel util. HotelDetails import hotel ejb import java. math. BigDecimal import java.util. Properties import hotel, util. Command import hotel util. RequestHelper public class AdminhotelcontrolLer extends Httpservlet ( private void processRequest(Ht tpServletRequest request Httpservletresponse response throws ServletException, IOException i RequestHelper helper s new HotelRequestHelper( request, response ) Command command helper getcommand(); next a command. execute( helper 3 catch( Exception e e printstackTrace(); dispatch( request, response, next 这个方法处理 Http Get请求: protected void doget(htTpservietrequesT request HttpservletrespoNse response ) throws ServletException, IOException processRequest( request, response 这个方法处理 Http Post请求 protected void dopost(hTtpservletrequest request HttpservletrespoNse response ) throws ServletException, IOException t
实用J2E设计模式蝙程指南 public String getservletInfo() i eturn getsignature() 最后,这个方法将请求派遣到卜一页 privatevoiddispatch(httpservletrequestrequest IttpServletResponse response String page throws ServletException, IOException i RequestDispatcher dispatcher= getServletcontext(). getRequestDispatcher( page dispatcher. forward( request, response 注意页面是绝对路径,否则 dispatcher为nul private String getSignature()i return ServiceToWorker-Controlle Command设计模式 Command设计模式表示请求为一个对象,使客户机可以将请求参数化。由于每个命令 表示为一个对象,因此很容易用新对象增加新命令的行为,而不会影响其他任何命令。另外, 现有命令的行为可以修改,也可以添加新行为,而不会影响其他命令。必要时可以保存或登 记命令状态。 类框图26显示了 Command设计模式结构 ConcreteCommand 6 Command设计模式的参与者如下: Command(命令) 声明执行操作的接