錯誤:【No configuration found for the specified action: 'login.action' in namespace: " " 】


今天花了點時間把struts2警告事件徹底的測試了一邊,終於有點眉目了。希望能給其他人帶來一點幫助。文章屬於原創。並不需要轉載的時候注明出處,而是希望轉載的朋友一定要看明白本文內容再轉載,因為我你都清楚,現在去google或百度得到的解決方案多數是一致的,說俗點大家都是相互轉載的,這不是問題,問題是轉載的解決方案有時並不是最理想的答案,簡單的說垃圾信息過多。這造成求知者大量的時間流失。希望轉貼者要對自己及網民負責。

警告信息:

警告: No configuration found for the specified action: '/myNameSpace/login.action' in namespace: ''. Form action defaulting to 'action' attribute's literal value.

struts.xml配置信息(部分)

<package name="packageName" extends="struts-default" namespace="/myNameSpace">
    <action name="login" class="com.jato.srvclink.test.login.LoginAction" method="login"> 

jsp頁面配置信息(部分)

<s:form action="/myNameSpace/login.action">

思考:沒有在''的namespace中發現指定的action '/myNameSpace/login.action' 
答疑:因為配置的struts2標簽並未指定namespace屬性。所以struts2會默認從根命名空間"/"搜索action串'/myNameSpace/login.action',如果搜索不到將進入默認命名空間''搜索action請求串,在默認命名空間中是肯定找不到我們定義的action的,所以,struts2拋出一個警告信息。
但是為什么我們沒有填寫namespace,我們的請求也可以正常訪問呢?

我們來看一下解析后的html
查看源碼得到的html(部分)

<form id="login" onsubmit="return true;" action="/srvclink/myNameSpace/login.action" method="post">

我們看到form提交的action串是准確的url請求,action串確實是/srvclin(應用根)/myNameSpace(命名空間)/login.action。
命名空間中找不到action定義,並不意味着這個action真的不存在,只是我們的代碼有問題而已。還有一點是我們在jsp頁面的action請求中手動的加入了.action后綴。事實上struts2會自動追加.action的,因為我們並沒有合法的使用struts2的標簽,所以struts2這里並沒有給我們追加.action,解析后的代碼中存在的.action,完全是我們手動在jsp頁面填寫的,有疑問的網友可以不手動添加查看html。

我們修改我們的程序代碼

jsp頁面配置信息(部分)修改后加入namespace屬性,修改action屬性值為/login.action

<s:form action="/login.action" namespace="/myNameSpace">

請求頁面后,大家很失望吧?警告依然存在。但是我們看一下警告信息。

警告信息:

警告: No configuration found for the specified action: '/login.action' in namespace: '/myNameSpace'. Form action defaulting to 'action' attribute's literal value.

沒有在'/myNameSpace'的namespace中發現指定的action '/login.action' 

毫無疑問,這里的警告和第一次的警告信息截然不同。我們現在存在命名空間,'/myNameSpace'能夠被struts2檢索到,並不是開始的''。那問題的關鍵在哪里呢?
在namespace中沒有發現指定的action '/login.action' ???

我們來看一下struts.xml中的配置:

struts.xml配置信息(部分)

<package name="packageName" extends="struts-default" namespace="/myNameSpace">
    <action name="login" class="com.jato.srvclink.test.login.LoginAction" method="login">

是的,我們'/myNameSpace'命名空間下,只有action名字為'login'的定義,並沒有所謂的 '/login.action' 定義,所以struts2的警告並未錯。如果大家對這個抱有懷疑,可以修改action的名字'login'為‘/longin.action’
<action name="/login.action" class="com.jato.srvclink.test.login.LoginAction" method="login">
請求頁面時你會發現不在報警告信息,原因很簡單。因為在命名空間為'myNameSpace'下確實存在命名為'/login.action'的action。

我們再次修改配置文件

jsp頁面配置信息(部分)修改后action屬性值為longin

<s:form action="login" namespace="/myNameSpace">

請求頁面時,我們發現不再有警告信息了。

如果你有足夠細心,我想你應該可以徹底的明白為什么struts2會報警了吧?你也應該明白了使用struts2標簽action中添加/線后請求反而報錯的原因了。


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM