最愛Java

          書山有路勤為徑,學(xué)海無涯苦作舟

          2010年11月11日

              Java程序的國(guó)際化主要通過三個(gè)類完成:

              java.util.ResourceBundle:用于加載一個(gè)資源包。

              java.util.Locale:對(duì)應(yīng)一個(gè)特定的國(guó)家/區(qū)域、語(yǔ)言環(huán)境。

              java.text.MessageFormat:用于消息格式化。

              而資源文件的命名方式主要有三種:baseName_language_country.properties、baseName_language.properties和baseName.properties。

              以下的程序可以得到Java所支持的語(yǔ)言和國(guó)家:

          public class LocalList {
              
          public static void main(String[] args){
                  Locale[] localeList 
          = Locale.getAvailableLocales();
                  
          for (int i=0;i<localeList.length;i++){
                      System.out.println(localeList[i].getdisplayCountry() 
          + "=" + localeList[i].getCountry() + " " + localeList[i].getDisplayLanguage() + "=" + localeList[i].getLanguage());
                  }

              }

          }

              使用國(guó)際化的代碼如: 

          public class Hello{
              
          public static void main(String[] args){
                  Locale myLocale 
          = Locale.getDefault();
                  ResourceBundle bundle 
          = ResourceBundle.getBundle("mess",myLocale);
                  System.out.println(bundler.getString(
          "hello"));
              }

          }

              如果在資源文件中,存在例如msg = Hello,{0}!Today is {1}.這樣需要程序動(dòng)態(tài)插入?yún)?shù)的文本,則需要使用MessageFormat類的format()方法。

              除了使用資源文件,我們也可以使用類文件來代替資源文件。使用Java文件代替資源文件的Java文件必須滿足:1。類名必須是baseName_language_country,這與屬性文件的命名相似。2。該類必須繼承ListResourceBundle,并重寫getContents方法,該方法返回Object數(shù)組。該數(shù)組的每一個(gè)項(xiàng)都是key-value對(duì)。

          public class MyResource_zh_CN extends ListResourceBundle {
              
          //定義資源
              private final Object myData[][] = {
                  
          {"msg","類文件消息:{0},您好!今天是{1}"}
              }
          ;
              @Override
              
          public Object[][] getContents(){
                  
          return myData;
              }

          }


              對(duì)于簡(jiǎn)體中文的Locale,ResourceBundler搜索資源的順序是:

              baseName_zh_CN.class;baseName_zh_CH.properties;baseName_zh.class;baseName_zh.properties;baseName.class;baseName.properties

           

              Struts2訪問國(guó)際化消息,主要有3種方式:1)JSP頁(yè)面輸出國(guó)際化消息,可以使用Struts2的<s:text.../>標(biāo)簽,該標(biāo)簽可以指定一個(gè)name屬性,該屬性就是資源文件中的key。2)在Action中,可以使用ActionSupport類的getText方法,該方法可以接受一個(gè)name參數(shù),指定了國(guó)際化資源文件中的key。3)表單元素的Label,可以為表單標(biāo)簽指定一個(gè)key屬性,這個(gè)key指定了國(guó)際化資源文件的key。

               對(duì)于帶占位符的國(guó)際化消息,在Action中,則需要使用getText(String key, String[] args)來處理,其中args就是參數(shù)列表;而在頁(yè)面中,則需要為<s:text.../>標(biāo)簽指定<s:param.../>子標(biāo)簽。如:

          <s:text name="welcomeMsg">
              
          <s:param><s:property value="username"></s:param>
          </s:text>


             在Struts2中,還有一種更加簡(jiǎn)單的表達(dá)方式。我們可以在資源文件中寫例如這樣的表達(dá)式:failTip=${username},對(duì)不起,您不能登錄!,通過使用表達(dá)式,可以從ValueStack中取出username屬性值,自動(dòng)填充到消息資源中。這在Action中很常用。

              對(duì)于一個(gè)大型應(yīng)用而言,國(guó)際化資源文件的管理也是一個(gè)非常浩大的工程。為了能更好的分而治之,Struts2允許針對(duì)不同的模塊、不同Action來組織國(guó)家化資源文件。

               為Strut2應(yīng)用指定包范圍資源文件的方法是:在包的跟路徑下建立多個(gè)文件名為package_language_country.properties的文件,一旦建立了這個(gè)系列的國(guó)際化資源文件,應(yīng)用中處于該包下的所有Action都可以訪問該資源文件。

              例如一個(gè)Action為codes\packageScope\src\lee\action\LoginAction.java,那么我們可以提供package_zh_CN.properties和package_en_US.properties兩個(gè)文件放在codes\packageScope\src\lee目錄下,那么這兩個(gè)文件就能被lee包及l(fā)ee包下所有子包內(nèi)的Action所能訪問。

              同時(shí),我們也可以為L(zhǎng)oginAction單獨(dú)指定一份國(guó)際化資源文件。即在codes\packageScope\src\lee\action目錄下,分別建立LoginAction_zh_CN.properties和LoginAction_en_US.properties兩個(gè)文件。

              有時(shí)候,處于某種特殊的原因,我們需要臨時(shí)指定資源文件,那么就需要使用<s:i18n.../>來充當(dāng)<s:text.../>標(biāo)簽的父標(biāo)簽了。如:

          <s:i18n name="tmp">
              
          <s:text name="loginPage"/>
          </s:i18n>

          <s:i18n name="tmp">
              
          <s:form action="login">
                  
          <s:textfield name="username" key="user"/>
                  
          <s:textfield name="password" key="pass"/>
                  
          <s:submit key="login"/>
              
          </s:form>
          </s:i18n>


              加載資源文件的順序:

          1.     優(yōu)先加載系統(tǒng)中保存在ChildAction的類文件相同位置,且baseName為ChildAction的系列資源文件。
          2.     如果在1)中找不到key對(duì)應(yīng)的消息,且ChildAction有父類ParentAction,則加載系統(tǒng)中保存在ParentAction的類文件相同位置,且baseName為ParentAction的系列資源文件。
          3.     如果2)中找不到key對(duì)應(yīng)的消息,且ChildAction有實(shí)現(xiàn)接口IChildAction,則加載系統(tǒng)中保存在IChildAction的類文件相同位置,且baseName為IChildAction的系列資源文件。
          4.     如果3)中找不到key對(duì)應(yīng)的消息,且ChildAction有實(shí)現(xiàn)接口ModelDriven(即使用模型驅(qū)動(dòng)模式),則對(duì)于getModel()方法返回的model對(duì)象,重新執(zhí)行1)步操作。
          5.     如果在4)中找不到key對(duì)應(yīng)的消息,則查找當(dāng)前包下baseName為package的系列資源文件。
          6.     如果在5)中找不到key對(duì)應(yīng)的消息,則沿著當(dāng)前包上溯,直到最頂層包來查找baseName為package的系列資源文件。
          7.     如果在6)中找不到key對(duì)應(yīng)的消息,則查找struts.custom.i18n.resources常量指定baseName的系列資源文件。
          8.     如果經(jīng)過上面步驟一直找不到key對(duì)應(yīng)的消息,將直接輸出該key的字符串值

                對(duì)于在JSP中訪問國(guó)際化消息,則簡(jiǎn)單很多,可以分為兩種形式:

                1)對(duì)于使用<s:i18n.../>標(biāo)簽作為父標(biāo)簽的<s:text.../>標(biāo)簽,將直接從<s:i18n.../>標(biāo)簽指定的國(guó)際化資源文件中加載指定key對(duì)應(yīng)的消息,如果沒有,則讀取struts.custom.i18n.resources常量指定baseName的系列文件。如果還沒有,直接輸出key。

               2)對(duì)于沒有使用<s:i18n.../>標(biāo)簽作為父標(biāo)簽的<s:text.../>標(biāo)簽,則直接讀取struts.custom.i18n.resources常量指定baseName的系列文件。如果沒有,直接輸出key。

              Struts2中, 我們可以通過ActionContext.getContext().setLocale(Locale arg)設(shè)置用戶的默認(rèn)語(yǔ)言。同時(shí)在Struts2 的defaultStack攔截棧中,i18n攔截器也能設(shè)置默認(rèn)語(yǔ)言。i18n在執(zhí)行Action方法前,會(huì)自動(dòng)查找一個(gè)名為request_locale的參數(shù)。如果這個(gè)參數(shù)存在,則攔截器會(huì)將其轉(zhuǎn)換成Locale對(duì)象,并設(shè)為默認(rèn)的Locale。同時(shí),這個(gè)Locale對(duì)象會(huì)保存在Session的名為WW_TRANS_I18N_LOCALE的屬性中。一旦用戶的Session中有WW_TRANS_I18N_LOCALE屬性,則屬性指定的Locale將會(huì)作為瀏覽器的默認(rèn)Locale。因此,用戶也可利用此功能來開發(fā)自行選擇語(yǔ)言的功能。

          posted @ 2010-11-11 22:16 Brian 閱讀(328) | 評(píng)論 (0)編輯 收藏

          2010年11月7日

               摘要:     Struts2默認(rèn)使用Jakarta的Common-FileUpload的文件上傳解析器。見struts.properties配置文件中: Code highlighting produced by Actipro CodeHighlighter (freeware)http://www.CodeHighlighter.com/-->#指定使用COS的文件上...  閱讀全文
          posted @ 2010-11-07 14:19 Brian 閱讀(477) | 評(píng)論 (0)編輯 收藏

          2010年10月24日

              對(duì)于login方法的校驗(yàn),可以通過<ActionClassName>-<ActionAliasName>-validation.xml文件來校驗(yàn),即RegistAction-login-validation.xml文件進(jìn)行校驗(yàn)。同時(shí),RegistAction-validation.xml的校驗(yàn)規(guī)則仍舊對(duì)login方法有效。即login方法的校驗(yàn)規(guī)則是Region-validation.xml和RegistAction-login-validation.xml的總和。
              如果RegistAction繼承了BaseAction,那么對(duì)于BaseAction類的校驗(yàn)規(guī)則也會(huì)被RegistAction類所繼承校驗(yàn)。具體來說,其校驗(yàn)規(guī)則的搜索文件規(guī)則如下:
                  BaseAction-validation.xml
                  BaseAction-別名-validation.xml
                  RegistAction-validation.xml
                  RegistAction-別名-validation.xml

              對(duì)于Struts2所支持的內(nèi)建校驗(yàn)器,我們可以通過xwork.2.1.2.jar中的com/opensymphony/xwork2/validator/validators/default.xml文件查看。

              除了配置文件,Struts2也支持Annotation。下面就是使用Annotation配置的RegistAction:

          @Validation()
          public class RegistAction extends ActionSupport {
              private static final long serialVersionUID = -2113900523366315993L;
              
              //該請(qǐng)求包含的4個(gè)請(qǐng)求參數(shù)
              private String name;
              private String pass;
              private int age;
              private Date birth;
              
              
              public String getName() {
                  return name;
              }
                  @RequiredStringValidator(type=ValidatorType.FIELD,key="name.required",message="")
                  @RegexFieldValidator(type=ValidatorType.FIELD,expression="\\w{4,25}",key="name.regex",message="")
              public void setName(String name) {
                  this.name = name;
              }
              public String getPass() {
                  return pass;
              }
                  @RequiredStringValidator(type=ValidatorType.FIELD,key="pass.required",message="")
                  @RegexFieldValidator(type=ValidatorType.FIELD,expression="\\w{4,25}",key="pass.regex",message="")
              public void setPass(String pass) {
                  this.pass = pass;
              }
              public int getAge() {
                  return age;
              }
                  @IntRangeFieldValidator(message="",key="age.range",min="1",max="150")
              public void setAge(int age) {
                  this.age = age;
              }
              public Date getBirth() {
                  return birth;
              }
                  @DateRangeFieldValidator(message="",key="birth.range",min="1900/01/01",max="2050/01/21")
              public void setBirth(Date birth) {
                  this.birth = birth;
              }
          }

               

              對(duì)于不能通過內(nèi)置校驗(yàn)器進(jìn)行校驗(yàn)的邏輯,則可通過重寫validate()方法來實(shí)現(xiàn)。如果一個(gè)Action中存在多個(gè)邏輯處理,則需要通過validateXxx()方法來分別進(jìn)行校驗(yàn),其中Xxx代表方法名。如login()方法對(duì)應(yīng)的校驗(yàn)方法為validateLogin()。

              Struts2的輸入校驗(yàn)流程:

              1。類型轉(zhuǎn)換器負(fù)責(zé)對(duì)字符串的請(qǐng)求參數(shù)執(zhí)行類型轉(zhuǎn)換,并將這些值設(shè)置成Action的屬性值。

              2。在執(zhí)行類型轉(zhuǎn)換過程中,如果發(fā)生異常,則將異常保存到ActionContext中,并由conversionError攔截器負(fù)責(zé)將其封裝到fieldError里。然后執(zhí)行第3步;如無異常,直接執(zhí)行第3步。

              3。調(diào)用Struts2內(nèi)置的輸入校驗(yàn)規(guī)則進(jìn)行輸入校驗(yàn)

              4。通過放射調(diào)用validateXxx()方法。

              5。調(diào)用validate()方法。

              6。如果上述都未發(fā)生fieldError,將調(diào)用Action里處理用戶請(qǐng)求的處理方法;如果出現(xiàn)了fieldError,則轉(zhuǎn)入input邏輯視圖所指定的視圖資源。

          posted @ 2010-10-24 15:35 Brian 閱讀(487) | 評(píng)論 (1)編輯 收藏
               摘要:     Struts2提供了基于驗(yàn)證框架的輸入校驗(yàn),在這種校驗(yàn)方式下,所有的輸入校驗(yàn)只需要通過指定的配置文件即可。Struts2中每個(gè)Action都有一個(gè)校驗(yàn)文件,其規(guī)則為:<Action名字>-validation.xml。如: Code highlighting produced by Actipro CodeHighlighter (freewar...  閱讀全文
          posted @ 2010-10-24 15:01 Brian 閱讀(358) | 評(píng)論 (0)編輯 收藏

          2009年10月27日

               摘要: Ext.data.Connection     Ext.data.Connection是對(duì)Ext.lib.Ajax的封裝,它提供了配置使用Ajax的通用方式,它在內(nèi)部通過Ext.lib.Ajax實(shí)現(xiàn)與后臺(tái)的異步調(diào)用。與底層的Ext.lib.Ajax相比,Ext.data.Connection提供了更簡(jiǎn)潔的配置方式,使用起來更方便。   ...  閱讀全文
          posted @ 2009-10-27 11:00 Brian 閱讀(1402) | 評(píng)論 (1)編輯 收藏

          2009年10月26日

               摘要: 簡(jiǎn)單菜單 //創(chuàng)建工具條 var tb = new Ext.Toolbar(); tb.render('toolbar'); //為工具條添加按鈕 tb.add({     text:'新建',     //對(duì)應(yīng)的事件處理函數(shù)   ...  閱讀全文
          posted @ 2009-10-26 14:43 Brian 閱讀(2056) | 評(píng)論 (0)編輯 收藏
               摘要: 布局概述              在EXT中,所有的布局都是從Ext.Container開始的,Ext.Container的父類是Ext.BoxComponent。Ext.BoxComponent是一個(gè)盒子組件,可以定義寬度,高度和位置等屬性。作為子類,Ext.Co...  閱讀全文
          posted @ 2009-10-26 12:23 Brian 閱讀(2837) | 評(píng)論 (0)編輯 收藏

          2009年10月25日

          Ext.MessageBox

           1//Ext.MessageBox.alert()
           2Ext.MessageBox.alert('標(biāo)題','內(nèi)容',function(btn){
           3    alert('你剛剛點(diǎn)擊了' + btn);
           4}
          );
           5
           6//Ext.MessageBox.confirm()
           7Ext.MessageBox.confirm('選擇框','你到底是選擇Yes還是No?', function(btn) {
           8    alert('你剛剛點(diǎn)擊了' + btn);
           9}
          );
          10
          11//Ext.MessageBox.prompt()
          12Ext.MessageBox.prompt('輸入框','隨便輸入一些東西', function(btn,text) {
          13    alert('你剛剛點(diǎn)擊了' + btn + ", 剛剛輸入了" + text);
          14}
          );
              
          對(duì)話框的更多配置

           1//可以輸入多行的輸入框
           2Ext.MessageBox.show({
           3    title:'多行輸入框',
           4    msg:'你可以多輸入好幾行',
           5    width:300,
           6    buttons:Ext.MessageBox.OKCANCEL,
           7    multiline:true,
           8    fn:function(btn,text){
           9        alert('你剛剛點(diǎn)擊了' + btn + ", 剛剛輸入了" + text);
          10    }

          11}
          );
          12
          13//自定義對(duì)話框的按鈕
          14Ext.MessageBox.show({
          15    title:'隨便按個(gè)按鈕',
          16    msg:'從三個(gè)按鈕里隨便選擇一個(gè)',
          17    buttons:Ext.MessageBox.YESNOCANCEL,
          18    multiline:true,
          19    fn:function(btn){
          20        alert('你剛剛點(diǎn)擊了' + btn);
          21    }

          22}
          );

              Ext.MessageBox中預(yù)設(shè)的4個(gè)按鈕分別是OK,Yes,No,Cancel。如果不使用YESNOCANCEL這種預(yù)設(shè)變量,也可以直接使用{ok:true, yes:true, no:true,cancel:true}的形式,這樣4個(gè)按鈕都會(huì)顯示在對(duì)話框中。

          進(jìn)度條

           1Ext.MessageBox.show({
           2    title:'請(qǐng)等待',
           3    msg:'讀取數(shù)據(jù)中',
           4    width:240,
           5    progress:true,
           6    closable:false  //隱藏對(duì)話框右上角的關(guān)閉按鈕,從而禁止用戶關(guān)閉進(jìn)度條
           7}
          );
           8
           9//也可以直接使用Ext.MessageBox.progress()
          10Ext.MessageBox.progress('請(qǐng)等待',msg:'讀取數(shù)據(jù)中');
          11

              上述的進(jìn)度狀態(tài)時(shí)不會(huì)發(fā)生變化的,我們需要調(diào)用Ext.MessageBox.updateProgress()函數(shù),如以下為每秒變化,10秒后隱藏:

           1var f = function(v){
           2    return function(){
           3        if (v == 11{
           4            Ext.MessageBox.hide();
           5        }
           esle {
           6            Ext.MessageBox.updateProgress(v/10,'正在讀取第' + v + '個(gè),一共10個(gè)');
           7        }

           8    }
          ;
           9}
          ;
          10for (var i = 1 ; i < 12 ; i++{
          11    setTimeout(f(i) , i*1000);
          12}

              還可以使用一種自動(dòng)變化的進(jìn)度條提示框,如Ext.MessageBox.wait('請(qǐng)等待', msg: ' 讀取數(shù)據(jù)中');

          動(dòng)畫效果
              
          可以為對(duì)話框這是彈出和關(guān)閉的動(dòng)畫效果,使用animEl參數(shù)指定一個(gè)HTML元素,對(duì)話框就會(huì)依據(jù)指定的HTML元素播放彈出和關(guān)閉的動(dòng)畫。

          窗口分組

           1        <script type="text/javascript">
           2var i = 0 , mygroup;
           3
           4function newWin(){
           5    var win = new Ext.Window({
           6        title:'窗口'+ i++,
           7        width:400,
           8        height:300,
           9        maximizable:true,
          10        manager:mygroup
          11    }
          );
          12    win.show();
          13}

          14
          15function toBack(){
          16    mygroup.sendToBack(mygroup.getActive());
          17}

          18
          19function hideAll(){
          20    mygroup.hideAll();
          21}

          22
          23Ext.onReady(function(){
          24    mygroup = new Ext.WindowGroup();
          25
          26    Ext.get("btn").on("click",newWin);
          27    Ext.get("btnToBack").on("click",toBack);
          28    Ext.get("btnHide").on("click",hideAll);
          29}
          );
          30        </script>
          31
          32 <BODY>
          33    <input id="btn" type="button" name="add" value="新窗口"/>
          34    <input id="btnToBack" type="button" name="btnToBack" value="放到后臺(tái)"/>
          35    <input id="btnHide" type="button" name="btnHide" value="隱藏所有"/>
          36 </BODY>

              示例中,所有通過newWind()方法產(chǎn)生的窗口都屬于mygroup窗口組
          posted @ 2009-10-25 11:24 Brian 閱讀(5596) | 評(píng)論 (2)編輯 收藏

          2009年10月23日

               摘要: 先看最簡(jiǎn)單的拖放: 1new Ext.dd.DDProxy('block'); 2//對(duì)應(yīng)的HTML部分代碼 3<div id="block" style="background:red;">&nbsp;</div>  拖放組件的體系     簡(jiǎn)單來說,左面4個(gè)組件都是...  閱讀全文
          posted @ 2009-10-23 23:42 Brian 閱讀(3123) | 評(píng)論 (0)編輯 收藏

          2009年10月22日

               摘要: 基本輸入控件Ext.form.Field     Ext.form.Field是所有表單輸入控件的基類,其他的輸入控件都是基于它擴(kuò)展的來的。其定義了輸入控件通用的屬性和功能函數(shù),這些通用的屬性和功能函數(shù)大致分為3大類:頁(yè)面顯示樣式、控件參數(shù)配置和數(shù)據(jù)有效性校驗(yàn)。     頁(yè)面顯示樣式:clearCls, cls, ...  閱讀全文
          posted @ 2009-10-22 14:31 Brian 閱讀(2971) | 評(píng)論 (0)編輯 收藏
          僅列出標(biāo)題  下一頁(yè)

          公告


          導(dǎo)航

          <2025年5月>
          27282930123
          45678910
          11121314151617
          18192021222324
          25262728293031
          1234567

          統(tǒng)計(jì)

          常用鏈接

          留言簿(4)

          隨筆分類

          隨筆檔案

          收藏夾

          搜索

          最新評(píng)論

          閱讀排行榜

          評(píng)論排行榜

          主站蜘蛛池模板: 启东市| 甘南县| 泰顺县| 勐海县| 名山县| 错那县| 鄂托克前旗| 乌什县| 贡觉县| 滨州市| 舟山市| 满城县| 理塘县| 获嘉县| 屏东市| 鹤峰县| 博野县| 蓬莱市| 时尚| 莱西市| 尖扎县| 辉南县| 广安市| 宁安市| 涟源市| 八宿县| 镇坪县| 承德市| 芜湖市| 五常市| 友谊县| 利辛县| 郎溪县| 潍坊市| 通化县| 斗六市| 乐山市| 都昌县| 锡林郭勒盟| 红安县| 逊克县|