上篇action代碼中省略了一些屬性的get/set方法。
4. fruit.jsp響應(yīng)結(jié)果的頁(yè)面
<body>
<!-- 結(jié)果頁(yè)面 -->
計(jì)算結(jié)果:<s:property value="fruit" />
</body>
1.2Action配置method屬性(示列與以上代碼大多一致,只修改有變更的):將Action類(lèi)中的每一個(gè)處理方法都定義成一個(gè)邏輯Action方法。
1. index.jsp頁(yè)面
<body>
<!-- Action配置method屬性 使用:Struts2標(biāo)簽也可以使用HTML標(biāo)簽 -->
<s:form name="form" theme="simple" >
num1:<s:textfield name="num1" />
num2:<s:textfield name="num2" />
<s:submit type="button" value="加" onclick="computeMethod('addAction')" />
<s:submit type="button" value="減" onclick="computeMethod('subtractAction')" />
</s:form>
<!-- js -->
<script type="text/javascript">
function computeMethod(op){
document.form.action=op;//動(dòng)態(tài)選擇處理請(qǐng)求的方法
document.form.submit();//提交
}
</script>
</body>
2. struts.xml配置信息
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE struts PUBLIC "-//Apache Software Foundation//DTD Struts Configuration 2.1//EN" "struts-2.1.dtd" >
<struts>
<package name="struts2" extends="struts-default">
<action name="addAction" class="com.struts.ComputeAction" method="add" >
<result name="fruitPage" >/fruit.jsp</result>
</action>
<action name="subtractAction" class="com.struts.ComputeAction" method="subtract" >
<result name="fruitPage" >/fruit.jsp</result>
</action>
</package>
</struts>
通過(guò)action元素的method屬性來(lái)指定Action執(zhí)行時(shí)調(diào)用的方法。
<li>優(yōu)點(diǎn):使得以更加安全的方式來(lái)實(shí)現(xiàn)動(dòng)態(tài)方法的調(diào)用,不讓別人看到你的實(shí)現(xiàn)方法。
<li>缺點(diǎn):繁瑣,一個(gè)處理請(qǐng)求的方法要跟一個(gè)action。
Struts2根據(jù)method屬性查找方法有兩種途徑:
1.查找與method屬性值完全一致的方法 2.查找doMethod形式的方法
使用動(dòng)態(tài)方法調(diào)用和method屬性的區(qū)別:
1.通過(guò)以上三個(gè)struts.xml中的配置信息例子來(lái)說(shuō),他們的共同點(diǎn)是都在操作同一個(gè)Action。 2.<form action="">中請(qǐng)求地址不同。 3.動(dòng)態(tài)方法的返回值相同,則會(huì)通過(guò)result進(jìn)入一個(gè)頁(yè)面。而method屬性就算兩個(gè)方法的返回值相同但進(jìn)去不同的result,可能會(huì)進(jìn)入兩個(gè)不同的頁(yè)面。
由上可以分析出:
(1)如果使用同一個(gè)Action,不同的處理請(qǐng)求的方法,響應(yīng)使用相同的配置(result等)則使用動(dòng)態(tài)方法調(diào)用。 (2)如果使用同一個(gè)Action,不同的處理請(qǐng)求的方法,響應(yīng)分別使用不同的配置,則使用action元素的method屬性,為同一個(gè)Action配置多個(gè)名稱(chēng)。
1.3 使用通配符映射(wildcard mappings)方式(示列與以上代碼大多一致,只修改有變更的):
1. index.jsp頁(yè)面和method一樣
2.struts.xml的配置信息 在使用method屬性來(lái)實(shí)現(xiàn)同一個(gè)Action的不同方法處理不同的請(qǐng)求時(shí),會(huì)發(fā)現(xiàn),隨著方法的增多,從而導(dǎo)致大量的Action配置,這時(shí)我們就需要通過(guò)使用通配符來(lái)解決Action配置過(guò)多的方法。 在配置<action.../>元素時(shí),需要指定name、class、method屬性。其中name屬性可支持通配符,然后可以在class、method屬性中使用表達(dá)式。通配符用星號(hào) * 表示。
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE struts PUBLIC "-//Apache Software Foundation//DTD Struts Configuration 2.1//EN" "struts-2.1.dtd" >
<struts>
<package name="struts2" extends="struts-default">
<action name="*Action" class="com.struts.ComputeAction" method="{1}" >
<result name="fruitPage" >/fruit.jsp</result>
<!-- <result name="fruitPage" >/{1}.jsp</result>表達(dá)式也可以寫(xiě)在這里 -->
</action>
</package>
</struts>
2.默認(rèn)Action:
在瀏覽器輸入一個(gè)不存在的Action,頁(yè)面將呈現(xiàn)404錯(cuò)誤,為了網(wǎng)站更友好,我們可以設(shè)置一個(gè)默認(rèn)的Action。 注意:有一部份的朋友在某個(gè)自定義的action中定義default-action-ref這個(gè)配置的時(shí)候,認(rèn)為在地址欄中輸入地址如http://localhost:8080/project的時(shí)候(project為項(xiàng)目名),如果該項(xiàng)目后面不輸入任何名字或者輸錯(cuò)地址,則會(huì)自動(dòng)進(jìn)入default-action-ref定義的action并進(jìn)入對(duì)應(yīng)的類(lèi)方法中進(jìn)行操作并根據(jù)result返回頁(yè)面,但是很多人發(fā)現(xiàn)結(jié)果并不是這樣,而不管怎樣都返回進(jìn)入到index.jsp頁(yè)面。 實(shí)際上這一點(diǎn)從原理上來(lái)講可以理解,default-action-ref這個(gè)配置的意思是當(dāng)用戶(hù)在點(diǎn)擊了沒(méi)有定義的action時(shí),如果struts沒(méi)有找到用戶(hù)定義的action名稱(chēng),則會(huì)自動(dòng)跳轉(zhuǎn)到該默認(rèn)定義的action中。 個(gè)人覺(jué)得地址欄中項(xiàng)目后不寫(xiě)名稱(chēng)和名稱(chēng)不存在是兩個(gè)概念。
示列:
1. struts.xml 就在通配符例子中配置上默認(rèn)Action
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE struts PUBLIC "-//Apache Software Foundation//DTD Struts Configuration 2.1//EN" "struts-2.1.dtd" >
<struts>
<package name="struts2" extends="struts-default">
<!-- 配置默認(rèn)Action -->
<default-action-ref name="defaultAction"></default-action-ref>
<action name="defaultAction">
<result>/error.jsp</result>
</action>
<!-- 通配符映射(wildcard mappings) -->
<action name="*Action" class="com.struts.ComputeAction" method="{1}" >
<result name="fruitPage" >/fruit.jsp</result>
<!-- <result name="fruitPage" >/{1}.jsp</result>表達(dá)式也可以寫(xiě)在這里 -->
</action>
</package>
</struts>
2. index.jsp頁(yè)面 這里我們把提交的url :Action地址鏈接,寫(xiě)錯(cuò)打斷,當(dāng)提交時(shí)找不到對(duì)應(yīng)的Action,則會(huì)進(jìn)入默認(rèn)Action,進(jìn)入error.jsp頁(yè)面
<body>
<!-- 使用通配符映射(wildcard mappings)方式 使用:Struts2標(biāo)簽也可以使用HTML標(biāo)簽 -->
<s:form name="form" theme="simple" >
num1:<s:textfield name="num1" />
num2:<s:textfield name="num2" /> <!-- 測(cè)試默認(rèn)Action,當(dāng)提交的Action地址錯(cuò)誤。則會(huì)走默認(rèn)Action -->
<s:submit type="button" value="加" onclick="computeMethod('ssss')" /><!-- 把動(dòng)態(tài)url地址亂寫(xiě) -->
<s:submit type="button" value="減" onclick="computeMethod('subtractActios')" /><!-- 或在url地址中多加字符 -->
</s:form>
<!-- js -->
<script type="text/javascript">
function computeMethod(op){
document.form.action=op;//改動(dòng)只有這里
document.form.submit();//提交
}
</script>
</body>
3. error.jsp 創(chuàng)建此頁(yè)面查看效果
<body>
錯(cuò)誤頁(yè)面。!
未找到,Action實(shí)例時(shí)會(huì)默認(rèn)走此頁(yè)面!
</body>
3.處理結(jié)果
Struts2的Action處理完用戶(hù)請(qǐng)求后,將返回一個(gè)普通字符串,整個(gè)普通字符串就是一個(gè)邏輯視圖名。Struts2通過(guò)配置邏輯視圖名和物理視圖資源之間的映射關(guān)系,一旦系統(tǒng)收到Action返回的某個(gè)邏輯視圖名,系統(tǒng)就會(huì)把對(duì)應(yīng)的物理視圖資源呈現(xiàn)給瀏覽者。
3.1 配置處理結(jié)果:
Struts2的Action處理用戶(hù)請(qǐng)求結(jié)束后,返回一個(gè)普通字符串-邏輯視圖名,必須在struts.xml文件中完成邏輯視圖和物理視圖資源的映射,才可讓系統(tǒng)轉(zhuǎn)到實(shí)際的視圖資源。
Struts2通過(guò)在struts.xml文件中使用<result …/>元素來(lái)配置結(jié)果。Struts2提供了兩種結(jié)果。
局部結(jié)果:將<result …/>作為<action …>元素的子元素配置。
全局結(jié)果:將<result …/>作為<global-results …>元素的子元素配置。
在package元素中配置<global-results>子元素:
全局結(jié)果可滿(mǎn)足一個(gè)包中多個(gè)Action共享一個(gè)結(jié)果:
<!-- 全局結(jié)果可滿(mǎn)足一個(gè)包中多個(gè)Action共享一個(gè)結(jié)果,也就是說(shuō),當(dāng)多個(gè)Action中都有一個(gè)重復(fù)的result時(shí)就可以使用全局結(jié)果,也就是說(shuō)公共的result -->
<global-results>
<result name="fruitPage" type="dispatcher" >/fruit.jsp</result>
</global-results>