J2EE核心模式 - Front Controller(前端控制器)
2007-12-21 21:46Update
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模式调用了业务逻辑。
代码:
public class SampleController extends HttpServlet {
protected void processRequest(HttpServletRequest
request, HttpServletResponse response)
throws ServletException, java.io.IOException {
String page = null;
try {
//process authority
processAuthority(request, response);
//manage session
processSession(request, response);
// Use a helper object to gather parameter
// specific information.
RequestHelper helper = new
RequestHelper(request);
Command cmdHelper= helper.getCommand();
// Command helper perform custom operation
page = cmdHelper.execute(request, response);
}
catch (Exception e) {
LogManager.logMessage("Error Message HERE");
page = resource.getErrorPage(e);
}
// dispatch control to view
dispatch(request, response, page);
}
protected void doGet(HttpServletRequest request,
HttpServletResponse response)
throws ServletException, java.io.IOException {
processRequest(request, response);
}
protected void doPost(HttpServletRequest request,
HttpServletResponse response)
throws ServletException, java.io.IOException {
processRequest(request, response);
}
protected boolean processAuthority(HttpServletRequest request,
HttpServletResponse response) {
... //authority control code here
}
protected void processSession(HttpServletRequest request,
HttpServletResponse response) {
... //session management code here
}
protected void dispatch(HttpServletRequest request,
HttpServletResponse response,
String page)
throws javax.servlet.ServletException,
java.io.IOException {
RequestDispatcher dispatcher =
getServletContext().getRequestDispatcher(page);
dispatcher.forward(request, response);
}
}
参考资料:
Core J2EE Pattern Catalog
Core J2EE Patterns - Front Controller
- Relative Articles
- J2EE核心模式 - Data Access Object(数据存取对象) - (2008-01-11 23:24)
- J2EE核心模式 - Session Facade(Session外观) - (2008-01-08 23:22)
- J2EE核心模式 - Business Delegate(业务代理) - (2008-01-07 21:11)
- J2EE核心模式 - Composite View(复合视图) - (2007-12-29 10:38)
- J2EE核心模式 - Dispatcher View(视图转发器) - (2007-12-26 22:06)
- J2EE核心模式 - Service to Worker - (2007-12-26 21:52)
- J2EE核心模式 - View Helper(视图协助器) - (2007-12-26 21:39)
- J2EE核心模式 - Intercepting Filter(拦截过滤器) - (2007-12-21 21:17)
- 广告投放与管理系统的功能体系结构分析 - (2007-12-18 21:38)
- 图解EJB的体系结构 - (2007-12-03 21:29)
- MVC模式 - 写在理解J2EE模式的前篇 - (2007-11-24 23:52)
- J2EE核心模式 - 概要 - (2007-11-21 00:04)