當時我正在學習Struts2的使用,當時就是用Struts2框架寫一個登錄的功能,按照網上的教程一步一步的操作,終於全部步驟都弄好了,見證奇跡的時刻要來了,可是當我填寫完用戶名和密碼之后,點擊登錄,卻出現上面的那個圖,這讓我很失望啊,而且就是這個錯誤,花了我一個晚上才弄明白了。
實際上,是有兩個錯誤在里面的。
- 在struts.xml配置文件中,action的值,我當時寫是action=“login”,如下所示:
<?xml version="1.0" encoding="UTF-8" ?> <!DOCTYPE struts PUBLIC "-//Apache Software Foundation//DTD Struts Configuration 2.1//EN" "http://struts.apache.org/dtds/struts-2.1.dtd"> <struts> <package name="struts2" extends="struts-default"> <action name="login" class="com.test.action.LoginAction"> <result name="success">/success.jsp</result> <result name="fail">/fail.jsp</result> </action> </package> </struts>
網上找了各種方法都沒解決,最后才知道,實際上,login是struts里的一個保留字,不能使用,因此換一個就好了,我就換成action=“userlogin”,果然就好使了,這都是經驗不夠豐富啊。當然可能有其他的人也會碰到這個問題,但原因不一定跟我相同,有的網友說要在action標簽里加上namespace=“/”,這個方法也是這種問題的一個解決方法吧,只不過我遇到的不是這種情況。
- action類里的字段的值都為null。誒,出現這個問題也是怪我自己太不小心了,是我在寫username字段的get方法時把getUsername寫成了getUesrname,真是粗心啊。我開始還在懷疑是不是Struts2框架在數據封裝上出現問題了,所以就一直找Struts是如何進行數據封裝的相關問題,但最終也沒找原因,不過這也沒白費功夫,這讓我了解到了Struts2的數據封裝有好幾種方式,而不僅僅是我所知道的屬性驅動方式,同時也知道了雖然Struts2框架中,action只是普通的java類,並不強制要求實現Action接口或繼承ActionSupport類,但是繼承ActionSupport類可以方便我們的action開發,它可以對表單數據進行數據校驗(重寫validate()方法)和校驗信信息國際化(getText()方法)。更詳細的請參考博文Struts2 繼承ActionSupport的用處