最近學(xué)習struts2 中時(shí)候控制臺老是出現該警告錯誤。
我的客戶(hù)端代碼如下 (代碼1):
struts.xml中的配置代碼如下 (代碼2):
在網(wǎng)上搜索了下,搜索網(wǎng)絡(luò )給出的答案幾乎都說(shuō)把<s:form action="/admin/login method="post" >中的login后加上.action后綴了,做了測試,問(wèn)題仍然沒(méi)有解決。
通過(guò)我觀(guān)察發(fā)現有兩個(gè)地方需要修改,首先<s: form>表單中需要加入命名空間參數namespace,和struts.xml中配置一致。其次,<s:form action=xxx> 中直接寫(xiě)action映射的名字,比如我的xml中是login,則這里直接寫(xiě)login即可,不需要畫(huà)蛇添足加上.action后綴或者其他的前置路路徑,所以修改后的客戶(hù)端文件配置為 代碼(3):
當然,如果你不是使用的struts2的標簽,而是使用的傳統的html代碼,則表單的action屬性必須加上完整的路徑和后綴
也就是說(shuō),必須改成如下代碼:
<form name="form" method="post" action="/admin/login.action">
你如上指定后,當瀏覽器給出如上的請求/admin/login.action ,struts2框架將首先在sturts.xml中查找 /admin 名稱(chēng)空間,如果找到了(比如我這里顯然有這個(gè)名稱(chēng)空間),則執行login.action,如果沒(méi)有找到,會(huì )到默認的名稱(chēng)空間中查找,如果默認的也沒(méi)有,則提示錯誤,沒(méi)有映射該action.
分析下我出現的錯誤,在我的原始的代碼 (代碼1)中因為沒(méi)有指定namespace,那么框架認為輸出表單的請求和提交表單的請求都是在一個(gè)名稱(chēng)空間中,即使在/admin名稱(chēng)空間中,此事雖然可以找到,可以運行,但是會(huì )提示這個(gè)警告.
如果在你的struts.xml文件中指定了名稱(chēng)空間,那么,如果在客戶(hù)端使用struts2的標簽,則要同樣指定名稱(chēng)空間,但action= 這后面,直接寫(xiě)action名即可,不需要加上名稱(chēng)空間的前綴在前面。
因為,struts2框架會(huì )根據你所指定的名稱(chēng)空間以及你系統當前應用所映射的路徑,構造一個(gè)完整的請求路徑。比如如上正確的 代碼3的 struts2代碼,在瀏覽器中查看源碼,解析的結果是:
可以看到,輸出的action 請求地址非常正確,自動(dòng)加入了當前應用的名稱(chēng)和根據namespace所整理成的完整的請求路徑:"/guestbook/admin/login.action
但是,假如我們人為的在action后面加上 action="/admin/login" ,雖然你指定了namespace="/admin" ,那struts2框架不會(huì )給你加上.action的后綴(可以查看輸出的html源碼中是沒(méi)有.action這個(gè)后綴的),最后還是會(huì )出現標題中所提示的警告,雖然還是可以正常工作.
所以,我個(gè)人總結為如下:
1. 如果你的xml配置文件中設置了namespace ,建議你的終端的struts2表單標簽中也設置一樣的namespace
2. 如果已經(jīng)按照1中的設置,那么 action = 后面直接寫(xiě)action名字即可,不需要加后綴(默認就會(huì )加上,xml中也一樣)
3. 以上僅是針對使用struts2標簽的情況下,如果你沒(méi)用struts2 的標簽而是使用的原始HTML標簽,則action=后面必須是完整的路徑地址: /應用名/名稱(chēng)空間/xxx.action (action 后綴要有),因為很顯然,struts2不會(huì )給你自動(dòng)加上那些信息。
顯然這個(gè)錯誤是在使用struts標簽時(shí)產(chǎn)生的,
原因是沒(méi)有在struts.xml中配置action或在form標簽中使用了匿名的namespace所致
聯(lián)系客服