分享
 
 
 

利用反射简化Struts的ActionForm的验证

王朝other·作者佚名  2008-05-19
窄屏简体版  字體: |||超大  

在struts中的actionform中验证是经常使用的,虽然也可以使用validation来进行验证,但是在没有学习validation的时候就只能使用在actionform中验证啦。

下面是我的一些想法,不知道合不合适,请大家讨论一下:^_^

在现在的应用中有很多需要验证页面输入的内容是不是空、是不是数字、是不是Double、是不是Int、是不是Float、是不是Email格式、是不是电话格式、是不是邮政编码格式等等验证,在编码中不得不对每一个属性进行验证,这些代码都重复的。因此,如果将这些验证的代码放到一个父类中,那么将会减少编写的代码良,同时也能够很好的对验证的格式做出一个调整。比如说如果验证中国的邮政编码的格式改为验证其他国家的邮政编码,只需要修改配置文件中的邮政编码的正则表达式即可,不用修改代码。下面是实现的一些分析:

1. 从Properties文件中读取配置文件的类:

将数字、Email、电话和邮政编码等的格式的正则表达式写在一个properties文件中,便于修改。其regex .properties文件的内容如下:

numberRegex ="\\d"

emailRegex = "\\S+@\\S+\\.\\S+"

postCodeRegex =" \\d\\d\\d\\d\\d"

………………

在程序中使用如下代码进行匹配邮政编码的格式:

protected boolean isValidPostalCode(String str){

try{

Pattern pattern = Pattern.compile(

//从properties文件里读入邮政编码格式的正则表达式

PropertyReader.getValueByKey(Constants.POSTAL_CODE));

//进行匹配,返回结果

return pattern.matcher(str).matches();

}catch(Exception e){

return false;

}

}

其他验证均是如此。此外改方法式protected的方法,可以被子类覆盖、调用。

2. 其他一些验证方法:

a) 验证字符串是否为空的函数:

protected boolean isBlankString(String str){

if(str == null) {

return true;

}

return (str.length() == 0);

}

b) 验证输入内容式Double类型的函数:

protected boolean isDouble(String str){

try{

Double.parseDouble(str);

return true;

}catch(Exception e){

return false;

}

}

其他验证Float、Int类型的函数同Double类型的函数一样,没有什么区别。同样他们都是protected的函数,可以被子类覆盖,调用。

3. 覆盖validate()方法:

public ActionErrors validate(ActionMapping mapping, HttpServletRequest request) {

ActionErrors errors = new ActionErrors();

ActionErrors tempErrors = null;

//-----------------------------------------------------

//Validate required!

///验证输入内容必须输入的属性的函数

//-----------------------------------------------------

tempErrors = validateRequired();

if(tempErrors != null){

errors.add(tempErrors);

}

//-----------------------------------------------------

//Validate postal code!

//-----------------------------------------------------

tempErrors = validatePostalCode();

if(tempErrors != null){

errors.add(tempErrors);

}

//-----------------------------------------------------

//Validate double!

//-----------------------------------------------------

tempErrors = validateDouble();

if(tempErrors != null){

errors.add(tempErrors);

}

//-----------------------------------------------------

//Validate phone!

//-----------------------------------------------------

tempErrors = validatePhone();

if(tempErrors != null){

errors.add(tempErrors);

}

//-----------------------------------------------------

//Validate state!

//-----------------------------------------------------

tempErrors = validateState();

if(tempErrors != null){

errors.add(tempErrors);

}

//-----------------------------------------------------

//Validate email!

//-----------------------------------------------------

tempErrors = validateEmail();

if(tempErrors != null){

errors.add(tempErrors);

}

………………………………

………………………………

………………………………

………………………………

………………………………

………………………………

//-----------------------------------------------------

//Validate Others

//可以实现自己与众不同的验证,返回一个ActionErrors对象。

//-----------------------------------------------------

tempErrors = validateOthers(mapping,request);

if(tempErrors != null){

errors.add(tempErrors);

}

return errors;

}

在该函数里面依次调用验证不能为空的验证方法,必须式Email格式等等的验证函数,最后一个validateOthers()是protected函数,可以被子类覆盖,在子类中实现上面没有实现的验证,然后在将验证的结果ActionErrors对象返回即可。

4. validateRequired()函数的实现:

/**

* Validate required!

*验证必须输入的属性

* @return ActionErrors

*/

private ActionErrors validateRequired(){

//初始化一个ActionErrors对象

ActionErrors errors = new ActionErrors();

//读取需要进行必须验证的属性列表

List properties = getRequiredPropertyList();

String propertyName = "";

String propertyValue = "";

if((properties != null)&&(properties.size()0)){

//依次对需要验证的属性进行验证

for(int i = 0;i<properties.size();i++){

//获取属性名的字符串

propertyName = (String)properties.get(i);

//获取对应属性的输入值

propertyValue = (String)getTheValue(propertyName);

//验证属性值是否为空

if(this.isBlankString(propertyValue)){

//在Struts的资源文件中定义出错提示信息

//以“属性名”为“key”将错误信息添加到errors中去。

errors.add(propertyName,new ActionMessage("stocktrack.newuser.required",propertyName));

}

}

}

//返回结果

return errors;

}

getRequiredPropertyList()是获取必须验证属性列表的函数。该函数的定义如下:

protected List getRequiredPropertyList(){

return null;

}

可见该函数是一个protected的函数,需要子类覆盖。在子类中需要将要进行必须验证的属性名添加到一个List中去,然后将List返回。下面是一个实现的例子:

public List getRequiredPropertyList() {

List list = new ArrayList();

list.add("username");

list.add("password");

list.add("email");

list.add("streetAddress1");

list.add("streetAddress2");

list.add("city");

list.add("state");

list.add("postalCode");

list.add("homePhone");

list.add("workPhone");

return list;

}

这里的属性名必须与Form类中的属性名相同。

讨论:这里最初的想法是将getRequiredPropertyList()这一类方法定义成为一个抽象(abstract)方法,这样子类中就必须实现改方法,避免忘记实现。但是在一些Form中也不一定都会要验证所有的内容,但是程序员也必须实现那些方法,而且他们实现也是返回null即可。如果在BaseForm类中实现了就不用做这种无用的事情了。请给予指正!

―――――――――――――――――――――――――――――――――

getTheValue(propertyName)方法是用来通过传进去的属性名取出该属性对应的属性值,下面是改方法的实现:

private Object getTheValue(String property){

Object object = null;

Method method = null;

Class clazz = null;

String methodName = "";

//如果属性名为空,则返回null

if(isBlankString(property)){

return null;

}

//将属性名的第一个字母大写,然后加上get构成属性对应的get方法//名。

//注意:这里的属性名的第一个字符必须是字母,否则会出错。(请

//讨论)

methodName = "get" + property.substring(0,1).toUpperCase()

+ property.substring(1,property.length());

//从methodsMap(存放方法的一个Map)里面取方法

method = (Method) methodsMap.get(methodName);

if(method == null){

//如果methodsMap中不存在方法名,则通过反射得到方法

//获取该类的Class对象

clazz = getClass();

try {

//

 
 
 
免责声明:本文为网络用户发布,其观点仅代表作者个人观点,与本站无关,本站仅提供信息存储服务。文中陈述内容未经本站证实,其真实性、完整性、及时性本站不作任何保证或承诺,请读者仅作参考,并请自行核实相关内容。
2023年上半年GDP全球前十五强
 百态   2023-10-24
美众议院议长启动对拜登的弹劾调查
 百态   2023-09-13
上海、济南、武汉等多地出现不明坠落物
 探索   2023-09-06
印度或要将国名改为“巴拉特”
 百态   2023-09-06
男子为女友送行,买票不登机被捕
 百态   2023-08-20
手机地震预警功能怎么开?
 干货   2023-08-06
女子4年卖2套房花700多万做美容:不但没变美脸,面部还出现变形
 百态   2023-08-04
住户一楼被水淹 还冲来8头猪
 百态   2023-07-31
女子体内爬出大量瓜子状活虫
 百态   2023-07-25
地球连续35年收到神秘规律性信号,网友:不要回答!
 探索   2023-07-21
全球镓价格本周大涨27%
 探索   2023-07-09
钱都流向了那些不缺钱的人,苦都留给了能吃苦的人
 探索   2023-07-02
倩女手游刀客魅者强控制(强混乱强眩晕强睡眠)和对应控制抗性的关系
 百态   2020-08-20
美国5月9日最新疫情:美国确诊人数突破131万
 百态   2020-05-09
荷兰政府宣布将集体辞职
 干货   2020-04-30
倩女幽魂手游师徒任务情义春秋猜成语答案逍遥观:鹏程万里
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案神机营:射石饮羽
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案昆仑山:拔刀相助
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案天工阁:鬼斧神工
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案丝路古道:单枪匹马
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案镇郊荒野:与虎谋皮
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案镇郊荒野:李代桃僵
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案镇郊荒野:指鹿为马
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案金陵:小鸟依人
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案金陵:千金买邻
 干货   2019-11-12
 
推荐阅读
 
 
 
>>返回首頁<<
 
靜靜地坐在廢墟上,四周的荒凉一望無際,忽然覺得,淒涼也很美
© 2005- 王朝網路 版權所有