strust2的開發步驟
- 編寫一個發送請求的頁面,表單或超連結
-
編寫一個action類
1. 推薦實作action接口或繼承actionsupport
2. 為所有請求參數,包括需要傳到下一個頁面顯示的資料提供filed
并提供相應的setter和getter
3. 要有無參的構造器
4. 處理請求的方法,該方法不能有形參聲明
5. 處理請求的傳回值是String
- 在struts.xml檔案配置action
struts.xml配制方法
- 常量配置
- 包配置和命名空間配置
這種設計是為了企業應用的子產品化開發,把多個配置檔案以include的方式包含進來
- 處理結果的控制
-------------------- | -------根據邏輯視圖跳轉實體視圖2 | | -------根據邏輯視圖跳轉實體視圖1 ^ | 邏輯視圖<-------------------- | | | | 發送請求----->struts分發器---->建立action執行個體,調用execute
- action隻是負責struts2控制器的部分,是以它不能直接生成浏覽者的響應
- action隻會負責處理請求,負責生成響應的視圖元件,通常是JSP頁面,而action會為JSP頁面提供顯示的資料
- 當action處理使用者請求後,控制器根據
元素決定具體使用哪個資源生成響應
<result.../>
- 配置邏輯視圖和實體視圖之間的映射關系是通過result子元素來定義的。每個result定義邏輯視圖和實體視圖之間的一次映射
result使用方法
-
支援的屬性<result .../>
- name:邏輯視圖名。name屬性的預設是success
-
type:指定實體視圖資源的類型。預設值是dispatch,
與dispatch對應的是redirect—-重定向
- 目前的視圖資源類型可能有(不一定是JSP)
- Velocity
- FreeMarker
- JFreeChart
- 報表(JasperReports)
- XSLT
- result的标準格式
<result name="" type>
<param></param>
<param></param>
....
</result>
如果有如下的配置
<result name="邏輯視圖" type="視圖配型">
<param name="location">實體視圖位置<param>
<param name="parse">true<param>----是否解析OGNL表達式的值
</result>
就可以簡化為
- 屬性
-
name:指定邏輯視圖名。
預設是success(題外話:不會偷懶的人不是好的程式員,一個人勤勞并不定是優秀的,重要的是勤奮的由價值,偷懶有時候也是勤奮)
-
type:指定所使用的實體視圖類型
在struts-default.xml中的struts-default抽象包中:
-
<result-types>
<result-type name="chain" class="com.opensymphony.xwork2.ActionChainResult"/>
<result-type name="dispatcher" class="org.apache.struts2.dispatcher.ServletDispatcherResult" default="true"/>
<result-type name="freemarker" class="org.apache.struts2.views.freemarker.FreemarkerResult"/>
<result-type name="httpheader" class="org.apache.struts2.dispatcher.HttpHeaderResult"/>
<result-type name="redirect" class="org.apache.struts2.dispatcher.ServletRedirectResult"/>
<result-type name="redirectAction" class="org.apache.struts2.dispatcher.ServletActionRedirectResult"/>
<result-type name="stream" class="org.apache.struts2.dispatcher.StreamResult"/>
<result-type name="velocity" class="org.apache.struts2.dispatcher.VelocityResult"/>
<result-type name="xslt" class="org.apache.struts2.views.xslt.XSLTResult"/>
<result-type name="plainText" class="org.apache.struts2.dispatcher.PlainTextResult"/>
<result-type name="postback" class="org.apache.struts2.dispatcher.PostbackResult"/>
</result-types>
從以上可知,type的預設值是dispatch。
- 重要的類型
- chain :Action處理完請求之後,轉發到下一個Action繼續處理,形成一個鍊式處理
- dispatch
-
redirect
/********
forward : 依然使用一次請求,位址欄url沒有變化,請求參數和請求屬性都不會丢失
redirect:重新發送一次新的請求,就像在位址欄中重新輸入一個url并回車的效果一樣,位址欄的url變化,請求參數和請求屬性都會丢失
dispatch和redirect的差別也是上面的差別
*********/
- redirectAction:重定向到action
- stream:做檔案下載下傳
- plainText:顯示頁面源碼
- 常用type示例
1、chain
假設在regist的action裡注冊成功之後跳轉到一個浏覽所有使用者的action
<action name="regist" class="registAction">
<result type="chain">userList</result>
</action>
<action name="userList" class="userListAction">
<result ...> .... </result>
</action>
2、redirect
直接“重定向”到新的URL,生成一次新的請求,原有的請求參數請求屬性都會丢失。
與預設的dispatch(“轉發”)相應
3、 dispatch
4、plainText
直接顯示視圖頁面的源代碼
<action name="login" class="loginAction">
<!--當處理方法傳回success,系統跳轉到welcome.jsp-->
<result type="plainText">
<param name="locaiont">/WEB-INF/content/welcome.jsp</param>
<!-- 指定實體視圖資源的編碼字元集-->
<param name="charSet">utf-8</param>
</result>
</action>
一般沒有太大的用處,主要用于顯示源代碼,教學類型的,為了讓學生看到源代碼學習
5、stream —直接生成“二進制”檔案流
- result的兩種形式
1、局部
将
<result .../>
作為
<action>
的子元素,隻對action有效
2、全局
将
<result .../>
用于全局
<global-results>
<result type="">
</result>
</global-results>
1、當全局result配置與局部result配置沖突時,局部result會覆寫全局result
盡量少用全局result,隻有在多個action都具有某個通用性質的result,才考慮全局result
2、不同的result類型,可使用的參數不同
/*********
struts的配置檔案,包括:
struts-default.xml: 核心包使用該配置檔案
struts-plugin.xml: 插件包使用該配置檔案
struts.xml : struts2應用使用該配置檔案
struts-abc.xml : 其他的配置檔案,必須被include加載
**********/
如dispatch的參數有location和parse
需要使用的時候,查閱文檔,
- 動态結果
使用{1},{2}….
例:
通用的action
<action name="*">
<result>
/WEB-INF/content/{1}.jsp
</result>
</action>
{1}比對*所比對的第一個比對值
<action name="*Action">
<result>
/WEB-INF/content/{1}_{2}.jsp
</result>
</action>
Action屬性值決定視圖資源
不僅可以使用{1}…,還可以使用${屬性}
<action name="myPro" class="">
<!--在定義實體視圖資源時,可以直接使用OGNL表達式,是以這個實體視圖可以動态的改變。通過OGNL來計算${res}表達式的值
-->
<result>
/WEB-INF/content/{res}.jsp
</result>
-
動态方法調用(DMI Dynamic Method Invocation)
用法不是特别大,大緻了解
功能:可以在送出請求的時候,直接送出給action的指定方法。
- 未使用DMI:
<form action="myPro" method="post"></form>
上述代碼隻能看出送出給哪個action,而無法看到送出給哪個方法,
具體調用的需要檢視struts.xml
-
使用DMI:
可以直接在action後增加”!method”的形式,來DMI
所謂的DMI其實就是在頁面上指定請求位址為:actionName!methodName<form action="myPro!login" method="post"></form>
缺點:
1、安全性不高
2、沒有必要,完全可以在action元素中指定method來代替動态方法調用
- 未使用DMI:
第一次用markdown的文法寫,總體感覺還是可以,就是有序清單不是很好,或許是自己沒用好,以後多多體會