最近重新看了一下struts2,另外把里面的一些原理以及相應的知識點(diǎn)復習了一遍,另外看了一下視頻教程。
今天在復習default-action-ref的時(shí)候遇到了一個(gè)問(wèn)題,因為看了視頻教程,而且在網(wǎng)上查了一下相應的信息,對于package中default-action-ref的用法很多人有著(zhù)不同的意見(jiàn)。有的人認為這是一個(gè)bug。
我來(lái)大致說(shuō)一下我個(gè)人的理解,如果有說(shuō)到不對的地方,請各位給予建議。
有一部份的朋友在某個(gè)自定義的action中定義default-action-ref這個(gè)配置的時(shí)候,
認為在地址欄中輸入地址如http://localhost:8080/project的時(shí)候(project為項目名),如果該項目后面不輸入任何名字,則會(huì )自動(dòng)進(jìn)入default-action-ref定義的action并進(jìn)入對應的類(lèi)方法中進(jìn)行操作并根據result返回頁(yè)面,但是很多人發(fā)現結果并不是這樣,而不管怎樣都返回進(jìn)入到index.jsp頁(yè)面。
實(shí)際上這一點(diǎn)從原理上來(lái)講可以理解,default-action-ref這個(gè)配置的意思是當用戶(hù)在點(diǎn)擊了沒(méi)有定義的action時(shí),如果struts沒(méi)有找到用戶(hù)定義的action名稱(chēng),則會(huì )自動(dòng)跳轉到該默認定義的action中。
個(gè)人覺(jué)得地址欄中項目后不寫(xiě)名稱(chēng)和名稱(chēng)不存在是兩個(gè)概念,
比如用戶(hù)定義了一個(gè)strtus.xml:
[html]
view plaincopy<package name="a" extends="struts-default">
<default-action-ref name="dispatcher" />
<action name="dispatcher" class="com.UserAction" method="dispatcher"> <!-- dispatcher -->
<result type="dispatcher">
/hello.jsp
</result>
</action>
<action name="redirect" class="com.UserAction" method="redirect" > <!-- redirect -->
<result type="redirect">
/hello.jsp
</package>
如果此時(shí)地址欄輸入http://localhost:8080/project/aaa或通過(guò)鏈接進(jìn)入該地址欄,配置文件中并沒(méi)有定義name為aaa的action,該路徑會(huì )自動(dòng)轉入default-action中。
但是如果用戶(hù)輸入http://localhost:8080/project,該請求會(huì )首先被項目中web.xml來(lái)進(jìn)行接收,由于web.xml中默認指定的頁(yè)面是index.jsp,因此無(wú)論struts.xml中如何設置,服務(wù)器都會(huì )先跳轉至index.jsp。原因其實(shí)很簡(jiǎn)單,因為在一個(gè)web project中,web.xml為整個(gè)項目的入口。
剛剛本人也試了將web.xml中welcome file定義刪除,默認也會(huì )進(jìn)入index.jsp,因此該配置如果不寫(xiě)的話(huà),對于用戶(hù)來(lái)講該部分是透明的。
其實(shí)大家可以做一個(gè)實(shí)驗,就可以證明這塊的運行過(guò)程:
大家可以把index.jsp修改為其他名稱(chēng),比如aaa,bbb.jsp等。此時(shí)在服務(wù)器啟動(dòng)并進(jìn)行加載的時(shí)候,會(huì )根據web.xml去尋找所謂的index.jsp,但是由于index.jsp已被我們修改名稱(chēng),那么肯定會(huì )找不到,并進(jìn)入到strtuslxml中,這時(shí)我們定義的default-action-ref就可以起作用了,此時(shí)由于沒(méi)有對應的主頁(yè)配置,瀏覽器會(huì )進(jìn)入default的引用中進(jìn)行操作,也就可以實(shí)現直接進(jìn)入action的操作了。
上述過(guò)程本人已經(jīng)做過(guò)實(shí)驗,如果有朋友認為描述或思路有問(wèn)題,請提出意見(jiàn),謝謝。