`
hhr_michael
  • 浏览: 72389 次
  • 性别: Icon_minigender_1
  • 来自: 惠州
社区版块
存档分类
最新评论

struts2+hibernate3+spring2读书笔记4(数据校验器)

阅读更多
最近买了谢星星(阿蜜果)的企业应用架构设计-Struts2+Hibernate3+Spring2,想更好地学习与管理资料,现在在博客上写读书笔记,呵呵!

                             第5章 数据校验器
   一.使用重写validate()方法进行手动校验
         实例需求:Struts2中可通过在Action中重写ActionSupport类的validate()方法来完成Action中各方法的难证。
1. 建立工程(可参考前几章的建立,方法类似,需在web.xml文件中配置Struts2的FilterDispatcher)
2. 编写用户信息的pojo类:User.java 代码如下:
 package amigo.struts.validation;

import java.util.Date;

/*
 * 用户信息的pojo类
 * */
public class User {
    /**用户名*/ 
	private String username;
	
	/**密码*/ 
	private String password;
	
	/**性别*/
	private int gender;
	
	/**年龄*/
	private int age;
	
	/**生日*/
	private Date birthDate;
	
	/**联系电话*/
	private String tel;
	
	/**Email*/
	private String email;
	
	/**个人首页*/
	private String url;

	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 int getGender() {
		return gender;
	}

	public void setGender(int gender) {
		this.gender = gender;
	}

	public int getAge() {
		return age;
	}

	public void setAge(int age) {
		this.age = age;
	}

	public Date getBirthDate() {
		return birthDate;
	}

	public void setBirthDate(Date birthDate) {
		this.birthDate = birthDate;
	}

	public String getTel() {
		return tel;
	}

	public void setTel(String tel) {
		this.tel = tel;
	}

	public String getEmail() {
		return email;
	}

	public void setEmail(String email) {
		this.email = email;
	}

	public String getUrl() {
		return url;
	}

	public void setUrl(String url) {
		this.url = url;
	}
}

     
3. 编写注册的Action:RegAction.java 代码如下:
package amigo.struts.validation;

import java.util.regex.Pattern;

import javax.servlet.http.HttpServletRequest;

import org.apache.struts2.interceptor.ServletRequestAware;

import com.opensymphony.xwork2.ActionSupport;
/*
 * 使用validate()完成注册验证
 * */
public class RegAction extends ActionSupport implements ServletRequestAware {
			private User user;
			private HttpServletRequest request;
			public User getUser() {
				return user;
			}
			public void setUser(User user) {
				this.user = user;
			}
			public HttpServletRequest getServletRequest() {
				return request;
			}
			public void setServletRequest(HttpServletRequest request) {
				this.request = request;
			}
		/*
		 * 重写validate()方法实现验证
		 * */	
			
		public void validate(){
		//非空验证与输入合法验证
			if(user.getUsername()==null||"".equals(user.getUsername().trim())){
				this.addFieldError("user.username","用户名不能为空");	
			}else if(user.getUsername()!=null&&!Pattern.matches("\\w{5,50}",user.getUsername().trim())){
				this.addFieldError("user.username","用户名输入不合法,必须为长度为5-50的字母或数字");	
			}
            if(user.getPassword()==null||"".equals(user.getPassword().trim()))
			{
				this.addFieldError("user.password","密码不能为空");	
			}else if(user.getPassword()!=null&&!Pattern.matches("\\w{5,50}", user.getPassword().trim())){
				this.addFieldError("user.password","密码输入不合法,必须为长度为5-50的字母或数字");	
				
			}
            if(user.getAge()<0||user.getAge()>130){
            	this.addFieldError("user.age","年龄不合法");
            }
			
		}	
		public String execute(){
			return null;
			
		}
}     
4.编写注册页面:reg.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>用户注册</title>
</head>
<body>
<s:form action="reg">
<s:textfield name="user.username" label="用户名"/>
<s:password name="user.password" label="密码"></s:password>
<s:select label="性别" name="user.gender" 
list="#{'1':'男','0':'女'}" 
listKey="key" 
listValue="value" value="0"/>

<s:textfield name="user.age" label="年龄"></s:textfield>
<s:textfield name="user.birthDate" label="出生日期"></s:textfield>
<s:textfield name="user.tel" label="联系电话"></s:textfield>
<s:textfield name="user.email" label="Email"></s:textfield>
<s:textfield name="user.url" label="个人首页"></s:textfield>
<s:submit value="提交"></s:submit>
</s:form>
</body>
</html>
5.配置struts.xml文件 代码如下:
    
<!DOCTYPE struts PUBLIC 
"-//Apache Software Foundation//DTD Struts Configuration 2.0//EN" 
"http://struts.apache.org/dtds/struts-2.0.dtd">

<struts>
	<include file="struts-default.xml"/>
	<package name="amigo" extends="struts-default">
		<action name="reg" class="amigo.struts.validation.RegAction">
		<result name="input">/validation/reg.jsp</result>
		</action>
	</package>
</struts>
以上五步后,就完成了重写validate()方法进行手动校验了!呵呵!  


二.使用重写validateXxx()方法进行手动校验(这个例子主要是实现在同一个action中实现不同的验证方法)

1. 编写用户信息的Action: UserAction.java 具体代码如下:

           
  package amigo.struts.validation;

import java.util.regex.Pattern;

import com.opensymphony.xwork2.ActionSupport;

/**
 * 使用validateXxx()方法完成注册验证
 * */

public class UserAction extends ActionSupport {
	  private User user;

	public User getUser() {
		return user;
	}

	public void setUser(User user) {
		this.user = user;
	}
	/**
	 * 验证用户信息注册表单
	 * */ 
   public void validateReg(){
	 //非空验证与输入合法验证
		if(user.getUsername()==null||"".equals(user.getUsername().trim())){
			this.addFieldError("user.username","用户名不能为空");	
		}else if(user.getUsername()!=null&&!Pattern.matches("\\w{5,50}",user.getUsername().trim())){
			this.addFieldError("user.username","用户名输入不合法,必须为长度为5-50的字母或数字");	
		}
       if(user.getPassword()==null||"".equals(user.getPassword().trim()))
		{
			this.addFieldError("user.password","密码不能为空");	
		}else if(user.getPassword()!=null&&!Pattern.matches("\\w{5,50}", user.getPassword().trim())){
			this.addFieldError("user.password","密码输入不合法,必须为长度为5-50的字母或数字");	
			
		}
       if(user.getAge()<0||user.getAge()>130){
       	this.addFieldError("user.age","年龄不合法");
       }  
   }
   public void validateLogin(){
	   //非空验证与输入合法验证
	   if(user.getUsername()==null||"".equals(user.getUsername().trim())){
		   this.addFieldError("user.username", "用户名不能为空!");
	   }
	   if(user.getPassword()==null||"".equals(user.getPassword().trim())){
		   this.addFieldError("user.password", "密码不能为空!");
	   }
	   
   }
   /**
    * 用户完成注册
    * */
   public String reg(){
	   //实现代码省略
	   return null;
   }
   
   public String login(){
	   //实现代码省略
	   return null;
   }
   public String execute(){
	   return null;
   }
   
}


2. 编写注册页面: validateXxxReg.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>用户注册</title>
</head>
<body>
<s:form action="userReg">
<s:textfield name="user.username" label="用户名"/>
<s:password name="user.password" label="密码"></s:password>
<s:select label="性别" name="user.gender" 
list="#{'1':'男','0':'女'}" 
listKey="key" 
listValue="value" value="0"/>

<s:textfield name="user.age" label="年龄"></s:textfield>
<s:textfield name="user.birthDate" label="出生日期"></s:textfield>
<s:textfield name="user.tel" label="联系电话"></s:textfield>
<s:textfield name="user.email" label="Email"></s:textfield>
<s:textfield name="user.url" label="个人首页"></s:textfield>
<s:submit value="提交"></s:submit>
</s:form>
</body>
</html>
3. 编写登录页面:validateXxxLogin.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>用户登录</title>
</head>
<body>
  <s:form action="userLogin">
  	<s:textfield name="user.username" label="用户名:"></s:textfield>
    <s:password name="user.password" label="密码:"></s:password>
    <s:submit></s:submit>
  </s:form>
</body>
</html>
4. 配置 sturts.xml

  
<!DOCTYPE struts PUBLIC 
"-//Apache Software Foundation//DTD Struts Configuration 2.0//EN" 
"http://struts.apache.org/dtds/struts-2.0.dtd">

<struts>
	<include file="struts-default.xml"/>
	<package name="amigo" extends="struts-default">
		<action name="reg" class="amigo.struts.validation.RegAction">
		<result name="input">/validation/reg.jsp</result>
		</action>
		
		<action name="userReg" class="amigo.struts.validation.UserAction" method="reg">
		<result name="input">/validation/validateXxxReg.jsp</result>
		</action>
		
		<action name="userLogin" class="amigo.struts.validation.UserAction" method="login">
		<result name="input">/validation/validateXxxLogin.jsp</result>
		</action>
		
	</package>
</struts>

以上四步后,就完成了重写validateXxx()方法进行手动校验了!呵呵!下面我们再来看看Struts2的验证框架。


三.使用Struts2的验证框架完成服务端校验
     1.编写Action类:ValjFrameworkRegAction.java

        
 package amigo.struts.validation;

import com.opensymphony.xwork2.ActionSupport;
/**
 * 使用Struts2的验证框架完成数据校验
 * */
public class ValFrameworkRegAction extends ActionSupport {
          private User user;

		public User getUser() {
			return user;
		}

		public void setUser(User user) {
			this.user = user;
		}
		public String execute(){
			return null;
			
		}
}

2.编写验证文件: ValFrameworkRegAction-validsation.xml
  Struts 2 中的每个Action都可以有一个验证文件,该验证文件与Action处于同目录中,命名格式为:Action的名称-validation.xml,其中“-validation.xml”是确定的,而“Action的名称”会根椐不同的Action而有所不同,本实例的验证文件的名称为:ValFrameworkRegAction-validsation.xml   具体内容如下:

  
 <?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE validators PUBLIC 
"-//OpenSymphony Group//XWork Validator 1.0.2//EN" 
"http://www.opensymphony.com/xwork/xwork-validator-1.0.2.dtd">
<validators>
<field name="user.username">
	<field-validator type="requiredstring">
		<param name="trim">true</param>
		<message>用户名不能为空</message>
	</field-validator>
    <field-validator type="regex">
    	<param name="expression"><![CDATA[(\w{5,50})]]></param>
    	<message>用户名输入不合法,必须为长度为5-50之间的字母或数字</message>
    </field-validator>
    
</field>

<field name="user.password">
	<field-validator type="requiredstring">
		<param name="trim">true</param>
		<message>密码不能为空</message>
	</field-validator>
    <field-validator type="regex">
    	<param name="expression"><![CDATA[(\w{5,50})]]></param>
    	<message>密码输入不合法,必须为长度为5-50之间的字母或数字</message>
    </field-validator>
</field>

<field name="user.age">
	<field-validator type="int">
		<param name="min">1</param>
		<param name="max">130</param>
		<message>年龄输入不合法</message>
	</field-validator>
</field>

</validators>
3. 编写注册页面:valFrameworkReg.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>用户注册</title>
</head>
<body>
<s:form action="valFrameworkReg" >
<s:textfield name="user.username" label="用户名"/>
<s:password name="user.password" label="密码"></s:password>
<s:select label="性别" name="user.gender" 
list="#{'1':'男','0':'女'}" 
listKey="key" 
listValue="value" value="0"/>

<s:textfield name="user.age" label="年龄"></s:textfield>
<s:textfield name="user.birthDate" label="出生日期"></s:textfield>
<s:textfield name="user.tel" label="联系电话"></s:textfield>
<s:textfield name="user.email" label="Email"></s:textfield>
<s:textfield name="user.url" label="个人首页"></s:textfield>
<s:submit value="提交"></s:submit>
</s:form>
</body>
</html>

4.配置struts.xml,添加的信息如下:
   	<action name="valFrameworkReg" class="amigo.struts.validation.ValFrameworkRegAction">
		<result name="input">/validation/valFrameworkReg.jsp</result>
		</action>
以上四步后,就完成了Struts2的验证框架服务端的校验了!呵呵!下面我们再来看看客户端的校验。


四.使用Struts2的验证框架完成客户端校验
    在Strut2中,进行客户端校验将由框架在页面中自动生成javascript代码,在提交时调用自动生成的javascript代码中的函数:validateForm_Action 名称(),要实现客户端校验比较简单,只要在jsp页面的form的validate属性设为true就可以了。如下:
 
  <s:form action=”valFrameworkReg” validate=”true”></s:form>


五.国际化校验的提示信息
    主要是实现验证信息的国际化:步骤如下:
1. 在src目录中创建校验提示信息的配置文件
validationMessages.properties

user.username.requried=用户名不能为空
user.username.regex=用户名输入不合法,必须为长度为5-50之间的字母或数字
user.password.requried=密码不能为空
user.password.regex=密码输入不合法,必须为长度为5-50之间的字母或数字
user.age=年龄必须在${min}和${max}}之间!


 validationMessages_zh_CN.properties
       user.username.requried=\u7528\u6237\u540d\u4e0d\u80fd\u4e3a\u7a7a
user.username.regex=\u7528\u6237\u540d\u8f93\u5165\u4e0d\u5408\u6cd5\uff0c\u5fc5\u987b\u4e3a\u957f\u5ea6\u4e3a5-50\u4e4b\u95f4\u7684\u5b57\u6bcd\u6216\u6570\u5b57
user.password.requried=\u5bc6\u7801\u4e0d\u80fd\u4e3a\u7a7a
user.password.regex=\u5bc6\u7801\u8f93\u5165\u4e0d\u5408\u6cd5\uff0c\u5fc5\u987b\u4e3a\u957f\u5ea6\u4e3a5-50\u4e4b\u95f4\u7684\u5b57\u6bcd\u6216\u6570\u5b57
user.age=\u5e74\u9f84\u5fc5\u987b\u5728${min}\u548c${max}}\u4e4b\u95f4\uff01


2.修改struts.xml文件
       在struts的头部添加如下代码(注是在struts的标签内添加):
      
    
  <constant name="struts.custom.i18n.resources" value="validationMessages"></constant>
    <constant name="struts.i18n.encoding" value="UTF-8"></constant>
3. 修改校验文件 valFrameworkRegAction-validation.xml  内容如下:

      
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE validators PUBLIC 
"-//OpenSymphony Group//XWork Validator 1.0.2//EN" 
"http://www.opensymphony.com/xwork/xwork-validator-1.0.2.dtd">
<validators>
<field name="user.username">
	<field-validator type="requiredstring">
		<param name="trim">true</param>
<!--用了国际化,user.username.requried的内容是:用户名不能为空  -->
		<message>${getText("user.username.requried")}</message>
	</field-validator>
    <field-validator type="regex">
    	<param name="expression"><![CDATA[(\w{5,50})]]></param>
<!--用了国际化,user.username.regex内容是:用户名输入不合法,必须为长度为5-50之间的字母或数字  -->
    	<message>${getText("user.username.regex")}</message>
    </field-validator>
    
</field>

<field name="user.password">
	<field-validator type="requiredstring">
	
		<param name="trim">true</param>
<!--用了国际化,user.password.requried的内容是:密码不能为空  -->
		<message>${getText("user.password.requried")}</message>
	</field-validator>
	
    <field-validator type="regex">
    	<param name="expression"><![CDATA[(\w{5,50})]]></param>
<!--用了国际化,user.password.regex的内容是:密码输入不合法,必须为长度为5-50之间的字母或数字  -->   	
    	<message>${getText("user.password.regex")}</message>
    </field-validator>
</field>

<field name="user.age">
	<field-validator type="int">
		<param name="min">1</param>
		<param name="max">130</param>
		<!--user.age的内容是:年龄输入不合法 -->
		<message>${getText("user.age")}</message>
		
	</field-validator>
</field>

</validators>

以上三步后,就完成了国际化的验证校验了!


六.常用内建的较验器

1. 必填字符串校验器requiredstring
          
字段校验器
        <field name="user.username">
	<field-validator type="requiredstring">
		<param name="trim">true</param>
		<message>用户名不能为空</message>
	</field-validator>
</field>     非字段校验器
     <validator type=”requiredstring”>
		<param name="fildname">user.name</param>
        <param name=”trim”>true</param>
		<message>用户名不能为空</message>
</validator>
2.整数范围校验器 int
     filedName:用于非字段校验器,指定需要验证的属性名。
     Min: 可选参数,用于指定整数最小值
     Max:可选参数,用于指定最大值。
字段校验器
<field name="user.age">
	<field-validator type="int">
		<param name="min">1</param>
		<param name="max">130</param>
		<message>年龄输入不合法</message>
	</field-validator>
</field>

  非字段校验器

  <validator type=”int”>
		<param name="fildname"> user.age </param>
        <param name=”min”>1</param>
        <param name=”max”>130</param>
		<message>年龄输入不合法</message>
</validator>
3.正则表达式校验器
   Fieldname:非字段校验器具有该属性,指定Action属必名。
   Expression:必填,指定正则表达式
   caseSensitive:非必填,指定是否区分大小写,默认为true.
  

字段校验器
<field name="user.username">
<field-validator type="regex">
    	<param name="expression"><![CDATA[(\w{5,50})]]></param>
    	<message>用户名输入不合法,必须为长度为5-50之间的字母或数字</message>
    </field-validator>
</field>

非字段校验器
  <validator type=” regex”>
		<param name="fildname"> user.username </param>
        <param name=” expression”><![CDATA[(\w{5,50})]]></param>
		<message>用户名输入不合法,必须为长度为5-50之间的字母或数字</message>
</validator>

4.必填校验器

 字段校验器
      <field name="user.username">
	<field-validator type="required">
		<message>用户名不能为空</message>
	</field-validator>
</field>

     非字段校验器
     <validator type=”required”>
		<param name="fildname">user.name</param>
		<message>用户名不能为空</message>
</validator>


5.字符串度度校验器
    
 字段校验器

<field name=”user.username”>
  <field-validator type=”stringlength”>
<param name=”minLength”>5</param>
<param name=”maxLength”>50</param>
<message>用户名长度必须在5-50之间</message>
</field-validator >
</field >

非字段校验器

 < validator type=”stringlength”>
<param name=”fieldname”>user.username</param>
<param name=”minLength”>5</param>
<param name=”maxLength”>50</param>
<message>用户名长度必须在5-50之间</message>
</validator>

6.日期校验器
 字段校验器
   <field name="user.birthDate">
	<field-validator type="date">
		<param name="min">1850-01-01</param>
		<param name="max">2015-07-20</param>
		<message>出生日期输入不合法</message>
	</field-validator>
</field>


非字段校验器
	< validator type="date">
         <param name="fieldname"> user.birthDate </param>
		<param name="min">1850-01-01</param>
		<param name="max">2015-07-20</param>
		<message>出生日期输入不合法</message>
	</ validator>
7.网址校验器
字段校验器
  <field name="user.url">
	<field-validator type="url">
		<message>个人首页输入不合法</message>
	</field-validator>
</field>
非字段校验器
	< validator type="url">
        <param name=”fieldname”>user.url</param>
			<message>个人首页输入不合法</message>
	</validator>


8.邮件地址校验器
字段校验器
  <field name="user.email">
	<field-validator type="email">
		<message> Email地址不合法</message>
	</field-validator>
</field>

非字段校验器
	< validator type="email">
      <param name=”fieldname”> user.email </param>
		<message> Email地址不合法</message>
	</validator>



分享到:
评论
5 楼 lixia0417 2010-05-27  
恩,LZ,谢谢了,那我还是练习把SSh的例子改成S2sh的吧,呵呵,哎,现在s2sh整合开发的例子还真是有点少啊,大都是SSh的,呵呵
4 楼 hhr_michael 2010-05-26  
哥们,你好,这本书着重s2sh的各个部分开发,而整合的例子不是很多,只有三章是整合的例子,且都是很基础的。
3 楼 lixia0417 2010-05-26  
对,哥们,问一下,这本书中关于S2SH整合开发的例子多吗,就是用三个框架一起开发的例子,想多练习一下,买本书,呵呵
2 楼 hhr_michael 2010-05-25  
谢谢提醒,由于只是着重校验的过程,所以这代码没有在struts.xml中配置对应的视图。
1 楼 lixia0417 2010-05-25  
楼主写得不错,受教了,  不过觉得<code> public String reg(){  
       //实现代码省略  
       return null;  
   }  
     
   public String login(){  
       //实现代码省略  
       return null;  
   }  
   public String execute(){  
       return null;  
   }   </code>
返回空,有点怪怪的,还不如直接返回“success”呢,虽然在Struts.xml中没有配置对应的视图页面;

相关推荐

Global site tag (gtag.js) - Google Analytics