一、使用ActionSupport編碼實現驗證
1、在Action類的業務方法中直接驗證
示例代碼(JavaBean方式獲取數據)
- 用戶提交數據頁面
<s:form action="error01" method="post">
<s:textfield name="user.uname" id="uname">用戶名:</s:textfield>
<p/>
<s:password name="user.pwd" id="pwd">密碼:</s:password>
<br/>
<s:submit value="提交"></s:submit>
</s:form>
- action配置
<action name="error01" class="com.pb08.demo01.UserAction">
<result>/jsp/08_使用ActionSupport編碼實現驗證/01_在Action類的業務方法中直接驗證01.jsp</result>
<result name="input">/jsp/08_使用ActionSupport編碼實現驗證/01_在Action類的業務方法中直接驗證02.jsp</result>
</action>
- action類代碼(關鍵)
1、JavaBean代碼略
2、action類代碼
public class UserAction extends ActionSupport {
private User user;
@Override
public String execute() throws Exception {
System.out.println("進入execute方法");
/*驗證用戶名*/
if(null == user.getUname() || "".equals(user.getUname())) {
System.out.println("用戶名不能爲空");
this.addFieldError("user.uname", "用戶名不能爲空(業務方法)");
}
/*驗證密碼*/
if(null == user.getPwd() || "".equals(user.getPwd())) {
System.out.println("密碼不能爲空");
this.addFieldError("user.pwd", "密碼不能爲空(業務方法)");
}
/*完成註冊的業務*/
if(!(user.getUname().equals(user.getPwd()))) {
System.out.println("用戶名或密碼錯誤");
this.addActionError("用戶名或密碼錯誤!");
}
if(this.hasErrors()) {
System.out.println("有hasFieldErrors錯誤!!!!!");
return INPUT;
}
System.out.println("沒錯誤!!!!!!");
return SUCCESS;
}
public User getUser() {
return user;
}
public void setUser(User user) {
this.user = user;
}
}
- 錯誤頁面代碼
<body>
用戶名錯誤顯示:<s:fielderror fieldName="user.uname"></s:fielderror>
<hr/>
用戶密碼錯誤顯示:<s:fielderror fieldName="user.pwd"></s:fielderror>
<hr/>
action錯誤顯示:<s:actionerror/>
</body>
- 總結
關鍵代碼是addFieldError()方法和addActionError()方法,這倆個方法是用來添加錯誤信息。其中,addFieldError()用來添加與字段相關的錯誤信息,如用戶名錯誤,addActionError()用來添加於Action所處理的業務相關的錯誤信息。在頁面上,用<s:fielderror/>
標籤輸出addFieldError()方法添加的錯誤信息,用<s:actionerror/>標籤輸出addActionError()方法添加的錯誤信息。
2、重寫validate()方法實現驗證
- 用戶輸入信息頁面
<body>
<s:form action="error02" method="post">
<s:textfield name="userInfo.username" id="uname">用戶名:</s:textfield>
<s:password name="userInfo.userpwd" id="pwd">密碼:</s:password>
<s:submit value="提交"></s:submit>
</s:form>
</body>
- action配置
<action name="error02" class="com.pb08.demo02.UserAction">
<result>/jsp/08_使用ActionSupport編碼實現驗證/02_重寫validate()方法實現驗證01.jsp</result>
<!--使用validate驗證必須配置此result-->
<result name="input">/jsp/08_使用ActionSupport編碼實現驗證/02_重寫validate()方法實現驗證02.jsp</result>
</action>
- action類代碼
1、JavaBean代碼略
2、action類
public class UserAction extends ActionSupport {
private UserInfo userInfo;
@Override
public String execute() throws Exception {
System.out.println("進入execute方法");
/*完成註冊的業務*/
if(!(userInfo.getUsername().equals(userInfo.getUserpwd()))) {
this.addActionError("用戶名或密碼錯誤!");
}
System.out.println("完成註冊的業務...");
if(this.hasErrors()) {
return INPUT;
}
System.out.println("登陸成功");
return SUCCESS;
}
@Override
public void validate() {
System.out.println("進入validate方法");
/*驗證用戶名*/
if(null == userInfo.getUsername() || "".equals(userInfo.getUsername())) {
System.out.println("用戶名不能爲空");
this.addFieldError("user.uname", "用戶名不能爲空!");
}
/*驗證密碼*/
if(null == userInfo.getUserpwd() || "".equals(userInfo.getUserpwd())) {
System.out.println("密碼不能爲空");
this.addFieldError("user.pwd", "密碼不能爲空");
}
}
public UserInfo getUserInfo() {
return userInfo;
}
public void setUserInfo(UserInfo userInfo) {
this.userInfo = userInfo;
}
}
- 錯誤頁面
<body>
<s:fielderror fieldName="user.uname"></s:fielderror>
<s:fielderror fieldName="user.pwd"></s:fielderror>
<s:actionerror />
</body>
- 總結
執行以上代碼從控制檯輸出信息順序來看,當進入action類後,首先會執行validate方法,如果validate方法沒有添加錯誤,則會執行指定的action業務方法,這裏默認是execcute,否則不會執行業務方法,最後還有一點需要注意,每次執行業務方法前,都會先執行一次validate方法。
3、使用validateXxx()方法實現驗證
上面總結說了,使用validate()驗證時,每次執行業務方法前都會執行validate()方法進行驗證,如果只想對某個業務方法進行驗證,可以使用validateXxx()方法來驗證
- 用戶輸入數據頁面
<body>
<s:form action="error03" method="post">
<s:textfield name="userInfo.uname" id="uname">用戶名:</s:textfield>
<s:password name="userInfo.pwd" id="pwd">密碼:</s:password>
<s:submit value="提交"></s:submit>
</s:form>
</body>
- action配置
<action name="error03" class="com.pb08.demo03.UserAction" method="register">
<result>/jsp/08_使用ActionSupport編碼實現驗證/03_使用validate方法實現驗證01.jsp</result>
<!--使用validateXxx驗證必須配置此result-->
<result name="input">/jsp/08_使用ActionSupport編碼實現驗證/03_使用validate方法實現驗證02.jsp</result>
</action>
- action類代碼
public class UserAction extends ActionSupport {
private UserInfo userInfo;
public String register() {
/*完成註冊的業務*/
System.out.println("完成註冊的業務");
if(!(userInfo.getUname().equals(userInfo.getPwd()))) {
this.addActionError("用戶名或密碼錯誤");
}
if(this.hasErrors()) {
return INPUT;
}
return SUCCESS;
}
public void validateRegister() {
System.out.println("validateRegister" + userInfo.getUname() + "|" + userInfo.getPwd());
if(null == userInfo.getUname() || "".equals(userInfo.getUname())) {
System.out.println("用戶名不能爲空");
this.addFieldError("user.uname", "用戶名不能爲空");
}
if(null == userInfo.getPwd() || "".equals(userInfo.getPwd())) {
System.out.println("密碼不能爲空");
this.addFieldError("user.pwd", "密碼不能爲空");
}
}
public UserInfo getUserInfo() {
return userInfo;
}
public void setUserInfo(UserInfo userInfo) {
this.userInfo = userInfo;
}
}
- 錯誤頁面
<body>
<s:fielderror fieldName="user.uname"></s:fielderror>
<s:fielderror fieldName="user.pwd"></s:fielderror>
<s:actionerror />
</body>
- 總結
執行以上代碼可以看出validateXxx()方法的Xxx可以匹配業務方法名,如果業務方法名叫做abc,那麼Xxx就是Abc,首字母大寫。這樣當調用指定名稱的業務方法前只會調用與之匹配的validateXxx方法。
二、使用驗證框架實現驗證
使用驗證框架進行驗證後期維護無需修改代碼,只需要修改配置文件
步驟:
1、編寫JSP用戶數據輸入頁面
2、編寫Action類及其配置文件
3、在與Action類相同的目錄下創建驗證文件ActionName-validation.xml,其中ActionName與需要驗證的Action類名相同
4、編寫驗證規則
代碼示例:
- action
<action name="house_*" class="com.bc.action.HouseAction" method="{1}">
<result>/WEB-INF/jsp/house.jsp</result>
//必須有input對應的頁面
<result name="input">/WEB-INF/jsp/house.jsp</result>
</action>
- action類
//House類略
public class HouseAction extends BaseAction {
private static final long serialVersionUID = 1L;
private House house;
public String house() throws Exception {
return SUCCESS;
}
public String check() throws Exception {
if("".equals(house.getTitle())) {
return INPUT;
}
return SUCCESS;
}
public House getHouse() {
return house;
}
public void setHouse(House house) {
this.house = house;
}
}
- 驗證框架xml代碼
xml名稱格式:action類名-要驗證的action名-validation.xml
<!DOCTYPE validators PUBLIC "-//Apache Struts//XWork Validator 1.0.3//EN"
"http://struts.apache.org/dtds/xwork-validator-1.0.3.dtd">
<validators>
<field name="house.title">
<field-validator type="requiredstring">
<param name="trim">true</param>
<message>標題不能爲空!</message>
</field-validator>
<field-validator type="stringlength">
<param name="minLength">4</param>
<param name="maxLength">20</param>
<param name="trim">true</param>
<message>標題必須爲4至20個字符</message>
</field-validator>
</field>
<field name="house.content">
<field-validator type="requiredstring">
<param name="trim">true</param>
<message>內容不能爲空!</message>
</field-validator>
</field>
<field name="house.address">
<field-validator type="requiredstring">
<param name="trim">true</param>
<message>地址不能爲空!</message>
</field-validator>
</field>
<field name="house.telNum">
<field-validator type="requiredstring">
<param name="trim">true</param>
<message>聯繫方式不能爲空!</message>
</field-validator>
</field>
<field name="house.date">
<field-validator type="requiredstring">
<param name="trim">true</param>
<message>日期不能爲空!</message>
</field-validator>
</field>
</validators>
- 頁面
<s:form action="house_check" method="post" namespace="/">
<s:textfield name="house.title" label="標題"/>
<s:textarea name="house.content" label="內容"/>
<s:textfield name="house.address" label="地點"/>
<s:textfield name="house.telNum" label="聯繫電話"/>
<s:textfield name="house.date" label="發佈時間"/>
<s:submit value="提交"/>
</s:form>