Struts是基於Model
實現的技術框架
Model
是經典的MVC(Model
View
Control)模型的Web應用變體
這個改變主要由於HTTP協議的無狀態性引起的
Model
的目的和MVC一樣
也是利用控制器來分離模型和視圖
達到不同層間松散耦合的效果
提高系統靈活性
復用性和可維護性
在多數情況下
你可以將Model
與MVC等同起來
圖
表示一個基於Java技術典型的MVC網絡應用
從中可以看出MVC中的各個部分對應於J
EE哪些實現技術
圖 MVC和JEE技術 在利用Model
之前
我們把所有的表示邏輯和業務邏輯都集中在一起(如我們前兩個專題中的login
jsp)
有時也稱這種應用模式為Model
Model
的主要缺點就是緊耦合
復用性差
維護成本高
由於Struts就是基於Model
實現的框架
所以它底層的機制也是MVC
我們通過圖
描述Struts的具體實現
圖 Struts MVC實現 .框架初始化
Struts框架總控制器(ActionServlet)完成所有初始化工作
總控制器是一個Servlet
它通過web
xml配置成自動啟動的Servlet
讀取配置文件(struts
config
xml)的配置信息
為不同的Struts模塊初始化相應的ModuleConfig對象
配置文件中的Action映射定義都保存在ActionConfig集合中
配置文件中其他配置信息分別保存在ControlConfig集合
FormBeanConfig集合
ForwardConfig集合和MessageResourcesConfig等集合中
要特別指出的是
初始化動作在Web容器啟動時自動完成
初始化完成後
它將通過URL匹配映射截獲所有以
do結尾的URL請求
.客戶端發送一個HTTP請求
用戶通過提交表單或調用URL向Web應用程序器提交一個請求
請求的數據用HTTP協議上傳給Web服務器
.總控制器接截獲這個請求並實例化Form Bean
控制器接收HTTP請求
並從ActionConfig中找出對應該請求的Action子類
如果沒有對應的Action
控制器直接將請求轉發給JSP或者靜態頁面
如果有對應的Action且這個Action有一個相應的Action Form
ActionForm被實例化並用HTTP請求的數據填充其屬性
然後保存在Servlet Context中(request或session中)
這樣它們就可以被其它Action對象或者JSP調用
此外
還可以在ActionForm填充數據後還可以調用validate()進行數據有效性自檢
並且可以返回一個包含所有錯誤信息的ActionErrors對象
如果ActionErrors不空
總控制器直接將請求返回到入口頁面
.控制器將請求轉交給具體的Action處理
控制器根據配置信息將請求切換到具體的Action
這個Form Bean也一並傳給這個Action的execute()方法
.Action完成具體的業務邏輯操作
Action很簡單
一般只包含一個execute方法
它負責執行相應的業務邏輯
如果需要
它也可能進行相應的數據檢查
執行完成之後
返回一個ActionForward對象
控制器通過該ActionForward對象來進行轉發工作
.Action返回目標響應對象給總控制器
Action根據業務處理的不同結果返回一個目標響應對象給總控制器
這個目標響應對象對應一個具體的JSP頁面或另外一個Action
.總控制器將HTTP請求轉換到目標響應對象中
總控制器根據業務功能Action返回的目標響應對象
將HTTP請求轉換到這個目標響應對象中
一般情況下
它是一個具體的JSP頁面
.目標響應對象將結果展現給用戶
目標響應對象(JSP)將結果頁面展現給用戶
客戶端發送一個HTTP請求
通過Struts框架最後獲得一個HTTP響應
這一過程非常重要
它是理解Struts框架的重點
圖
描述了Struts框架的結構
而圖
通過一個活動圖更具體描述接受請求直至返回響應的整個過程
圖 Struts接受並返回響應的中間過程 Struts新增功能 多模塊的支持
我們知道
在Struts
中
只能在web
xml中為ActionServlet指定一個Struts配置文件(struts
config
xml)
這對一個只需一兩個人開發的小系統當然沒有任何問題
但如果一個多人開發的大中型應用程序
問題就產生了
因為許多開發人員可能同時都需要修改Struts配置文件
這樣肯定會造成一定程度的資源爭奪
可能會出現彼此覆蓋的情況
這樣勢必會影響開發效率並引起開發人員的抱怨
在Struts
中
為了解決這個並行開發的問題
提出了兩種解決方案
·多個配置文件
支持多個配置文件
是指你能夠為ActionServlet同時指定多個xml配置文件
文件之間以逗號分隔
請看下面web
xml中關於多個struts配置文件的聲明示例
代碼清單
多個struts配置文件
<servlet>
<servlet
name>action</servlet
name>
<servlet
class>org
apache
struts
action
ActionServlet</servlet
class>
<init
param>
<param
name>config</param
name>
<param
value>
/WEB
INF/struts
config
xml
/WEB
INF/book
struts
config
xml
</param
value>
</init
param>
<load
on
startup>
</load
on
startup>
</servlet>
通過這種方法
你可以為每一個模塊定義一個配置文件
由於項目一般按模塊劃分工作
這樣就大大地減小了沖突的概率
·獨立的模塊
但是
多個配置文件存在一個潛在的問題
不同的配置文件之間會產生沖突
因為在ActionServlet初始化的時候多個配置文件還是要合並到一起
比如
在struts
config
xml中配置了一個名為errorDbAccess的<exception>
而在book
struts
config
xml中也配置了一個同樣的<exception>
這樣就產生沖突了
為了徹底解決這種沖突
Struts
中引進了模塊(Module)的概念
一個模塊就是一個獨立的子系統
對應一個獨立的配置文件
ActionServlet將不同模塊的配置文件保存在各自獨立的ModuleConfig對象中的
下面是兩個獨立模塊的配置方式
代碼清單
多模塊配置方式
…
<init
param>
<param
name>config</param
name>
<param
value>/WEB
INF/struts
config
xml</param
value>
</init
param>
<init
param>
<param
name>config/book</param
name>
<param
value>/WEB
INF/book
struts
config
xml</param
value>
</init
param>
…
通過這種方式
我們配置了兩個模塊
一個模塊名為config
而另一個名為config/book
·動態ActionForm支持
ActionForm表示HTTP頁面表單的數據
可以將其看成視圖頁面數據的服務器映射
它負責保存視圖中的數據供控制器或者其他視圖使用
此外
它還負責數據有效性的驗證
所以Struts
文檔把它比作HTTP和Action之間的防火牆
這足以體現ActionForm在視圖和控制器之間的過濾器作用
由於ActionForm對應於HTTP頁面表單
所以隨著頁面的增多
你的ActionForm將會急聚增加
動態ActionForm(DynaActionForm)即為減少ActionForm的數目被設計出來
利用它你不必創建一個個具體的ActionForm類
只需要在配置文件中配置出所需的虛擬ActionForm
而由Struts框架通過配置文件動態創建這個ActionForm
例如
代碼清單
通過指定<form
bean>的type為
org
apache
struts
action
DynaActionForm
來創建一個動態的ActionForm
loginForm
代碼清單
配置一個動態ActionForm
<form
beans>
<form
bean name=
bookForm
type=
org
apache
struts
action
DynaActionForm
>
<form
property name=
bookId
type=
java
lang
String
/>
<form
property name=
isbn
type=
java
lang
String
/>
<form
property name=
bookName
type=
java
lang
String
/>
<form
property name=
author
type=
java
lang
String
/>
</form
bean>
</form
beans>
DynaActionForm將屬性保存在一個Map對象中
同時提供相應的get(name)和set(name
value)方法
其中參數name是要訪問的屬性名
而value是一個Object
例如要訪問DynaActionForm中bookName的值
可以采用String bookName = (String)get(
bookName
)方法
由於bookName存儲在Map中
所以要進行強制轉換
由於DynaActionForm通過配置文件產生
並沒有一個實體對象類
如果要對動態ActionForm對象進行校驗需要使用DynaValidatorForm
它是DynaActionForm的子類
它能夠提供動態ActionForm和動態表單輸入驗證的功能
檢驗規則在validation
xml配置文件中定義
而這些規則的所對應的實現函數在validator
rules
xml文件中定義
·通過配置方式實現異常處理
Struts
允許以配置方式進行異常處理
配置方式可以避免在Action中通過硬編碼來處理異常
從而提高應用程序異常處理的靈活性和可維護性
一般情況下
一個異常處理對象可以通過以下步驟實現
.
From:http://tw.wingwit.com/Article/program/Java/ky/201311/28937.html