SSH框架登入註冊頁面用struts的xml配置方式校驗遇到的問題及解決方法
SSH框架用struts的xml配置進行前臺驗證,驗證登入和註冊頁面遇到的問題及解決方式
一、首先新建struts前臺驗證的配置檔案
命名方式是:類名-validation.xml,我的是LoginAction類和RegisterAction類,所以我的配置檔名為LoginAction-validation.xml和RegisterAction-validation.xml,內容如下:
LoginAction-validation.xml
<?xml version="1.0" encoding="UTF-8"?> <!DOCTYPE validators PUBLIC "-//OpenSymphony Group//XWork Validator 1.0.2//EN" "http://www.opensymphony.com/xwork/xwork-validator-1.0.2.dtd"> <validators> <field name="user.username"> <field-validator type="requiredstring"> <message>提示:使用者名稱不能為空</message> </field-validator> </field> <field name="user.password"> <field-validator type="requiredstring"> <message>提示:密碼不能為空</message> </field-validator> </field> </validators>
RegisterAction-validation.xml
<?xml version="1.0" encoding="UTF-8"?> <!DOCTYPE validators PUBLIC "-//OpenSymphony Group//XWork Validator 1.0.2//EN" "http://www.opensymphony.com/xwork/xwork-validator-1.0.2.dtd"> <validators> <field name="user.username"> <field-validator type="requiredstring" short-circuit="true"> <message>提示:使用者名稱不能為空</message> </field-validator> </field> <field name="user.password"> <field-validator type="requiredstring" short-circuit="true"> <message>提示:密碼不能為空</message> </field-validator> </field> </validators>
二、然後寫好登入註冊頁面(我的登入註冊在jsp中用選項卡切換的),程式碼如下(全部程式碼太多,我只放了登入註冊部分的程式碼):
在jsp頁面中新增<%@ taglib prefix=”s” uri=”/struts-tags”%>,這是struct2的標籤庫
<div class="tab-content"> <div class="tab-content-inner active" data-content="login"> <form action="login"> <div class="row form-group"> <div class="col-md-12"> <label for="username">Username</label> <input type="text" class="form-control" id="username" name="user.username" value="${user.username }"> <span style="color: red"><div><s:fielderror><s:param>user.username</s:param></s:fielderror></div></span> </div> </div> <div class="row form-group"> <div class="col-md-12"> <label for="password">Password</label> <input type="password" class="form-control" id="password" name="user.password" value="${ user.username}"> <span style="color: red"><div><s:fielderror><s:param>user.password</s:param></s:fielderror></div></span> </div> </div> <div class="row form-group"> <div class="col-md-12"> <input type="submit" class="btn btn-primary" value="Login"> </div> </div> </form> </div> <div class="tab-content-inner" data-content="signup"> <form action="register"> <div class="row form-group"> <div class="col-md-12"> <label for="username">Username</label> <input name="user.username" type="text" class="form-control" id="username"> <span style="color: red"><div><s:fielderror><s:param>user.username</s:param></s:fielderror></div></span> </div> </div> <div class="row form-group"> <div class="col-md-12"> <label for="password">Password</label> <input name="user.password" type="password" class="form-control" id="password"> <span style="color: red"><div><s:fielderror><s:param>user.password</s:param></s:fielderror></div></span> </div> /div> <div class="row form-group"> <div class="col-md-12"> 性別<s:select list="#{'1':'男','0':'女'}" listKey="key" listValue="value" name="user.gender" label="性別" value="1" ></s:select> </div> </div> <div class="row form-group"> <div class="col-md-12"> <input type="submit" class="btn btn-primary" value="Sign up"> </div> </div> </form> </div> </div>
裡面由於樣式比較多,所以看起來有點複雜,只看input標籤和s:fielderror標籤即可。
三、然後在struts.xml配置檔案中配置result 是input的跳轉頁面
<!-- 註冊 -->
<action name="register" class="regAction">
<result name="input">/CeShiLogin.jsp</result>
<result name="success">/RegisterSuccess.jsp</result>
<result name="error">/Fail.jsp</result>
</action>
<!-- 登入 -->
<action name="login" class="logAction">
<result name="input">/CeShiLogin.jsp</result>
<result name="success">/jishiben.jsp</result>
<result name="error">/Fail.jsp</result>
</action>
四、(遇到的問題)執行程式,點選登入按鈕,多點幾次登入按鈕,提示資訊會累加出現。並且在登入頁面為空時點登入按鈕出現提示資訊後,再輸入正確的使用者名稱和密碼點選登入按鈕,不會跳轉到主頁面,會跳轉到登入頁面(如下圖)
解決方法
遇到這個問題說明在spring配置中bean沒有設定scope,scope用來宣告IOC容器中的物件應該處的限定場景或者說該物件的存活空間,即在IOC容器中物件進入相應的scope之前,生成並裝配這些物件,在該物件不再處於這些scope的限定之後,容器通常會銷燬這些物件。我們如果想讓每次驗證都只出現一條提示資訊而不是累加,則在spring配置檔案中相應的bean後面加上scope屬性。
(常用的scope屬性有兩個singleton和prototype。singleton (單一例項)一個容器中只存在一個例項,所有對該型別bean的依賴都引用這一單一例項;prototype,容器在接受到該型別的物件的請求的時候,會每次都重新生成一個新的物件給請求方,雖然這種型別的物件的例項化以及屬性設定等工作都是由容器負責的,但是隻要準備完畢,並且物件例項返回給請求方之後,容器就不在擁有當前物件的引用,請求方需要自己負責當前物件後繼生命週期的管理工作,包括該物件的銷燬。也就是說,容器每次返回請求方該物件的一個新的例項之後,就由這個物件“自生自滅”了。)
<!-- 使用者註冊的Action -->
<bean id="regAction" class="com.ynwi.ssh.action.RegisterAction" scope="prototype">
<property name="userManager">
<ref bean="userManager" />
</property>
</bean>
<!-- 使用者登入的Action -->
<bean id="logAction" class="com.ynwi.ssh.action.LoginAction" scope="prototype">
<property name="userManager">
<ref bean="userManager" />
</property>
</bean>
五、執行程式
執行程式,為空時不管點多少次登入按鈕都只顯示一條提示資訊(註冊和登入一樣)
當輸入正確的使用者名稱和密碼,則正常跳轉到主頁面
主頁面:
至此,structs的xml配置前臺校驗就完成了。