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>?
在網上搜索了下,搜索網絡給出的答案幾乎都說把<s:form action="/admin/login method="post" >中的login后加上.action后綴了,做了測試,問題仍然沒有解決。
通過我觀察發現有兩個地方需要修改,首先<s: form>表單中需要加入命名空間參數
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>?
當然,如果你不是使用的struts2的標簽,而是使用的傳統的html代碼,則表單的action屬性必須加上完整的路徑和后綴
也就是說,必須改成如下代碼:
<form name="form" method="post" action="/admin/login.action">
你如上指定后,當瀏覽器給出如上的請求/admin/login.action ,struts2框架將首先在sturts.xml中查找 /admin 名稱空間,如果找到了(比如我這里顯然有這個名稱空間),則執行login.action,如果沒有找到,會到默認的名稱空間中查找,如果默認的也沒有,則提示錯誤,沒有映射該action.
分析下我出現的錯誤,在我的原始的代碼 (代碼1)中因為沒有指定namespace,那么框架認為輸出表單的請求和提交表單的請求都是在一個名稱空間中,即使在/admin名稱空間中,此事雖然可以找到,可以運行,但是會提示這個警告.
如果在你的struts.xml文件中指定了名稱空間,那么,如果在客戶端使用struts2的標簽,則要同樣指定名稱空間,但action= 這后面,直接寫action名即可,不需要加上名稱空間的前綴在前面。
因為,struts2框架會根據你所指定的名稱空間以及你系統當前應用所映射的路徑,構造一個完整的請求路徑。比如如上正確的 代碼3的 struts2代碼,在瀏覽器中查看源碼,解析的結果是:
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 請求地址非常正確,自動加入了當前應用的名稱和根據namespace所整理成的完整的請求路徑:"/guestbook/admin/login.action
但是,假如我們人為的在action后面加上 action="/admin/login" ,雖然你指定了namespace="/admin" ,那struts2框架不會給你加上.action的后綴(可以查看輸出的html源碼中是沒有.action這個后綴的),最后還是會出現標題中所提示的警告,雖然還是可以正常工作.
所以,我個人總結為如下:
1. 如果你的xml配置文件中設置了namespace ,建議你的終端的struts2表單標簽中也設置一樣的namespace
2. 如果已經按照1中的設置,那么 action = 后面直接寫action名字即可,不需要加后綴(默認就會加上,xml中也一樣)
3. 以上僅是針對使用struts2標簽的情況下,如果你沒用struts2 的標簽而是使用的原始HTML標簽,則action=后面必須是完整的路徑地址: /應用名/名稱空間/xxx.action (action 后綴要有),因為很顯然,struts2不會給你自動加上那些信息。
關于(警告: No configuration found for the specified action)解決方案