標籤:struts2 驗證器 驗證架構
實現目標: 1.使用驗證架構對使用者註冊資訊進行驗證 2.驗證使用者名稱、密碼、郵箱不可為空 3.驗證使用者名稱、密碼長度 4.驗證郵件地址格式
具體實現一、Struts2應用的基礎配置 這裡不做詳細闡述,具體為web.xml、相關jar包的配置
二、將頁面顯示的常值內容放到資源檔中 1.查看使用者註冊程式中的所有頁面,找到所有可以顯示的常值內容,將它們分離出來放到資源檔中。 2.與相關的Action類同名,以.preperties為副檔名,與Action類位於同一個包中,只能由該Action訪問
RegisterAction_zh_CN.properties
#register.jsp頁面所需的字串資源title=使用者註冊username=使用者名稱password=密碼sex=性別sex.male=男sex.female=女email=郵件地址pwdQuestion=密碼問題pwdAnswer=密碼答案submit=註冊reset=重設#success.jsp頁面所需的字串資源success=註冊成功success.info=${user.username},恭喜你註冊成功#error.jsp頁面所需的字串資源failure=註冊失敗failure.info=註冊失敗,原因是:${exception}<br>請<a href="{0}">重新註冊</a>error.username.exist=使用者名稱已經存在error.username.length=${getText("username")}長度必須在${minLength}到${maxLength}個字元之間error.password.length=${getText("password")}長度必須在${minLength}到${maxLength}個字元之間error.email.invalid=${getText("email")}格式不對error.username.required=${getText("username")}不可為空error.password.required=${getText("password")}不可為空error.email.required=${getText("mail")}不可為空 最後兩段代碼是添加的錯誤訊息,使用OGNL運算式作為訊息文本的參數
三、編寫驗證檔案 RegisterAction-validation.xml,同樣,與相關Action類位於同一個包
<!DOCTYPE validators PUBLIC "-//Apache Struts//XWork Validator 1.0.2//EN" "http://struts.apache.org/dtds/xwork-validator-1.0.2.dtd"> <validators><!-- 針對user.username欄位的驗證規則 --><field name="user.username"><!-- 使用requiredstring驗證器,確保user.username欄位值不為null,也不為“” --><field-validator type="requiredstring"><message key="error.username.required"/></field-validator><!-- 使用stringlength驗證器,確保user.username欄位值的字元長在4到12之間 --><field-validator type="stringlength"> <!-- 向stringlength驗證器執行個體傳遞minLength和maxLength參數 --><param name="minLength">4</param><param name="maxLength">12</param><message key="error.username.length"/></field-validator></field><!-- 針對user.password欄位的驗證規則 --><field name="user.password"><field-validator type="requiredstring"><message key="error.password.required"/></field-validator><field-validator type="stringlength"><param name="minLength">4</param><param name="maxLength">12</param><message key="error.password.length"/></field-validator></field><!-- 針對user.email欄位的驗證規則 --><field name="user.email"><field-validator type="requiredstring"><message key="error.email.required"/></field-validator><field-validator type="email"><message key="error.email.invalid"/></field-validator></field></validators>
1).在編寫驗證檔案時要注意,DTD的聲明,我一開始對著教材上的DTD版本輸入,執行的時候發現提示了一個錯誤如下:
The file cannot be validated as the XML definition "http://www.opensymphony.com/xwork/xwork-validator-1.0.2.dtd" that is specified as describing the syntax of the file cannot be located.
後來在網上找到瞭解決方案,替換成上面正確的版本就可以了。
四、其他相關Action類、頁面的編寫等RegisterAction
package register.action;import java.sql.SQLException;import java.util.Date;import register.dao.UserDao;import register.entity.User;import register.exceptions.UsernameExistException;import com.opensymphony.xwork2.ActionSupport;public class RegisterAction extends ActionSupport {/** * */private static final long serialVersionUID = 1L;private User user;private UserDao userdao;public RegisterAction(){userdao=new UserDao();}@Overridepublic String doDefault()throws Exception{return INPUT;}@Overridepublic String execute() throws SQLException, UsernameExistException{user.setRegDate(new Date());try{userdao.register(user);}catch(UsernameExistException e){addFieldError("user.username",getText("error.username.exist"));return INPUT;}return SUCCESS;}public User getUser() {return user;}public void setUser(User user) {this.user = user;}}
使用者實體類:User
package register.entity;import java.io.Serializable;import java.util.Date;public class User implements Serializable {/** * */private static final long serialVersionUID = 1L;private Integer id;private String username;private String password;private Boolean sex;private String email;private String pwdQuestion;private String pwdAnswer;private Date regDate;private Date lastLoginDate;private String lastLoginIp;public Integer getId() {return id;}public void setId(Integer id) {this.id = id;}public String getUsername() {return username;}public void setUsername(String username) {this.username = username;}public String getPassword() {return password;}public void setPassword(String password) {this.password = password;}public Boolean getSex() {return sex;}public void setSex(Boolean sex) {this.sex = sex;}public String getEmail() {return email;}public void setEmail(String email) {this.email = email;}public String getPwdQuestion() {return pwdQuestion;}public void setPwdQuestion(String pwdQuestion) {this.pwdQuestion = pwdQuestion;}public String getPwdAnswer() {return pwdAnswer;}public void setPwdAnswer(String pwdAnswer) {this.pwdAnswer = pwdAnswer;}public Date getRegDate() {return regDate;}public void setRegDate(Date regDate) {this.regDate = regDate;}public Date getLastLoginDate() {return lastLoginDate;}public void setLastLoginDate(Date lastLoginDate) {this.lastLoginDate = lastLoginDate;}public String getLastLoginIp() {return lastLoginIp;}public void setLastLoginIp(String lastLoginIp) {this.lastLoginIp = lastLoginIp;}}
對註冊使用者的資料庫操作.UserDao
package register.dao;import java.sql.Connection;import java.sql.DriverManager;import java.sql.PreparedStatement;import java.sql.ResultSet;import java.sql.SQLException;import register.entity.User;import register.exceptions.UsernameExistException;public class UserDao {public UserDao(){String driverClass="com.mysql.jdbc.Driver";try{Class.forName(driverClass);}catch(ClassNotFoundException ce){ce.printStackTrace();}}public Connection getConnection() throws SQLException{Stringurl="jdbc:mysql://localhost:3307/user";Stringuser="tankcat_2";Stringpw="wxt222$$$";return DriverManager.getConnection(url,user,pw);}public User register(User user) throws SQLException, UsernameExistException{Connection conn=null;PreparedStatement pstmt=null;ResultSet rs=null;try{conn=getConnection();String sql="select * from reg_user where username = ?";pstmt=conn.prepareStatement(sql);pstmt.setString(1, user.getUsername());rs=pstmt.executeQuery();if(rs.next()){throw new UsernameExistException();}sql="insert into reg_user(username,password,sex,email,pwd_question,pwd_answer,reg_date) values(?,?,?,?,?,?,?)";pstmt=conn.prepareStatement(sql);pstmt.setString(1, user.getUsername());pstmt.setString(2, user.getPassword());pstmt.setBoolean(3, user.getSex());pstmt.setString(4, user.getEmail());pstmt.setString(5, user.getPwdQuestion());pstmt.setString(6,user.getPwdAnswer());pstmt.setTimestamp(7, new java.sql.Timestamp(user.getRegDate().getTime()));pstmt.execute();rs=pstmt.executeQuery("select last_insert_id()");if(rs.next()){user.setId(rs.getInt(1));}else{return null;}}catch(SQLException se){throw se;}finally{closeResultSet(rs);closePreparedStatement(pstmt);closeConnection(conn);}return user;}private void closeResultSet(ResultSet rs) {// TODO Auto-generated method stubif(rs!=null){try{rs.close();}catch(SQLException se){se.printStackTrace();}rs=null;}}private void closePreparedStatement(PreparedStatement pstmt) {// TODO Auto-generated method stubif(pstmt!=null){try{pstmt.close();}catch(SQLException se){se.printStackTrace();}pstmt=null;}}private void closeConnection(Connection conn) {// TODO Auto-generated method stubif(conn!=null){try{conn.close();}catch(SQLException se){se.printStackTrace();}conn=null;}}}
struts.xml檔案的配置
<?xml version="1.0" encoding="UTF-8" ?><!DOCTYPE struts PUBLIC"-//Apache Software Foundation//DTD Struts Configuration 2.3//EN""http://struts.apache.org/dtds/struts-2.3.dtd"><struts><constant name="struts.enable.DynamicMethodInvocation" value="true" /><package name="default" extends="struts-default"> <actionname="register" class="register.action.RegisterAction"><exception-mapping result="error" exception="java.lang.Exception"/><result name="input">/register.jsp</result><result name="success">/success.jsp</result><result name="error">/error.jsp</result></action></package></struts>
register.jsp註冊頁面的編寫
<%@ page language="java" contentType="text/html; charset=UTF-8" pageEncoding="UTF-8"%><%@ taglib prefix="s" uri="/struts-tags" %><!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd"><html><head><meta http-equiv="Content-Type" content="text/html; charset=UTF-8"><title><s:text name="title"/></title></head><body><hr color="#ededed"/><s:fielderror/><s:form action="register.action"><s:textfield name="user.username" key="username"/><s:password name="user.password" key="password"/><s:radio name="user.sex" value="true"list="#{true:getText('sex.male'),false:getText('sex.female')}" key="sex"/><s:textfield name="user.email" key="email"/><s:textfield name="user.pwdQuestion" key="pwdQuestion"/><s:textfield name="user.pwdAnswer" key="pwdAnswer"/><s:submit key="submit"/><s:reset key="reset"/></s:form></body></html>
succes.jsp註冊成功頁面的編寫
<%@ page language="java" contentType="text/html; charset=UTF-8" pageEncoding="UTF-8"%><%@ taglib uri="/struts-tags" prefix="s" %><!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd"><html><head><meta http-equiv="Content-Type" content="text/html; charset=UTF-8"><title>歡迎介面</title></head><body><s:property value="user.username"/>,歡迎</body></html>
error.jsp註冊失敗頁面的編寫
<%@ page language="java" contentType="text/html; charset=UTF-8" pageEncoding="UTF-8"%><%@ taglib uri="/struts-tags" prefix="s" %><!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd"><%//String path = request.getContextPath();//String basePath = request.getScheme()+"://"+request.getServerName()+":"+request.getServerPort()+path+"/";//得到Web應用程式的上下文路徑String path=request.getContextPath();//構建Web應用程式上下文路徑的完整URLString basePath=request.getScheme()+"://"+request.getServerName()+":"+request.getServerPort()+path+"/";%><html><head><meta http-equiv="Content-Type" content="text/html; charset=UTF-8"><title><s:text name="failure"/></title></head><body><s:text name="failure.info"><s:param><%=basePath %>register!default.action</s:param></s:text></body></html>
該Struts2應用程式的目錄結構如:
測試:
1.啟動Tomcat伺服器,在地址欄中輸入http://localhost:8080/struts2-RegisterValidate/register!default.action,出現下列顯示內容: 顯然,這不是我們想要的結果,當使用者訪問註冊頁面而不是提交註冊表單時,是不需要進行驗證的。出現以上的原因是,在調用Register。Action的doDefault方法之前,驗證架構被調用了。 由於調用驗證架構的攔截器是validation,而不是workflow,因此我們可以為validation攔截器配置排除方法,更改如下:
<actionname="register" class="register.action.RegisterAction"><exception-mapping result="error" exception="java.lang.Exception"/><interceptor-ref name="defaultStack"><param name="validation.excludeMethods">default</param></interceptor-ref><result name="input">/register.jsp</result><result name="success">/success.jsp</result><result name="error">/error.jsp</result></action>
重啟Tomcat,再次測試使用者註冊程式,此時一切運行正常