zoukankan      html  css  js  c++  java
  • struts2学习笔记(三)—— 在用户注冊程序中使用验证框架

    实现目标:

          1.使用验证框架对用户注冊信息进行验证
          2.验证username、password、邮箱不能为空
          3.验证username、password长度
          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();
    	}
    	@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;
    	}
    	
    }
    

    用户实体类: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{
    		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="true" /> <package name="default" extends="struts-default"> <action name="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应用程序上下文路径的完整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.启动Tomcatserver。在地址栏中输入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,再次測试用户注冊程序。此时一切执行正常
          

          

          
          
          




  • 相关阅读:
    excel
    POJ 1149--PIGS
    A
    强大的sscanf
    hdu 5754 Life Winner Bo(威佐夫博弈)
    hdu 5723 Abandoned country(最小生成树,dfs)
    hdu 5734 Acperience
    The Monocycle,UVa 10047(状态记录广搜)
    Fire!(两次bfs)
    NP-Hard Problemd(二分图判定着色)
  • 原文地址:https://www.cnblogs.com/cxchanpin/p/6764835.html
Copyright © 2011-2022 走看看