免费视频淫片aa毛片_日韩高清在线亚洲专区vr_日韩大片免费观看视频播放_亚洲欧美国产精品完整版

打開APP
userphoto
未登錄

開通VIP,暢享免費(fèi)電子書等14項(xiàng)超值服

開通VIP
apache commons
apache commons項(xiàng)目大家都應(yīng)該有或多或少的了解了,目前它在其他許多開源項(xiàng)目中被廣泛得應(yīng)用,基本上已經(jīng)成為項(xiàng)目開發(fā)的一些基本(工具)類,像其中對(duì)字符串的處理、對(duì)日期、數(shù)字的處理,對(duì)javabean的處理、以及對(duì)xml和模板的處理等,都為項(xiàng)目開發(fā)提供了很大的方便。希望大家也將這些工具類應(yīng)用到自己的日常開發(fā)中來。下面僅舉幾例,實(shí)際的用途要更為廣泛得多:
  • 判斷一個(gè)字符串(str)是否為空

   我們習(xí)慣的做法:
   if(str!=null&&!str.equals("")){
       ...
   }
   通過commcons StringUtils:
   if(StringUtils.isNotBlank(str)){
       ...
   }
  • 計(jì)算一個(gè)字符串(str1)在另一個(gè)字符串(str2)中出現(xiàn)的次數(shù)

   我們習(xí)慣的做法:使用substring方法依次往下查找,直至查出所有的為止,個(gè)數(shù)也就計(jì)算了處理。
   通過commons StringUtils:
   int matchCount=StringUtils.countMatches(str2,str1);
  • 在項(xiàng)目中經(jīng)常遇到這樣的問題:在信息列表中,每一行信息(str)最多顯示n個(gè)字符,如果超過,則折行或使用...來表示超出部分

   我們習(xí)慣的做法:通過折行解決該問題,因?yàn)橛?..方式可能會(huì)涉及漢字的字符計(jì)算問題,經(jīng)常會(huì)將一個(gè)漢字截為兩半的情況。
   通過commons StringUtils 我們可以生成用...表示超出部分的字符串:
   String aStr=StringUtils.abbreviate(str,n);
   放心,不用考慮漢字問題!
   

 

  • 打印一個(gè)數(shù)組(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);
   直接了當(dāng)
  • 將一組bean按照其某個(gè)屬性(propertyName)進(jìn)行排序

    我們通常的做法:實(shí)現(xiàn)一個(gè)Comparator接口(在compare方法還要使用commons PropertyUtils來取bean的屬性值),然后通過Collections的sort排序
    通過使用commons beanutils:
    Collections.sort(list, new BeanComparator(propertyName));
  • 在一個(gè)Map中,如果知道keys和values都是唯一的,希望既可以通過key來獲取value,也希望可以通過value來獲取key

    我們通常的做法:生成兩個(gè)map,一個(gè)是正常的key、value方式,一個(gè)是反過來的value、key方式
     通過使用commns collections:
     BidiMap map=new DualHashMap();
    map.get(key)或map.inverseBidiMap().get(value)
  • 希望在一個(gè)List中只能存儲(chǔ)某個(gè)類型的對(duì)象,例如只能存儲(chǔ)字符串類型

    我們通過的做法:在向List加入值之前進(jìn)行instanceof判斷
    通過使用commons collections:
    List l=TypedList.decorator(new ArrayList(),String.class);
  • 有一個(gè)xml配置文件,服務(wù)器啟動(dòng)時(shí)將其讀入,并解析xml生成各個(gè)相關(guān)的對(duì)象

    例如:
    <?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,然后根據(jù)xml手工創(chuàng)建相應(yīng)的對(duì)象,并初始化對(duì)象之間的關(guān)系(例如user和job兩個(gè)對(duì)象對(duì)象之
間的關(guān)系)
     通過使用commons digester:通過設(shè)置讀取規(guī)則,digester按照xml和規(guī)則描述,自動(dòng)實(shí)例化對(duì)象并初始化對(duì)象之間的關(guān)系。     
  • 解析自己定義的表達(dá)式,例如希望某些東西能夠使用并解析類似這樣的表達(dá)式$ {user.name=="zhangsan"&&user.job.salary>6000}

    我們通過的做法:可能會(huì)引用bsf來做
    通過使用commons jexl:
    Expression e = ExpressionFactory.createExpressionexpr );//expr即為表達(dá)式
   JexlContext jc = JexlHelper.createContext( );
   jc.getVars( ).put("user", user);//user即為程序中已經(jīng)存在的bean對(duì)象
    ...
推薦書籍:OReilly.Jakarta.Commons.Cookbook.Nov.2004.eBook-DDU.chm

validwhen主要用于關(guān)聯(lián)驗(yàn)證,即為了驗(yàn)證某個(gè)域的值,可能會(huì)參考其它域的值來進(jìn)行綜合判斷,以確定該域的值是否符合要求。

1,表達(dá)式及其注意事項(xiàng)

輸入給validwhen的是一個(gè)布爾型表達(dá)式(對(duì)該表達(dá)式的解析使用了antlr),其引用名為test,即形如:

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

即,當(dāng)expression為真(true)時(shí),該域驗(yàn)證通過,其中,expression可以使用的元素包括:

1)表單中其它域?qū)傩缘拿Q,例如:
<var>
  <var-name>test</var-name>
  <var-value>(color=="red")</var-name>
</var>
例子中color為表單中其它某個(gè)域的屬性名。

2)*this*,用于表示該域的屬性名稱,即對(duì)正在驗(yàn)證的屬性自身,其變量的引用為*this*,例如:
<var>
  <var-name>test</var-name>
  <var-value>((color=="red") and (*this* != null))</var-name>
</var>

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

4)可以使用邏輯運(yùn)算 and 、or,例如:
<var>
  <var-name>test</var-name>
  <var-value>(((color=="red") and (age>=25)) or (color!="red"))</var-name>
</var>
在使用and和or時(shí)要注意一點(diǎn),在同一級(jí)的邏輯運(yùn)算中,同時(shí)只能存在一個(gè)邏輯運(yùn)算符,要么是and,要么是or,即:
xxx and yyy
或者
xxx or yyy
如果在同一級(jí)出現(xiàn)多于一個(gè)的and或or或and和or的組合,那么是不合法的,例如下面的表達(dá)式是不合法的:
xxx and yyy and zzz
或者
xxx or yyy or zzz
或者
xxx and yyy or zzz
等等
為了讓復(fù)雜的表達(dá)變得合法,可以讓一個(gè)復(fù)雜的表達(dá)式變?yōu)槎嗉?jí)的表達(dá)形式,每一級(jí)只有一個(gè)and或一個(gè)or就可以了,例如:
xxx and yyy and zzz是錯(cuò)誤的,進(jìn)行一下簡單的變換:
(xxx and yyy) and zzz或者xxx and (yyy and zzz)等都是合法的。

5)其他合法的輸入,例如可以使用雙引號(hào)和單引號(hào)引用literal字符串等等。

2,錯(cuò)誤消息的定制

無論是validwhen還是其它驗(yàn)證例程,都可以定制驗(yàn)證出錯(cuò)后的錯(cuò)誤信息,定制消息有兩種方式,即全局方式和本地方式。

1)全局方式,即在validator-rules.xml中某個(gè)validator里面定義的消息,參數(shù)名為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中的一個(gè)屬性名

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

 

2)本地方式,即在validation.xml中的field中定義的錯(cuò)誤消息,格式為:
<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屬性的值應(yīng)該為某個(gè)驗(yàn)證例程的名稱,例如name="required"、name="date"等,這指明了當(dāng)該field的該驗(yàn)證例程(例如required、date等)出錯(cuò)時(shí)所顯示的錯(cuò)誤信息。
*如果全局已經(jīng)定義了msg的信息,而且本地的msg的key與全局的msg的key相同,那么在該field的驗(yàn)證中,本地的msg將覆蓋全局的msg。
*<arg0>到<arg4>的屬性中也有name屬性,即該arg參數(shù)所應(yīng)用的驗(yàn)證例程,例如<arg0 name="date" key="label.startDate"/>,即該參數(shù)用于date驗(yàn)證的出錯(cuò)信息。注意,對(duì)于一個(gè)field,需要的驗(yàn)證規(guī)則有時(shí)不止一個(gè),例如depends="required,date",而多個(gè)驗(yàn)證規(guī)則中的每一個(gè)都需要出錯(cuò)時(shí)傳入一些參數(shù)信息,如果它們所需要的參數(shù)個(gè)數(shù)、名稱和順序都相同,那么只要定義<arg0...、<arg1...等等即可。但是如果它們需要的參數(shù)的個(gè)數(shù)、名稱和順序不同怎么辦,如果我們對(duì)于第一個(gè)輸入?yún)?shù)只定義一個(gè)arg0,那么這個(gè)arg0用于哪個(gè)驗(yàn)證消息,因此這時(shí)必須通過arg標(biāo)簽的name屬性來表示該參數(shù)所服務(wù)的驗(yàn)證。

3,例子

場(chǎng)景:在一個(gè)表單中,有兩個(gè)文本域,用于得到一個(gè)時(shí)間段,一個(gè)文本域輸入起始日期(startDate),另一個(gè)輸入終止日期(endDate)。
約束:日期格式為:年(四位數(shù))-月(兩位數(shù))-日(兩位數(shù)),而且終止日期大于起始日期。

根據(jù)上述條件,驗(yàn)證規(guī)則如下:

<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中調(diào)試信息,往往會(huì)使用System.out.println的方式打印消息,這種方式不是很雅觀,為了解決這個(gè)問題,
在includes/CommonsTaglib.jsp中加入了apache的log標(biāo)簽,使用很簡單!
  • 語法格式
    • <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屬于哪個(gè)類或資源擁有,在java文件中我們通常將java類自身的class賦給category,在jsp中我們可以將包含該文件名的資源路徑賦給category,例如

   <log:debug category="admin/resources/application/application.jsp">
      now into application.jsp
   </log>
附:
本站僅提供存儲(chǔ)服務(wù),所有內(nèi)容均由用戶發(fā)布,如發(fā)現(xiàn)有害或侵權(quán)內(nèi)容,請(qǐng)點(diǎn)擊舉報(bào)。
打開APP,閱讀全文并永久保存 查看更多類似文章
猜你喜歡
類似文章
Struts Validator驗(yàn)證器使用指南
Struts源代碼閱讀(Commons-Validator) - [Matrix - 與 Java 共舞]
Apache Commons工具集簡介
Struts Validator 開發(fā)指南
【開發(fā)常識(shí)】這個(gè)問題,直接導(dǎo)致年終獎(jiǎng)沒了……(慘兮兮)
【solr基礎(chǔ)教程之二】索引
更多類似文章 >>
生活服務(wù)
分享 收藏 導(dǎo)長圖 關(guān)注 下載文章
綁定賬號(hào)成功
后續(xù)可登錄賬號(hào)暢享VIP特權(quán)!
如果VIP功能使用有故障,
可點(diǎn)擊這里聯(lián)系客服!

聯(lián)系客服