首页 > 代码库 > struts2学习笔记(三)—— 在用户注册程序中使用验证框架
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=http://www.mamicode.com/"{0}">重新注册>最后两段代码是添加的错误消息,使用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类、页面的编写等
RegisterActionpackage 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(); } @Override public String doDefault()throws Exception{ return INPUT; } @Override public 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; } }
用户实体类:Userpackage 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; } }
对注册用户的数据库操作.UserDaopackage 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{ String url="jdbc:mysql://localhost:3307/user"; String user="tankcat_2"; String pw="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 stub if(rs!=null){ try{ rs.close(); }catch(SQLException se){ se.printStackTrace(); } rs=null; } } private void closePreparedStatement(PreparedStatement pstmt) { // TODO Auto-generated method stub if(pstmt!=null){ try{ pstmt.close(); }catch(SQLException se){ se.printStackTrace(); } pstmt=null; } } private void closeConnection(Connection conn) { // TODO Auto-generated method stub if(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=http://www.mamicode.com/"true" />>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=http://www.mamicode.com/"true">
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=http://www.mamicode.com/"user.username"/>,欢迎>
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应用程序上下文路径的完整URL String 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拦截器配置排除方法,更改如下:<action name="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,再次测试用户注册程序,此时一切运行正常
声明:以上内容来自用户投稿及互联网公开渠道收集整理发布,本网站不拥有所有权,未作人工编辑处理,也不承担相关法律责任,若内容有误或涉及侵权可进行投诉: 投诉/举报 工作人员会在5个工作日内联系你,一经查实,本站将立刻删除涉嫌侵权内容。