關(guān)于國際化、OGNL表達(dá)式語言
一、國際化
準(zhǔn)備資源文件,資源文件的命名格式如下:
baseName_language_country.properties
baseName_language.properties
baseName.properties
其中baseName是資源文件的基本名,我們可以自定義,但language和country必須是java支持的語言和國家。
對(duì)于中文的屬性文件,我們編寫好后,應(yīng)該使用jdk提供的native2ascii命令把文件轉(zhuǎn)換為unicode編碼的文件。命令的使用方式如下:
native2ascii 源文件.properties 目標(biāo)文件.properties
二、配置全局資源與輸出國際化信息
當(dāng)準(zhǔn)備好資源文件之后,我們可以在struts.xml中通過struts.custom.i18n.resources常量把資源文件定義為全局資源文件,如下:
<constant name="struts.custom.i18n.resources" value=“csdn" />
csdn為資源文件的基本名。
后面我們就可以在頁面或在action中訪問國際化信息:
在JSP頁面中使用<s:text name=“”/>標(biāo)簽輸出國際化信息:
<s:text name=“user”/>,name為資源文件中的key
在Action類中,可以繼承ActionSupport,使用getText()方法得到國際化信息,該方法的第一個(gè)參數(shù)用于指定資源文件中的key。
在表單標(biāo)簽中,通過key屬性指定資源文件中的key,如:
<s:textfield name="realname" key="user"/>
三、國際化—輸出帶占位符的國際化信息
資源文件中的內(nèi)容如下:
welcome= {0},歡迎來到傳智播客{1}
在jsp頁面中輸出帶占位符的國際化信息
<s:text name="welcome">
<s:param><s:property value="realname"/></s:param>
<s:param>學(xué)習(xí)</s:param>
</s:text>
在Action類中獲取帶占位符的國際化信息,可以使用getText(String key, String[] args)或getText(String aTextName, List args)方法。
四、國際化—包范圍資源文件
在一個(gè)大型應(yīng)用中,整個(gè)應(yīng)用有大量的內(nèi)容需要實(shí)現(xiàn)國際化,如果我們把國際化的內(nèi)容都放置在全局資源屬性文件中,顯然會(huì)導(dǎo)致資源文件變的過于龐大、臃腫,不便于維護(hù),這個(gè)時(shí)候我們可以針對(duì)不同模塊,使用包范圍來組織國際化文件。
方法如下:
在java的包下放置package_language_country.properties資源文件,package為固定寫法,處于該包及子包下的action都可以訪問該資源。當(dāng)查找指定key的消息時(shí),系統(tǒng)會(huì)先從package資源文件查找,當(dāng)找不到對(duì)應(yīng)的key時(shí),才會(huì)從常量struts.custom.i18n.resources指定的資源文件中尋找。
五、國際化—Action范圍資源文件
我們也可以為某個(gè)action單獨(dú)指定資源文件,方法如下:
在Action類所在的路徑,放置ActionClassName_language_country.properties資源文件,ActionClassName為action類的簡(jiǎn)單名稱。
當(dāng)查找指定key的消息時(shí),系統(tǒng)會(huì)先從ActionClassName_language_country.properties資源文件查找,如果沒有找到對(duì)應(yīng)的key,然后沿著當(dāng)前包往上查找基本名為package 的資源文件,一直找到最頂層包。如果還沒有找到對(duì)應(yīng)的key,最后會(huì)從常量struts.custom.i18n.resources指定的資源文件中尋找。
六、國際化—JSP中直接訪問某個(gè)資源文件
struts2為我們提供了<s:i18n>標(biāo)簽,使用<s:i18n>標(biāo)簽我們可以在類路徑下直接從某個(gè)資源文件中獲取國際化數(shù)據(jù),而無需任何配置:
<s:i18n name=“csdn">
<s:text name=“welcome”/>
</s:i18n>
csdn為類路徑下資源文件的基本名。
如果要訪問的資源文件在類路徑的某個(gè)包下,可以這樣訪問:
<s:i18n name=“cn/csdn/action/package">
<s:text name="welcome">
<s:param>小張</s:param>
</s:text>
</s:i18n>
上面訪問cn.csdn.action包下基本名為package的資源文件。
七、OGNL表達(dá)式語言
OGNL是Object Graphic Navigation Language(對(duì)象圖導(dǎo)航語言)的縮寫,它是一個(gè)開源項(xiàng)目。 Struts 2框架使用OGNL作為默認(rèn)的表達(dá)式語言。
相對(duì)EL表達(dá)式,它提供了平時(shí)我們需要的一些功能,如:
支持對(duì)象方法調(diào)用,如xxx.sayHello();
支持類靜態(tài)方法調(diào)用和值訪問,表達(dá)式的格式為@[類全名(包括包路徑)]@[方法名 | 值名],例如:@java.lang.String@format('foo %s', 'bar')或@cn.csdn.Constant@APP_NAME;
操作集合對(duì)象。
Ognl 有一個(gè)上下文(Context)概念,說白了上下文就是一個(gè)MAP結(jié)構(gòu),它實(shí)現(xiàn)了java.utils.Map接口,在Struts2中上下文(Context)的實(shí)現(xiàn)為ActionContext,下面是上下文(Context)的結(jié)構(gòu)示意圖
訪問上下文(Context)中的對(duì)象需要使用#符號(hào)標(biāo)注命名空間,如#application、#session
另外OGNL會(huì)設(shè)定一個(gè)根對(duì)象(root對(duì)象),在Struts2中根對(duì)象就是ValueStack(值棧) 。如果要訪問根對(duì)象(即ValueStack)中對(duì)象的屬性,則可以省略#命名空間,直接訪問該對(duì)象的屬性即可。
在struts2中,根對(duì)象ValueStack的實(shí)現(xiàn)類為OgnlValueStack,該對(duì)象不是我們想像的只存放單個(gè)值,而是存放一組對(duì)象。在OgnlValueStack類里有一個(gè)List類型的root變量,就是使用他存放一組對(duì)象
|--request
|--application
context ------|--OgnlValueStack root變量[action, OgnlUtil, ... ]
|--session
|--attr
|--parameters
在root變量中處于第一位的對(duì)象叫棧頂對(duì)象。通常我們?cè)贠GNL表達(dá)式里直接寫上屬性的名稱即可訪問root變量里對(duì)象的屬性,搜索順序是從棧頂對(duì)象開始尋找,如果棧頂對(duì)象不存在該屬性,就會(huì)從第二個(gè)對(duì)象尋找,如果沒有找到就從第三個(gè)對(duì)象尋找,依次往下訪問,直到找到為止。
大家注意: Struts2中,OGNL表達(dá)式需要配合Struts標(biāo)簽才可以使用。如:<s:property value="name"/>
由于ValueStack(值棧)是Struts 2中OGNL的根對(duì)象,如果用戶需要訪問值棧中的對(duì)象,在JSP頁面可以直接通過下面的EL表達(dá)式訪問ValueStack(值棧)中對(duì)象的屬性:
${foo} //獲得值棧中某個(gè)對(duì)象的foo屬性
如果訪問其他Context中的對(duì)象,由于他們不是根對(duì)象,所以在訪問時(shí),需要添加#前綴。
application對(duì)象:用于訪問ServletContext,例如#application.userName或者#application['userName'],相當(dāng)于調(diào)用ServletContext的getAttribute("username")。
session對(duì)象:用來訪問HttpSession,例如#session.userName或者#session['userName'],相當(dāng)于調(diào)用session.getAttribute("userName")。
request對(duì)象:用來訪問HttpServletRequest屬性(attribute)的Map,例如#request.userName或者#request['userName'],相當(dāng)于調(diào)用request.getAttribute("userName")。
parameters對(duì)象:用于訪問HTTP的請(qǐng)求參數(shù),例如#parameters.userName或者#parameters['userName'],相當(dāng)于調(diào)用request.getParameter("username")。
attr對(duì)象:用于按page->request->session->application順序訪問其屬性。
八、為何使用EL表達(dá)式能夠訪問valueStack中對(duì)象的屬性
原因是Struts2對(duì)HttpServletRequest作了進(jìn)一步的封裝。簡(jiǎn)略代碼如下:
public class StrutsRequestWrapper extends HttpServletRequestWrapper {
public StrutsRequestWrapper(HttpServletRequest req) {
super(req);
}
public Object getAttribute(String s) {
......
ActionContext ctx = ActionContext.getContext();
Object attribute = super.getAttribute(s);//先從request范圍獲取屬性值
if (ctx != null) {
if (attribute == null) {//如果從request范圍沒有找到屬性值,即從ValueStack中查找對(duì)象的屬性值
......
ValueStack stack = ctx.getValueStack();
attribute = stack.findValue(s);
......
}
}
return attribute;
}
}
九、采用OGNL表達(dá)式創(chuàng)建List/Map集合對(duì)象
如果需要一個(gè)集合元素的時(shí)候(例如List對(duì)象或者M(jìn)ap對(duì)象),可以使用OGNL中同集合相關(guān)的表達(dá)式。
使用如下代碼直接生成一個(gè)List對(duì)象:
<s:set name="list" value="{'zhangming','xiaoi','liming'}" />
<s:iterator value="#list" id="n">
<s:property value="n"/><br>
</s:iterator>
生成一個(gè)Map對(duì)象:
<s:set name="foobar" value="#{'foo1':'bar1', 'foo2':'bar2'}" />
<s:iterator value="#foobar" >
<s:property value="key"/>=<s:property value="value"/><br>
</s:iterator>
Set標(biāo)簽用于將某個(gè)值放入指定范圍。
scope:指定變量被放置的范圍,該屬性可以接受application、session、request、 page或action。如果沒有設(shè)置該屬性,則默認(rèn)放置在OGNL Context中。
value:賦給變量的值.如果沒有設(shè)置該屬性,則將ValueStack棧頂?shù)闹蒂x給變量。
相關(guān)文章
springboot多環(huán)境配置方案(不用5分鐘)
這篇文章主要介紹了springboot多環(huán)境配置方案(不用5分鐘),文中通過示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧2020-01-01教你在一分鐘之內(nèi)理解Java Lambda表達(dá)式并學(xué)會(huì)使用
今天給大家?guī)У奈恼率荍ava8新特性的相關(guān)知識(shí),文章圍繞著如何在一分鐘之內(nèi)理解Java Lambda表達(dá)式并學(xué)會(huì)使用展開,文中有非常詳細(xì)的介紹,需要的朋友可以參考下2021-06-06java實(shí)現(xiàn)CSV文件導(dǎo)入與導(dǎo)出功能
這篇文章主要為大家詳細(xì)介紹了java實(shí)現(xiàn)CSV文件導(dǎo)入與導(dǎo)出,文中示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下2019-08-08解讀Spring配置文件中的property標(biāo)簽中的屬性
這篇文章主要介紹了Spring配置文件中的property標(biāo)簽中的屬性,具有很好的參考價(jià)值,希望對(duì)大家有所幫助,如有錯(cuò)誤或未考慮完全的地方,望不吝賜教2024-01-01