在Design Patterns: Elements of Reusable Object-Oriented Software一書中,作者以smalltalk MVC為例,贊揚了通知/訂閱者(notify/subscribe)協議和觀察者(Observer)模式的使用。其中局的一個經典的例子是對同一數據,系統可能需要不同的顯示視圖,比如條形圖、餅圖、數據表格等等,如下圖:
在Model1模式的web編程中,Model部分可以交給EJB及JDBC實現,而View部分可以由Jsp完成,但是卻沒有合適的工具完成獨立的Contrroller。在Model2的思想提出由Servlet應付控制流,在Struts中Servlet就扮演了Front End Controller的角色。
當客戶端提出請求,ActionServlet響應請求,并且在指定的Struts-Config.xml文件中查到請求對應的Action(Action是Struts引入的一個核心類,作為Back End Controller,在后文會介紹),對已經實例化的Action,ActionServlet為這個新的請求開一個線程,對未實例化的Action,ActionServlet將其實例化。
Action作為Back End Controller可以與Model部分交互,以實現狀態改變或者狀態查詢,Action還將返回下一步的視圖選擇給ActionServlet。ActionServlet根據對應的Struts-Config.xml找到視圖選擇對應物理地址,并把新的View返回給用戶端。
圖4 Struts實現層模式的MVC結構
另一種常見的關于Srtuts實現MVC模式的看法是認為只有ActionServlet是Controller,而把Action看作BusinessLogic。我認為,這種看法是沒有前一種將Action視為Back End Controller的看法合理的,因為Controller部分需要完成的視圖選擇實際上是由Action實現的。