其他表示層技術
盡管外觀可以用JSP或Struts的標簽來實現
但你仍然應該考慮融合其他技術來提高組件的重用
減少維護工作量
減少錯誤
特定應用標簽
忽略
使用包含組合頁面
將一個頁面放在一個JSP文件中是一個普遍的設計方法
但是許多應用需要將應用中的不同部分顯示在一個頁面中
例如一個門戶應用需要如下功能
訪問門戶的搜索引擎
訪問門戶的討論區
用戶感興趣的話題
郵件等待指示器
將這些不同的功能交給不同的開發者開發
要完成這個門戶應用是比較容易的
然後你就可以使用包含( include)來
將它們組合到一個頁面中
有三種不同的包含方式
選擇哪種取決於你希望整個輸出在什麼時候整合
<%@ include file=
xxxxx
%>
<jsp:include page=
xxxxx
flush=
true
/>
bean:include
使用Tiles組合頁面
Tiles是一個功能很強的模板庫
它可以將很多tile組合成最終的視圖
以下是設置向導
.創建layout/layout
jsp
它包含標准外觀
<html>
<body>
<tiles:insert attribute=
body
/>
</body>
</html>
.創建你的主頁/index
jsp
<h
>This is my homepage</h
>
.創建文件/WEB
INF/tiles
defs
xml
<tiles
definitions>
<definition
name=
layout
path=
/layout/layout
jsp
>
<put name=
body
value=
/>
</definition>
<definition name=
homepage
extends=
layout
>
<put
name=
body
value=
/index
jsp
/>
</definition>
<tiles
definitions>
.在文件struts
config
xml中設置TilesPlugin
<plug
in
className=
org
apache
struts
tiles
TilesPlugin
>
<set
property
property=
definitions
config
value=
/WEB
INF/tiles
defs
xml
/>
</plug
in>
.在struts
config
xml文件中設置一個Action指向你的主頁
<action path=
/index
type=
org
apache
struts
actions
ForwardAction
parameter=
homepage
/>
圖片渲染組件
一些應用需要動態產生圖片
有兩種方法符合如下需求
產生一個執行Servlet請求的超鏈接 Servlet將使用圖形庫來產生圖片
將JAVA Applet嵌入在HTML頁面中來產生圖片
文本輸出
一些應用需要動態的產生文本(如XML)
因為整個頁面將通過PrinterWriter輸出
我們可以通過設置PrinterWriter的屬性來做到
response
setContentType(
text/plain
); // or text/xml
PrintWriter writer = response
getWriter();
// use writer to render text
return(null);
Struts EL 標簽庫
Struts基本的標簽都是依賴rtexprvalue(runtime scriptlet expression)來動態計算屬性
的值
例如
要根據資源關鍵值打印來自屬性文件中的信息
<bean:message key=
<%= stringvar %>
/> 這樣寫是假定stringvar是JSP中的
腳本變量
如果使用Struts的EL標簽庫就會是如下形式
<bean
el:message key=
${stringvar}
/>
創建控制(Controller)組件 概述
我們已經知道如何去構建Model和View組件
現在我們將集中到Controller組件
Struts包含了一個映射請求URI到Action類的Servlet
因此你編寫WEB應用時在Controller組件這方面要做的工作如下
.編寫AtionForm作為Model和View的中介
.編寫Action(繼承org
apache
struts
action
Action)來處理請求
.為每一個邏輯請求在struts
config
xml
中編寫一個ActionMapping
ActionServlet
對於熟悉MVC架構的人來講
ActionServlet就代表著 C ? Controller
Controller的任務是
.處理用戶請求
.根據用戶請求來決定用戶將要完成什麼任務
.將Model的數據傳到視圖(View)
.選擇合適的視圖響應請求
Controller會將大部分工作放到Request Processor和Action 類中
請求處理器(Request Processor)
RequestProcessor對每個請求做核心處理的地方
它要做的處理如下
processPath - 確定請求的路徑
以備後面的處理檢索ActionMapping
processLocale ? 為請求選擇一個locale
processContent - 設置默認的內容(Content)類型
processNoCache ? 設置響應頭
Pragma
Cache
Control
Expires
processPreprocess - RequestProcessor讓子類重載實現
默認返回真(True)
如果子類重載此方法並返回真
則該請求將繼續處理流程
如果返回假
則意味著你處理了該請求
處理流程直接返回
processMapping - 確定請求所對應路徑的ActionMapping
processRoles - 保證請求的用戶具備特定的角色
processActionForm - 實例化ActioForm並且把它放在適當的作用域中
processPopulate - 用請求中的數據組裝ActionForm
processValidate - 校驗ActionForm中的數據
processForward - 如果映射是一個轉向( Forward)指令
就轉向到特定的路徑
processInclude - 如果映射是一個包含(Include)指令
就將映射指定的路徑的輸出結果包含進來
processActionCreate - 實例化映射指定的Action
processActionPerform ? 執行Action的perform或excute方法
processForwardConfig - 最後RequetProcessor使用Action類返回的ActionForward來選擇下一個資源
大多數的AtionForward將會導航到顯示頁面輸出響應
ActionForm類
一個ActionForm代表著一個與用戶交互的HTML表單
ActionForm中的屬性來存儲表單中的狀態
並且有getter
setter方法來訪問他們
ActionForm可以存儲在session或request的作用域中(默認的是session)
如果ActionForm放在session中記得要實現reset方法
以備每次使用ActionForm時都會初始化
Struts根據請求中的參數設置ActionForm的屬性並且把經過校驗後的ActionForm傳到Action的execute方法
當你在編寫ActionForm時必須堅持如下原則
.ActionForm本身沒有任何特定的方法被實現
僅僅用來表示它是整個框架中一個特定的角色
ActinForm中只有getter
setter方法
並沒有任何商業邏輯
.AtionForm提供標准的校驗機制
如果你重載了ActionForm的validate方法
並且在資源屬性文件中提供了錯誤消息
那麼Struts就會自動校驗表單中的數據
當然你也可以忽略ActionForm中的校驗
在Action類中來實現校驗
.為輸入表單中的每一個輸入定義屬性
輸入域的名稱和ActionForm中屬性的名稱必須符合JAVA規范
例如一個輸入域的名稱username將會導致ActionForm中的setUsername被調用
.也可以為Form中的按鈕或其他控件定義屬性
當提交表單時這將有利於你知道哪個控件被選中了
.把ActionForm當作HTTP和Action之間的防火牆
ActionForm的方法可以校驗所有必須的屬性已經存在了並且包含合理的值
如果校驗失敗請求將不會被Action類處理
.你可能會放一個Bean的實例在ActinForm中
這樣你就會用到嵌套屬性引用
例如
你可能有一個
customer
在ActionForm中
然後在頁面中用
customer
name
來引用屬性
DynaActionForm
維護一個具體的ActionForm是要耗費時間的
特別是ActionForm越來越多並且都是校驗一些簡單的屬性時你可能會感覺到一股挫折感
這個瓶頸通過DynaActionForm會有所減輕
通過在Struts的配置文件中列出屬性
類型和默認值來替代以前的定義一個新類
並且添加getter/setter方法
例如
在struts
config
xml中添加一個UserForm
<form
bean
name=
UserForm
type=
org
apache
struts
action
DynaActionForm
>
<form
property
name=
givenName
type=
java
lang
String
initial=
John
/>
<form
property
name=
familyName
type=
java
lang
String
initial=
Smith
/>
</form
bean>
DynaActionForm支持的數據類型
java
lang
BigDecimal
java
lang
BigInteger
boolean and java
lang
Boolean
byte and java
lang
Byte
char and java
lang
Character
java
lang
Class
double and java
lang
Double
float and java
lang
Float
int and java
lang
Integer
long and java
lang
Long
short and java
lang
Short
From:http://tw.wingwit.com/Article/program/Java/ky/201311/28379.html