Front Controller
a. 問題
MVC給出了一個整個應(yīng)用的松散的耦合架構(gòu)。現(xiàn)在來看一下這樣一個經(jīng)常發(fā)生的情況。在某一個應(yīng)用中,用戶看到的視圖和他所做的操作密切相關(guān)。這是一些具有高度交互性的頁面,而這些頁面之間含有高度的依賴性。在沒有任何模式的時候,這個應(yīng)用只是一個許多獨立的頁面的集合,維護和擴展變得異常困難。
§ 當(dāng)一個頁面移動后,其他含有這個頁面鏈接的文件,都必須修改。
§ 當(dāng)有一系列頁面需要口令保護時,許多配置文件需要修改,或者頁面需要包含新的標(biāo)記。
§ 當(dāng)一個頁面需要一個新的表示層時,頁面中的標(biāo)記要被重新安排。
當(dāng)這個系統(tǒng)變得復(fù)雜時,這些問題將變得更糟。如果用MVC來解決的話,就變成一個如何管理控制器和視圖之間交互的問題。
b. 建議的解決方法
前臺控制模式可以解決這個問題。這個模式中,所有的請求都被傳送到一個對象中。這個主要的對象將處理所有的請求,決定以后顯示那一個視圖,以及實現(xiàn)必要的安全需求。對于把視圖顯示以及其他功能實現(xiàn)集中到一個主要的對象中,將使修改變得很容易,對應(yīng)用的修改,可以在所有視圖中反映出來。
c. 要點
§ 這個模式對于需要在多個含有動態(tài)數(shù)據(jù)的頁面之間進(jìn)行復(fù)雜導(dǎo)航的系統(tǒng)來說,是很有效的。
§ 這個模式對于要在所有頁面中都包含模板,轉(zhuǎn)換等的應(yīng)用來說,也是很有效的。
§ 由于視圖的選擇集中在前端控制器上,因此,視圖的導(dǎo)航變得更加容易理解和便于配置。
§ 視圖重用和變更會更加容易。
§ 視圖之間的復(fù)雜交互,使得控制器變得復(fù)雜。從而,當(dāng)應(yīng)用發(fā)展的時候,控制器將變得難以維護。不過,大部分情況下可以用XML映射來解決。
§ 實現(xiàn)應(yīng)用要求的安全性檢驗變得很簡單。
§ 這個模式不適合小型的,只顯示靜態(tài)內(nèi)容的應(yīng)用。
d. 樣例
§ RequestMappings.xml 文件映射了傳入的請求,處理器以及下一個頁面。
useRequestHandler="true"
requiresSecurityCheck="true" nextScreen="screen2.jsp">
com.blah1.blah2.blah3.request1Handler
以上這個文件是控制器的指定配置,控制器的代碼如下:
§ FrontControllerImpl.java 利用上面的XML實現(xiàn)了控制器
// 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"
}
}
用這種方法實現(xiàn)的控制器將很容易維護,當(dāng)應(yīng)用有新的變動的時候,只要修改XML文件就能解決了。前臺控制模式將使在視圖和控制器之前有復(fù)雜交互的J2EE應(yīng)用變得簡單。
MVC給出了一個整個應(yīng)用的松散的耦合架構(gòu)。現(xiàn)在來看一下這樣一個經(jīng)常發(fā)生的情況。在某一個應(yīng)用中,用戶看到的視圖和他所做的操作密切相關(guān)。這是一些具有高度交互性的頁面,而這些頁面之間含有高度的依賴性。在沒有任何模式的時候,這個應(yīng)用只是一個許多獨立的頁面的集合,維護和擴展變得異常困難。
§ 當(dāng)一個頁面移動后,其他含有這個頁面鏈接的文件,都必須修改。
§ 當(dāng)有一系列頁面需要口令保護時,許多配置文件需要修改,或者頁面需要包含新的標(biāo)記。
§ 當(dāng)一個頁面需要一個新的表示層時,頁面中的標(biāo)記要被重新安排。
當(dāng)這個系統(tǒng)變得復(fù)雜時,這些問題將變得更糟。如果用MVC來解決的話,就變成一個如何管理控制器和視圖之間交互的問題。
b. 建議的解決方法
前臺控制模式可以解決這個問題。這個模式中,所有的請求都被傳送到一個對象中。這個主要的對象將處理所有的請求,決定以后顯示那一個視圖,以及實現(xiàn)必要的安全需求。對于把視圖顯示以及其他功能實現(xiàn)集中到一個主要的對象中,將使修改變得很容易,對應(yīng)用的修改,可以在所有視圖中反映出來。
c. 要點
§ 這個模式對于需要在多個含有動態(tài)數(shù)據(jù)的頁面之間進(jìn)行復(fù)雜導(dǎo)航的系統(tǒng)來說,是很有效的。
§ 這個模式對于要在所有頁面中都包含模板,轉(zhuǎn)換等的應(yīng)用來說,也是很有效的。
§ 由于視圖的選擇集中在前端控制器上,因此,視圖的導(dǎo)航變得更加容易理解和便于配置。
§ 視圖重用和變更會更加容易。
§ 視圖之間的復(fù)雜交互,使得控制器變得復(fù)雜。從而,當(dāng)應(yīng)用發(fā)展的時候,控制器將變得難以維護。不過,大部分情況下可以用XML映射來解決。
§ 實現(xiàn)應(yīng)用要求的安全性檢驗變得很簡單。
§ 這個模式不適合小型的,只顯示靜態(tài)內(nèi)容的應(yīng)用。
d. 樣例
§ RequestMappings.xml 文件映射了傳入的請求,處理器以及下一個頁面。
useRequestHandler="true"
requiresSecurityCheck="true" nextScreen="screen2.jsp">
com.blah1.blah2.blah3.request1Handler
以上這個文件是控制器的指定配置,控制器的代碼如下:
§ FrontControllerImpl.java 利用上面的XML實現(xiàn)了控制器
// 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"
}
}
用這種方法實現(xiàn)的控制器將很容易維護,當(dāng)應(yīng)用有新的變動的時候,只要修改XML文件就能解決了。前臺控制模式將使在視圖和控制器之前有復(fù)雜交互的J2EE應(yīng)用變得簡單。
posted on 2005-01-30 12:52 jacky 閱讀(285) 評論(0) 編輯 收藏 所屬分類: Design Patten