问题
我们使用一个模式,都是为了解决某些问题而使用的。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);
- }
- }