struts2学习笔记(三)—— 在用户注册程序中使用验证框架

来源:互联网 发布:linux终端打开文件 编辑:程序博客网 时间:2024/06/08 09:54

实现目标:

      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,再次测试用户注册程序,此时一切运行正常
      

      

      
      
      




0 0
原创粉丝点击