<rt id="bn8ez"></rt>
<label id="bn8ez"></label>

  • <span id="bn8ez"></span>

    <label id="bn8ez"><meter id="bn8ez"></meter></label>

    最愛Java

    書山有路勤為徑,學海無涯苦作舟

    2010年11月11日

        Java程序的國際化主要通過三個類完成:

        java.util.ResourceBundle:用于加載一個資源包。

        java.util.Locale:對應一個特定的國家/區域、語言環境。

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

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

        以下的程序可以得到Java所支持的語言和國家:

    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());
            }

        }

    }

        使用國際化的代碼如: 

    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}.這樣需要程序動態插入參數的文本,則需要使用MessageFormat類的format()方法。

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

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

    }


        對于簡體中文的Locale,ResourceBundler搜索資源的順序是:

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

     

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

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

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


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

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

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

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

        同時,我們也可以為LoginAction單獨指定一份國際化資源文件。即在codes\packageScope\src\lee\action目錄下,分別建立LoginAction_zh_CN.properties和LoginAction_en_US.properties兩個文件。

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

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

          對于在JSP中訪問國際化消息,則簡單很多,可以分為兩種形式:

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

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

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

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

    2010年11月7日

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

    2010年10月24日

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

        對于Struts2所支持的內建校驗器,我們可以通過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;
        
        //該請求包含的4個請求參數
        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;
        }
    }

         

        對于不能通過內置校驗器進行校驗的邏輯,則可通過重寫validate()方法來實現。如果一個Action中存在多個邏輯處理,則需要通過validateXxx()方法來分別進行校驗,其中Xxx代表方法名。如login()方法對應的校驗方法為validateLogin()。

        Struts2的輸入校驗流程:

        1。類型轉換器負責對字符串的請求參數執行類型轉換,并將這些值設置成Action的屬性值。

        2。在執行類型轉換過程中,如果發生異常,則將異常保存到ActionContext中,并由conversionError攔截器負責將其封裝到fieldError里。然后執行第3步;如無異常,直接執行第3步。

        3。調用Struts2內置的輸入校驗規則進行輸入校驗

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

        5。調用validate()方法。

        6。如果上述都未發生fieldError,將調用Action里處理用戶請求的處理方法;如果出現了fieldError,則轉入input邏輯視圖所指定的視圖資源。

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

    2009年10月27日

         摘要: Ext.data.Connection     Ext.data.Connection是對Ext.lib.Ajax的封裝,它提供了配置使用Ajax的通用方式,它在內部通過Ext.lib.Ajax實現與后臺的異步調用。與底層的Ext.lib.Ajax相比,Ext.data.Connection提供了更簡潔的配置方式,使用起來更方便。   ...  閱讀全文
    posted @ 2009-10-27 11:00 Brian 閱讀(1398) | 評論 (1)編輯 收藏

    2009年10月26日

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

    2009年10月25日

    Ext.MessageBox

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

     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('你剛剛點擊了' + btn + ", 剛剛輸入了" + text);
    10    }

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

    22}
    );

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

    進度條

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

        上述的進度狀態時不會發生變化的,我們需要調用Ext.MessageBox.updateProgress()函數,如以下為每秒變化,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 + '個,一共10個');
     7        }

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

        還可以使用一種自動變化的進度條提示框,如Ext.MessageBox.wait('請等待', msg: ' 讀取數據中');

    動畫效果
        
    可以為對話框這是彈出和關閉的動畫效果,使用animEl參數指定一個HTML元素,對話框就會依據指定的HTML元素播放彈出和關閉的動畫。

    窗口分組

     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="放到后臺"/>
    35    <input id="btnHide" type="button" name="btnHide" value="隱藏所有"/>
    36 </BODY>

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

    2009年10月23日

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

    2009年10月22日

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

    公告


    導航

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

    統計

    常用鏈接

    留言簿(4)

    隨筆分類

    隨筆檔案

    收藏夾

    搜索

    最新評論

    閱讀排行榜

    評論排行榜

    主站蜘蛛池模板: 色一情一乱一伦一视频免费看| 女人被男人躁的女爽免费视频| 精品成人一区二区三区免费视频| 亚洲AV一宅男色影视| 免费观看亚洲人成网站| 福利免费观看午夜体检区| 美女被免费网站91色| 国产成人久久精品亚洲小说| 亚洲六月丁香六月婷婷蜜芽| 精品国产亚洲一区二区三区| 一本久到久久亚洲综合| 成全视频免费高清| 成人在线免费看片| 99免费在线观看视频| 国产成人免费ā片在线观看老同学| 免费福利在线观看| 亚洲av色香蕉一区二区三区蜜桃| 亚洲av无码不卡久久| 亚洲香蕉免费有线视频| 亚洲av无码专区在线播放| 国产AV无码专区亚洲AV手机麻豆 | 国产一级做a爱免费视频| 亚洲精品免费网站| 免费v片在线观看视频网站| 亚洲精品免费视频| 青青青国产手机频在线免费观看| 中文字幕在线观看免费| www一区二区www免费| 一级特黄特色的免费大片视频| 精品无码专区亚洲| 美女18毛片免费视频| 在线观看亚洲免费| 免费人成网站永久| 九九全国免费视频| 亚洲黄片手机免费观看| a毛片成人免费全部播放| 中文字字幕在线高清免费电影| a毛片成人免费全部播放| 精品多毛少妇人妻AV免费久久| 美女被免费网站91色| 一个人免费视频观看在线www|