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

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

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

    最愛Java

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

    2010年10月24日

        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()方法。

        除了使用資源文件,我們也可以使用類文件來(lái)代替資源文件。使用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)來(lái)處理,其中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來(lái)組織國(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.../>來(lái)充當(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)前包上溯,直到最頂層包來(lái)查找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。因此,用戶也可利用此功能來(lái)開發(fā)自行選擇語(yǔ)言的功能。

    posted @ 2010-11-11 22:16 Brian 閱讀(326) | 評(píng)論 (0)編輯 收藏
         摘要:     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 閱讀(474) | 評(píng)論 (0)編輯 收藏

        對(duì)于login方法的校驗(yàn),可以通過<ActionClassName>-<ActionAliasName>-validation.xml文件來(lái)校驗(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)。具體來(lái)說(shuō),其校驗(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()方法來(lái)實(shí)現(xiàn)。如果一個(gè)Action中存在多個(gè)邏輯處理,則需要通過validateXxx()方法來(lái)分別進(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步;如無(wú)異常,直接執(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 閱讀(483) | 評(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 閱讀(354) | 評(píng)論 (0)編輯 收藏

    公告


    導(dǎo)航

    <2010年10月>
    262728293012
    3456789
    10111213141516
    17181920212223
    24252627282930
    31123456

    統(tǒng)計(jì)

    常用鏈接

    留言簿(4)

    隨筆分類

    隨筆檔案

    收藏夾

    搜索

    最新評(píng)論

    閱讀排行榜

    評(píng)論排行榜

    主站蜘蛛池模板: 一边摸一边桶一边脱免费视频 | 亚洲成在人线aⅴ免费毛片| 免费毛片在线播放| 丁香花在线观看免费观看图片| 亚洲男人天堂av| 日本免费一区尤物| 久久精品无码精品免费专区| 久久亚洲精品国产精品婷婷| 狠狠亚洲狠狠欧洲2019| 日韩免费a级毛片无码a∨| 一个人免费观看视频在线中文| 亚洲宅男天堂a在线| 亚洲欧洲中文日韩av乱码| 四虎永久在线精品免费观看视频| 一级毛片aaaaaa视频免费看| 亚洲成人福利网站| 亚洲无人区午夜福利码高清完整版| 国产va免费精品观看精品| 中文字幕免费观看全部电影| 亚洲精品无码aⅴ中文字幕蜜桃| 亚洲va久久久噜噜噜久久狠狠| 国产亚洲精品免费| 性短视频在线观看免费不卡流畅| 久久99久久成人免费播放| 亚洲午夜无码毛片av久久京东热| 久久国产亚洲精品麻豆| 免费亚洲视频在线观看| 免费无码A片一区二三区| 一个人看的www免费视频在线观看 一个人免费视频观看在线www | 成人黄18免费视频| 国产精品免费无遮挡无码永久视频| 男人的天堂av亚洲一区2区| 亚洲精品成人久久| 国产AV无码专区亚洲精品| 亚洲国产精品自产在线播放| 成人影片麻豆国产影片免费观看| 99国产精品免费视频观看| 黄色短视频免费看| 国产亚洲精品成人久久网站| 亚洲熟妇丰满xxxxx| 亚洲国产精品免费在线观看|