日期:2014-05-19  浏览次数:20811 次

J2EE核心模式三

View Helper(视图协助器)

View Helper模式要求把业务处理逻辑从视图(View)里排除出去,也就是说,视图里只包含显示用代码,其余的代码则应该放在做为Helper Class(协助器)的业务逻辑层里。
View Helper(视图协助器)模式介绍

我们从问题,解决方法,策略,优点几个方面介绍View Helper(视图协助器)模式。最后给出View Helper的相关联结。

问题

一个需要动态取得并显示业务数据的WEB应用系统的开发中,存在的一般问题是,在视图(view)层同时混在着业务逻辑处理代码和页面表示(presentation)代码。这样会存在各种问题:

1,柔软性

2,重用性

3,可维护性

4,角色的独立性

图1:view里混在业务逻辑处理代码与表示代码

解决方法

A view contains formatting code, delegating its processing responsibilities to its helper classes, implemented as JavaBeans or custom tags. Helpers also store the view's intermediate data model and serve as business data adapters.

使用View Helper,把业务处理逻辑从视图(View)里排除出去,视图里只包含显示用代码,其余的代码则放在做为Helper Class(协助器)的业务逻辑层里。Helper Class可以是JavaBean或自定义标签。

如图:

图2:使用Helper类把业务逻辑处理从View里分离开来。

View:为Client提供表现/显示的信息。可以是JSP或SERVLET。

Helper:协助view或controller完成它们的处理。因此Helper担当着很多种职责:

- 收集view所要求的数据

- 保持交互中间数据模型

- 对数据库等的访问

- 数据模型的优化

等。一个Helper可以是JavaBean或自定义标签等。

策略

View Helper模式可以有多种实现策略:

JSP View Strategy
??? JSP作为View。

Servlet View Strategy
??? Servlet作为View。

JavaBean Helper Strategy
??? JavaBean Helper策略

Custom Tag Helper Strategy
??? 自定义标签Helper策略

Business Delegate as Helper Strategy
??? Helper被实现为Business Delegate。

Transformer Helper Strategy
??? Helper被实现为eXtensible Stylesheet Language Transformer(XSLT)。

等,一般推荐使用JSP作为view,JSP里面不包含任何script。Helper类可以用JavaBean与自定义标签实现。

STRUTS里的Form类与JSF里的managed-bean,以及相当于这里的Helper类。

优点:

使用View Helper模式有以下好处:

- 提高应用程序的模块化,可重用性,以及可维护性

- 提高角色的独立性。有利于让项目组人员分工合作,分别负责应用程序的不同部分
参考资料:

Core J2EE Pattern Catalog

Core J2EE Patterns - View Helper
Front Controller(前端控制器)

Front Controller模式要求在WEB应用系统的前端(Front)设置一个入口控制器(Controller),所有的request请求都被发往该控制器统一处理。Front Controller一般可以用来做一个共通处理比如认证,页面导航,Session管理,国际化或本地化处理等。
Front Controller(前端控制器)模式介绍

我们从问题,解决方法,策略,优点几个方面介绍Front Controller(前端控制器)模式。最后给出Front Controller的实现范例以及相关联结。

问题

我们使用一个模式,都是为了解决某些问题而使用的。Front Controller模式用来解决什么问题呢?

我们在开发WEB应用系统(但不拘于WEB应用)时,存在很多不恰当的设计方法,比如让客户端(Client,一般指浏览器)可以直接访问各个视图(view,JSP等)。这样逻辑被分散到各个视图中,从而产生了各种问题:

1,对已有的功能修改困难,可维护性低。假如session管理,一旦session内容需要发生改变,则需要修改所有view中的相关代码。

2,很难增加新的功能,缺乏可扩展性。例如,我们需要在已有的系统中加入安全控制功能,控制用户对某些页面的访问,因为没有统一的处理入口,我们需要在所有的view中都加上认证代码。

对于系统中需要提供的类似以下功能:
认证
页面导航与转发等
Session管理
国际化或本地化处理
日志
其它共通处理
等,都会存在代码分散重复,可维护性低,缺乏可扩展性等问题。

图1:相同的逻辑被重复分散在各个view里。

解决方法

使用Front Controller,强制分离view的显示逻辑与业务处理逻辑。如图:

图2:前端控制器

Controller作为所有request的最初访问点。

策略

Front Controller模式可以有多种实现策略:

Servlet(+ Dispatcher,+Command,+…)Front Controller策略

Filter Controller策略

JSP Front Controller策略

等,一般推荐使用前2种实现方法。

优点:

使用Front Controller模式有以下好处:

- 集中控制

- 提高可管理性和安全控制能力

- 提高可重用性可扩展性

范例

下面是一个Servlet Controller的实现范例。该范例让doPost与doGet方法调用processRequest方法,processRequest方法执行“认证”“session管理”等共通操作,同时结合Command模式调用了业务逻辑。

代码:

参考资料:

Core J2EE Pattern Catalog

Core J2EE Patterns - Front Controller
Intercepting Filter(拦截过滤器)

Intercepting Filter模式使用一到多个过滤器(Filter)为采用拦截的方式为request/response(用户请求/服务器响应)做前处理以及后处理。Intercepting Filter一般可以用来做某些共通处理比如认证,页面导航,Session管理,国际化或本地化处理,日志等。