打开APP
userphoto
未登录

开通VIP,畅享免费电子书等14项超值服

开通VIP
apache commons
apache commons项目大家都应该有或多或少的了解了,目前它在其他许多开源项目中被广泛得应用,基本上已经成为项目开发的一些基本(工具)类,像其中对字符串的处理、对日期、数字的处理,对javabean的处理、以及对xml和模板的处理等,都为项目开发提供了很大的方便。希望大家也将这些工具类应用到自己的日常开发中来。下面仅举几例,实际的用途要更为广泛得多:
  • 判断一个字符串(str)是否为空

   我们习惯的做法:
   if(str!=null&&!str.equals("")){
       ...
   }
   通过commcons StringUtils:
   if(StringUtils.isNotBlank(str)){
       ...
   }
  • 计算一个字符串(str1)在另一个字符串(str2)中出现的次数

   我们习惯的做法:使用substring方法依次往下查找,直至查出所有的为止,个数也就计算了处理。
   通过commons StringUtils:
   int matchCount=StringUtils.countMatches(str2,str1);
  • 在项目中经常遇到这样的问题:在信息列表中,每一行信息(str)最多显示n个字符,如果超过,则折行或使用...来表示超出部分

   我们习惯的做法:通过折行解决该问题,因为用...方式可能会涉及汉字的字符计算问题,经常会将一个汉字截为两半的情况。
   通过commons StringUtils 我们可以生成用...表示超出部分的字符串:
   String aStr=StringUtils.abbreviate(str,n);
   放心,不用考虑汉字问题!
   

 

  • 打印一个数组(array)中的值

   我们通常的做法://通常的做法可能有更好的
   String str="[";
   for(int i=0;i<array.length;i++){
      str+=array[i]+",";
      if(i==array.length-1){
          str+=array[i];
      }
   }
   str+="]";
   return str;
   通过使用commons ArrayUtils:
   return ArrayUtils.toString(array);
   直接了当
  • 将一组bean按照其某个属性(propertyName)进行排序

    我们通常的做法:实现一个Comparator接口(在compare方法还要使用commons PropertyUtils来取bean的属性值),然后通过Collections的sort排序
    通过使用commons beanutils:
    Collections.sort(list, new BeanComparator(propertyName));
  • 在一个Map中,如果知道keys和values都是唯一的,希望既可以通过key来获取value,也希望可以通过value来获取key

    我们通常的做法:生成两个map,一个是正常的key、value方式,一个是反过来的value、key方式
     通过使用commns collections:
     BidiMap map=new DualHashMap();
    map.get(key)或map.inverseBidiMap().get(value)
  • 希望在一个List中只能存储某个类型的对象,例如只能存储字符串类型

    我们通过的做法:在向List加入值之前进行instanceof判断
    通过使用commons collections:
    List l=TypedList.decorator(new ArrayList(),String.class);
  • 有一个xml配置文件,服务器启动时将其读入,并解析xml生成各个相关的对象

    例如:
    <?xml version=1.0 encoding=utf-?>
    <users>
        <user>
           <name>zhangsan</name>
           <sex>male</sex>
           <job>
              <name>software engineer<name>
              <salary>10000</salary>
           </job>
        </user>
        ...
    </users>
    我们通常的做法:通过w3c dom或jdom或sax等读取并解析xml,然后根据xml手工创建相应的对象,并初始化对象之间的关系(例如user和job两个对象对象之
间的关系)
     通过使用commons digester:通过设置读取规则,digester按照xml和规则描述,自动实例化对象并初始化对象之间的关系。     
  • 解析自己定义的表达式,例如希望某些东西能够使用并解析类似这样的表达式$ {user.name=="zhangsan"&&user.job.salary>6000}

    我们通过的做法:可能会引用bsf来做
    通过使用commons jexl:
    Expression e = ExpressionFactory.createExpressionexpr );//expr即为表达式
   JexlContext jc = JexlHelper.createContext( );
   jc.getVars( ).put("user", user);//user即为程序中已经存在的bean对象
    ...
推荐书籍:OReilly.Jakarta.Commons.Cookbook.Nov.2004.eBook-DDU.chm

validwhen主要用于关联验证,即为了验证某个域的值,可能会参考其它域的值来进行综合判断,以确定该域的值是否符合要求。

1,表达式及其注意事项

输入给validwhen的是一个布尔型表达式(对该表达式的解析使用了antlr),其引用名为test,即形如:

<var>
  <var-name>test</var-name>
  <var-value>expression</var-name>
</var>

即,当expression为真(true)时,该域验证通过,其中,expression可以使用的元素包括:

1)表单中其它域属性的名称,例如:
<var>
  <var-name>test</var-name>
  <var-value>(color=="red")</var-name>
</var>
例子中color为表单中其它某个域的属性名。

2)*this*,用于表示该域的属性名称,即对正在验证的属性自身,其变量的引用为*this*,例如:
<var>
  <var-name>test</var-name>
  <var-value>((color=="red") and (*this* != null))</var-name>
</var>

3)可以使用一些常规运算符,如 >、<、==、>=、<=、!=、+、-、*、/、%等等。例如:
<var>
  <var-name>test</var-name>
  <var-value>((color=="red") and (age>=25))</var-name>
</var>

4)可以使用逻辑运算 and 、or,例如:
<var>
  <var-name>test</var-name>
  <var-value>(((color=="red") and (age>=25)) or (color!="red"))</var-name>
</var>
在使用and和or时要注意一点,在同一级的逻辑运算中,同时只能存在一个逻辑运算符,要么是and,要么是or,即:
xxx and yyy
或者
xxx or yyy
如果在同一级出现多于一个的and或or或and和or的组合,那么是不合法的,例如下面的表达式是不合法的:
xxx and yyy and zzz
或者
xxx or yyy or zzz
或者
xxx and yyy or zzz
等等
为了让复杂的表达变得合法,可以让一个复杂的表达式变为多级的表达形式,每一级只有一个and或一个or就可以了,例如:
xxx and yyy and zzz是错误的,进行一下简单的变换:
(xxx and yyy) and zzz或者xxx and (yyy and zzz)等都是合法的。

5)其他合法的输入,例如可以使用双引号和单引号引用literal字符串等等。

2,错误消息的定制

无论是validwhen还是其它验证例程,都可以定制验证出错后的错误信息,定制消息有两种方式,即全局方式和本地方式。

1)全局方式,即在validator-rules.xml中某个validator里面定义的消息,参数名为msg,例如:


<validator name="email"
            classname="org.apache.struts.validator.FieldChecks"
               method="validateEmail"
         methodParams="java.lang.Object,
                       org.apache.commons.validator.ValidatorAction,
                       org.apache.commons.validator.Field,
                       org.apache.struts.action.ActionMessages,
                       org.apache.commons.validator.Validator,
                       javax.servlet.http.HttpServletRequest"
              depends=""
                  msg="errors.email"/>

其中,msg的值为resource bundle中的一个属性名

。例如在resource bundle文件中存在如下定义:
errors.email={0} is an invalid e-mail address.

 

2)本地方式,即在validation.xml中的field中定义的错误消息,格式为:
<msg name="validatorName" key="value" resource="booleanValue"/>
例如:

             <field property="endDate"
                    depends="validwhen">
                <msg name="validwhen" key="date.validwhen"/>
                <arg0 key="start time" resource="false"/>
                <arg1 key="end time" resource="false"/>
                <var>
                     <var-name>test</var-name> 
                     <var-value>((*this* != nulland (*this*>startDate))</var-value>
                </var>
             </field>

这里需要注意的是
* <msg>的name属性的值应该为某个验证例程的名称,例如name="required"、name="date"等,这指明了当该field的该验证例程(例如required、date等)出错时所显示的错误信息。
*如果全局已经定义了msg的信息,而且本地的msg的key与全局的msg的key相同,那么在该field的验证中,本地的msg将覆盖全局的msg。
*<arg0>到<arg4>的属性中也有name属性,即该arg参数所应用的验证例程,例如<arg0 name="date" key="label.startDate"/>,即该参数用于date验证的出错信息。注意,对于一个field,需要的验证规则有时不止一个,例如depends="required,date",而多个验证规则中的每一个都需要出错时传入一些参数信息,如果它们所需要的参数个数、名称和顺序都相同,那么只要定义<arg0...、<arg1...等等即可。但是如果它们需要的参数的个数、名称和顺序不同怎么办,如果我们对于第一个输入参数只定义一个arg0,那么这个arg0用于哪个验证消息,因此这时必须通过arg标签的name属性来表示该参数所服务的验证。

3,例子

场景:在一个表单中,有两个文本域,用于得到一个时间段,一个文本域输入起始日期(startDate),另一个输入终止日期(endDate)。
约束:日期格式为:年(四位数)-月(两位数)-日(两位数),而且终止日期大于起始日期。

根据上述条件,验证规则如下:

<field property="startDate"
    depends="date">
    <arg0 key="form.date.start"/>
    <var>
        <var-name>datePatternStrict</var-name>
        <var-value>yyyy-MM-dd</var-value>
    </var>
</field>
<field property="endDate"
    depends="validwhen,date">
    <msg name="validwhen" key="date.validwhen"/>
    <arg0 name="validwhen" key="form.date.start"/>
    <arg1 name="validwhen" key="form.date.end"/>
    <arg0 name="date" key="form.date.end"/>
    <var>
        <var-name>test</var-name>
        <var-value>((*this* != nulland (*this*>startDate))</var-value>
    </var>
    <var>
        <var-name>datePatternStrict</var-name>
        <var-value>yyyy-MM-dd</var-value>
    </var>
</field> 

在资源文件中加入如下message:

 

form.date.start=起始日期
form.date.end=终止日期
date.validwhen= {0}不能大于{1}!

目前为了在jsp中调试信息,往往会使用System.out.println的方式打印消息,这种方式不是很雅观,为了解决这个问题,
在includes/CommonsTaglib.jsp中加入了apache的log标签,使用很简单!
  • 语法格式
    • <log:logAction category=categoryStr message=messageStr/>
    • <log:logAction category=categoryStr>messageStr</log>
  • 语法含义
    • loglogAction分为
      • debug - Displays a debug-level message
      • info - Displays a info-level message
      • warn - Displays a warn-level message
      • error - Displays a error-level message
      • fatal - Displays a fatal message, usually as the application is about to terminate
      • dump - Displays all vars in the specified scope
    • category是log的类别,即该log属于哪个类或资源拥有,在java文件中我们通常将java类自身的class赋给category,在jsp中我们可以将包含该文件名的资源路径赋给category,例如

   <log:debug category="admin/resources/application/application.jsp">
      now into application.jsp
   </log>
附:
本站仅提供存储服务,所有内容均由用户发布,如发现有害或侵权内容,请点击举报
打开APP,阅读全文并永久保存 查看更多类似文章
猜你喜欢
类似文章
【热】打开小程序,算一算2024你的财运
Struts Validator验证器使用指南
Struts源代码阅读(Commons-Validator) - [Matrix - 与 Java 共舞]
Apache Commons工具集简介
Struts Validator 开发指南
【开发常识】这个问题,直接导致年终奖没了……(惨兮兮)
【solr基础教程之二】索引
更多类似文章 >>
生活服务
热点新闻
分享 收藏 导长图 关注 下载文章
绑定账号成功
后续可登录账号畅享VIP特权!
如果VIP功能使用有故障,
可点击这里联系客服!

联系客服