最近從新看了一下struts2,另外把裏面的一些原理以及相應的知識點複習了一遍,另外看了一下視頻教程。 web
今天在複習default-action-ref的時候遇到了一個問題,由於看了視頻教程,並且在網上查了一下相應的信息,對於package中default-action-ref的用法不少人有着不一樣的意見。有的人認爲這是一個bug。 瀏覽器
我來大體說一下我我的的理解,若是有說到不對的地方,請各位給予建議。 服務器
有一部份的朋友在某個自定義的action中定義default-action-ref這個配置的時候, jsp
認爲在地址欄中輸入地址如http://localhost:8080/project的時候(project爲項目名),若是該項目後面不輸入任 何名字,則會自動進入default-action-ref定義的action並進入對應的類方法中進行操做並根據result返回頁面,可是不少人發現 結果並非這樣,而無論怎樣都返回進入到index.jsp頁面。 spa
實際上這一點從原理上來說能夠理解,default-action-ref這個配置的意思是當用戶在點擊了沒有定義的action時,若是struts沒有找到用戶定義的action名稱,則會自動跳轉到該默認定義的action中。 code
我的以爲地址欄中項目後不寫名稱和名稱不存在是兩個概念, 視頻
好比用戶定義了一個strtus.xml: xml
<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>若是此時地址欄輸入http://localhost:8080/project/aaa或經過連接進入該地址欄,配置文件中並無定義name爲aaa的action,該路徑會自動轉入default-action中。
可是若是用戶輸入http://localhost:8080/project,該請求會首先被項目中web.xml來進行接收,因爲 web.xml中默認指定的頁面是index.jsp,所以不管struts.xml中如何設置,服務器都會先跳轉至index.jsp。緣由其實很簡 單,由於在一個web project中,web.xml爲整個項目的入口。 教程
剛剛本人也試了將web.xml中welcome file定義刪除,默認也會進入index.jsp,所以該配置若是不寫的話,對於用戶來說該部分是透明的。 io
其實你們能夠作一個實驗,就能夠證實這塊的運行過程:
你們能夠把index.jsp修改成其餘名稱,好比aaa,bbb.jsp等。此時在服務器啓動並進行加載的時候,會根據web.xml去尋找所謂 的index.jsp,可是因爲index.jsp已被咱們修更名稱,那麼確定會找不到,並進入到strtus.xml中,這時咱們定義的default-action-ref就能夠起做用了,此時因爲沒有對應的主頁配置,瀏覽器會進入default的引用中進行操做,也就能夠實現直接進入action的操做了。
上述過程本人已經作過實驗,若是有朋友認爲描述或思路有問題,請提出意見,謝謝。