Html代碼
???
<s:form action="/admin/login" method="post">?
??? <s:textfield name="username" id="usenrame" label="用戶名" />?
??? <s:password name="password" id="password" label="密碼" />??
??? <s:submit type="input" value="登錄" id="btnsubmit" cssClass="btnsubmit"></s:submit>??
??? </s:form>
?
struts.xml中的配置代碼如下 (代碼2):
Xml代碼
???
<package name="admin" namespace="/admin" extends="struts-default">?
??? <action name="login" class="com.longweir.struts2.action.LoginAction">??
?????? <result name="success">/actionResult.jsp</result>??
?????? <result name="login" type="resdirect">/admin/login.jsp</result>??????
?????? <result name="input">/admin/login.jsp</result>?
??? </action>?
??? </package>?
在網(wǎng)上搜索了下,搜索網(wǎng)絡(luò)給出的答案幾乎都說(shuō)把<s:form action="/admin/login method="post" >中的login后加上.action后綴了,做了測(cè)試,問(wèn)題仍然沒(méi)有解決。
通過(guò)我觀察發(fā)現(xiàn)有兩個(gè)地方需要修改,首先<s: form>表單中需要加入命名空間參數(shù)
namespace
,和struts.xml中配置一致。其次,<s:form action=xxx> 中直接寫action映射的名字,比如我的xml中是login,則這里直接寫login即可,不需要畫蛇添足加上.action后綴或者其他的前置路路徑,所以修改后的客戶端文件配置為代碼:
Html代碼
???
<s:form action="login" method="post" namespace="/admin">??
??? <s:textfield name="username" id="usenrame" label="用戶名" />??
??? <s:password name="password" id="password" label="密碼" /> <s:submit type="input" value="登錄" id="btnsubmit"??
??? cssClass="btnsubmit">?
??? </s:submit>??
??? </s:form>?
當(dāng)然,如果你不是使用的struts2的標(biāo)簽,而是使用的傳統(tǒng)的html代碼,則表單的action屬性必須加上完整的路徑和后綴
也就是說(shuō),必須改成如下代碼:
<form name="form" method="post" action="/admin/login.action">
你如上指定后,當(dāng)瀏覽器給出如上的請(qǐng)求/admin/login.action ,struts2框架將首先在sturts.xml中查找 /admin 名稱空間,如果找到了(比如我這里顯然有這個(gè)名稱空間),則執(zhí)行l(wèi)ogin.action,如果沒(méi)有找到,會(huì)到默認(rèn)的名稱空間中查找,如果默認(rèn)的也沒(méi)有,則提示錯(cuò)誤,沒(méi)有映射該action.
分析下我出現(xiàn)的錯(cuò)誤,在我的原始的代碼 (代碼1)中因?yàn)闆](méi)有指定namespace,那么框架認(rèn)為輸出表單的請(qǐng)求和提交表單的請(qǐng)求都是在一個(gè)名稱空間中,即使在/admin名稱空間中,此事雖然可以找到,可以運(yùn)行,但是會(huì)提示這個(gè)警告.
如果在你的struts.xml文件中指定了名稱空間,那么,如果在客戶端使用struts2的標(biāo)簽,則要同樣指定名稱空間,但action= 這后面,直接寫action名即可,不需要加上名稱空間的前綴在前面。
因?yàn)椋瑂truts2框架會(huì)根據(jù)你所指定的名稱空間以及你系統(tǒng)當(dāng)前應(yīng)用所映射的路徑,構(gòu)造一個(gè)完整的請(qǐng)求路徑。比如如上正確的 代碼3的 struts2代碼,在瀏覽器中查看源碼,解析的結(jié)果是:
Html代碼
???
<form id="login" name="/admin" action="/guestbook/admin/login.action" method="post">??
??? <table class="wwFormTable">?
??? <tr>??
??????? <td class="tdLabel">?
??????? <label for="usenrame" class="label">用戶名:</label> </td>??
??????? <td><input type="text" name="username" value="" id="usenrame"/></td>??
?????? </tr>?
?????? <tr>?
??????? <td class="tdLabel"><label for="password" class="label">密碼:</label></td>??
?????? <td><input type="password" name="password" id="password"/></td>?
??? </tr>??
????? <tr> <td colspan="2"><div align="right"><input type="submit" id="btnsubmit" value="登录" class="btnsubmit"/> </div></td>??
?????? </tr>??
??? </table>?
??? </form>?
?
可以看到,輸出的action 請(qǐng)求地址非常正確,自動(dòng)加入了當(dāng)前應(yīng)用的名稱和根據(jù)namespace所整理成的完整的請(qǐng)求路徑:"/guestbook/admin/login.action
但是,假如我們?nèi)藶榈脑赼ction后面加上 action="/admin/login" ,雖然你指定了namespace="/admin" ,那struts2框架不會(huì)給你加上.action的后綴(可以查看輸出的html源碼中是沒(méi)有.action這個(gè)后綴的),最后還是會(huì)出現(xiàn)標(biāo)題中所提示的警告,雖然還是可以正常工作.
所以,我個(gè)人總結(jié)為如下:
1. 如果你的xml配置文件中設(shè)置了namespace ,建議你的終端的struts2表單標(biāo)簽中也設(shè)置一樣的namespace
2. 如果已經(jīng)按照1中的設(shè)置,那么 action = 后面直接寫action名字即可,不需要加后綴(默認(rèn)就會(huì)加上,xml中也一樣)
3. 以上僅是針對(duì)使用struts2標(biāo)簽的情況下,如果你沒(méi)用struts2 的標(biāo)簽而是使用的原始HTML標(biāo)簽,則action=后面必須是完整的路徑地址: /應(yīng)用名/名稱空間/xxx.action (action 后綴要有),因?yàn)楹茱@然,struts2不會(huì)給你自動(dòng)加上那些信息。
關(guān)于(警告: No configuration found for the specified action)解決方案