a. 問題
MVC給出了一個整個應用的松散的耦合架構?,F在來看一下這樣一個經常發生的情況。在某一個應用中,用戶看到的視圖和他所做的操作密切相關。這是一些具有高度交互性的頁面,而這些頁面之間含有高度的依賴性。在沒有任何模式的時候,這個應用只是一個許多獨立的頁面的集合,維護和擴展變得異常困難。
§ 當一個頁面移動后,其他含有這個頁面鏈接的文件,都必須修改。
§ 當有一系列頁面需要口令保護時,許多配置文件需要修改,或者頁面需要包含新的標記。
§ 當一個頁面需要一個新的表示層時,頁面中的標記要被重新安排。
當這個系統變得復雜時,這些問題將變得更糟。如果用MVC來解決的話,就變成一個如何管理控制器和視圖之間交互的問題。
b. 建議的解決方法
前臺控制模式可以解決這個問題。這個模式中,所有的請求都被傳送到一個對象中。這個主要的對象將處理所有的請求,決定以后顯示那一個視圖,以及實現必要的安全需求。對于把視圖顯示以及其他功能實現集中到一個主要的對象中,將使修改變得很容易,對應用的修改,可以在所有視圖中反映出來。
c. 要點
§ 這個模式對于需要在多個含有動態數據的頁面之間進行復雜導航的系統來說,是很有效的。
§ 這個模式對于要在所有頁面中都包含模板,轉換等的應用來說,也是很有效的。
§ 由于視圖的選擇集中在前端控制器上,因此,視圖的導航變得更加容易理解和便于配置。
§ 視圖重用和變更會更加容易。
§ 視圖之間的復雜交互,使得控制器變得復雜。從而,當應用發展的時候,控制器將變得難以維護。不過,大部分情況下可以用XML映射來解決。
§ 實現應用要求的安全性檢驗變得很簡單。
§ 這個模式不適合小型的,只顯示靜態內容的應用。
d. 樣例
§ RequestMappings.xml 文件映射了傳入的請求,處理器以及下一個頁面。
useRequestHandler="true"
requiresSecurityCheck="true" nextScreen="screen2.jsp">
com.blah1.blah2.blah3.request1Handler
以上這個文件是控制器的指定配置,控制器的代碼如下:
§ FrontControllerImpl.java 利用上面的XML實現了控制器
// all required imports
// exceptions to be caught appropriately wherever applicable
public class FrontControllerImpl extends HttpServlet {
// all required declarations, definitions
private HashMap requestMappings;
public void init() {
// load the mappings from XML file into the hashmap
}
public void doPost(HttpServletRequest request,
HttpServletResponse response)
throws IOException, ServletException
{
doGet(request, response);
}
public void doGet(HttpServletRequest request, HttpServletResponse response)
throws IOException, ServletException {
String currentPage= request.getPathInfo();
// get all mapping info for "currentPage" from the hashmap
// if "securityCheckRequired = true", do the security check
// if "useRequestHandler = true", pass on the incoming request to the specified handler
// forward the results to the given "nextScreen"
}
}
用這種方法實現的控制器將很容易維護,當應用有新的變動的時候,只要修改XML文件就能解決了。前臺控制模式將使在視圖和控制器之前有復雜交互的J2EE應用變得簡單。