Front Controller模式要求在WEB应用系统的前端(Front)设置一个入口控制器(Controller),所有的request请求都被发往该控制器统一处理。Front Controller一般可以用来做一个共通处理比如认证,页面导航,Session管理,国际化或本地化处理等。
我们使用一个模式,都是为了解决某些问题而使用的。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方法调用proce***equest方法,proce***equest方法执行“认证”“session管理”等共通操作,同时结合Command模式调用了业务逻辑。
代码:
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方法调用proce***equest方法,proce***equest方法执行“认证”“session管理”等共通操作,同时结合Command模式调用了业务逻辑。
代码:
- public class SampleController extends HttpServlet {
- protected void proce***equest(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 {
- proce***equest(request, response);
- }
- protected void doPost(HttpServletRequest request,
- HttpServletResponse response)
- throws ServletException, java.io.IOException {
- proce***equest(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);
- }
- }
public class SampleController extends HttpServlet {
protected void proce***equest(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 {
proce***equest(request, response);
}
protected void doPost(HttpServletRequest request,
HttpServletResponse response)
throws ServletException, java.io.IOException {
proce***equest(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);
}
}
转载于:https://blog.51cto.com/77857/151166
FrontController模式通过设置统一的入口控制器来处理所有请求,解决了视图逻辑分散的问题,提高了系统的可维护性和可扩展性。该模式适用于需要进行认证、页面导航等共通处理的场景。
&spm=1001.2101.3001.5002&articleId=91496058&d=1&t=3&u=3511b08da20348e0aae1617a8e83ef2e)
9152

被折叠的 条评论
为什么被折叠?



