問題引入
通常在form表單輸入數據提交前,會進行輸入的驗證和限制,比如登陸時賬戶和密碼不能爲空,註冊時兩次輸入密碼必須一致……一般可用JS進行控制。而struts2中提供了更爲便捷的方法。
使用Action的validate()方法
1.Action繼承ActionSupport
2.在Action中覆寫validate()方法
3.在validate()方法中使用addFieldError()方法,配置struts.xml文件。
源代碼
UserAction.java
package org.dny.action;
import org.dny.model.User;
import com.opensymphony.xwork2.ActionSupport;
import com.opensymphony.xwork2.ModelDriven;
public class UserAction extends ActionSupport implements ModelDriven<User>{
private User user;
@Override
public User getModel() {
if(this.user == null)
this.user = new User();
return this.user;
}
public String login() { //登錄
System.out.println("UserAction login");
System.out.println("userName:"+user.getUserName());
System.out.println("paswword:"+user.getPassword());
return "loginSuccess";
}
@Override
public void validate() { //在Action的所有其他函數之前函數之前執行,進行驗證
System.out.println("UserAction validate");
if(user.getUserName() == null || user.getUserName().trim().equals(""))
this.addFieldError("userName", "帳號不能爲空"); //給userName屬性添加錯誤消息“帳號不能爲空”
if(user.getPassword() == null || user.getPassword().trim().equals(""))
this.addFieldError("password", "密碼不能爲空");
}
}
1.函數addFieldError(“字段名”,”錯誤信息”):給一個字段(屬性)添加錯誤消息
2.點擊登錄,調用Action的login()方法。而在Action的login()方法執行之前,會先執行validate()方法。
3.如果在validate()方法中執行了addFieldError()或者addActionError()方法,則Action不會執行login()方法,而是直接跳轉到一個名爲”input”的result視圖。
struts.xml文件的action配置:
<action name="user_*" class="org.dny.action.UserAction" method="{1}">
<result name="loginSuccess">/success.jsp</result>
<result name="input">/index.jsp</result>
</action>
1.當登錄成功時,會跳轉到success.jsp頁面
2.當輸入沒有通過validate()函數的驗證時,會跳轉到首頁。
index.jsp頁面:
<body>
<center>
<!-- 普通的表單提交 -->
<form action="user_login" method="post">
<table>
<tr>
<td>帳號:</td>
<td><input type="text" name="userName"></td>
<td>
<!-- 通過EL表達式取出 fieldErrors中userName的值 -->
${fieldErrors['userName'][0]}
</td>
</tr>
<tr>
<td>密碼:</td>
<td><input type="password" name="password"></td>
<td>
<!-- 通過EL表達式取出 fieldErrors中password的值 -->
${fieldErrors['password'][0]}
</td>
</tr>
<tr>
<td></td>
<td align="left"><input type="submit" value="登錄"> <input
type="reset" value="重置">
</tr>
</table>
</form>
</center>
<hr>
<center>
<!-- 通過EL表達式取出 fieldErrors中全部的錯誤消息 -->
${fieldErrors}<br>
<!-- 通過struts標籤取出fielderror中全部的錯誤消息 -->
<s:fielderror />
</center>
<hr>
<center>
<!-- 使用struts提供的標籤的表單,可以在每一個textfield前面顯示錯誤信息 -->
<s:form action="user_login" method="post">
<s:textfield name="userName" label="帳號" />
<s:textfield name="password" label="密碼" />
<s:submit value="提交"></s:submit>
</s:form>
</center>
<hr>
<center>
<s:debug/>
</center>
</body>
1.要使用struts標籤,還需在頁面首部上加上:
<%@ taglib prefix="s" uri="/struts-tags"%>
2.錯誤信息fieldErrors既可以由EL表達式取得,又可以由struts標籤<s:fielderror />
取得。
3.使用<s:form></form>
的好處:如果驗證錯誤,錯誤信息會直接顯示在對應屬性的textfield前面。
運行結果及截圖
1.驗證通過,登錄成功的情況:
2.驗證失敗,重新跳轉到index.jsp的情況:
點擊debug標籤: