Posted on 2008-08-24 01:21
∪∩BUG 閱讀(2577)
評論(4) 編輯 收藏 所屬分類:
Struts2學(xué)習(xí)筆記
Struts 筆記
2008 08 23
為什么把國際化通稱I18n呢? 你數(shù)數(shù)國際化的單詞 internationalization有幾個(gè)字母? 20個(gè)! 那頭尾各是什么字母? i和n! 20-2=? 18! 那好請記下:I18n
一.標(biāo)準(zhǔn)i18n(國際化)操作
(1)添加資源文件的方式之一:在struts.xml文件中引入資源文件 <constant name="struts.custom.i18n.resources" value="資源文件名" />
添加資源文件的方式之二:創(chuàng)建struts.properties并在添加語句struts.custom.i18n.resources=資源文件名
(2)在JSP頁面中調(diào)用資源文件的方法:
1) 使用<s:text key / label/>
如:<s:text name="HelloWorld" />
2) 使用<s:property >
如:
<!-- 1.取當(dāng)前項(xiàng)目文件中的key(name)叫做HelloWorld
2.使用EL表達(dá)式通過getText方法簡單的獲取國際化字符串-->
<s:property value="%{getText('HelloWorld')}" />
<!-- 通過getText設(shè)置UI標(biāo)簽中l(wèi)abel標(biāo)簽的屬性 -->
<s:textfield name="name" label="%{getText('HelloWorld')}" />
(3)資源文件不同配置的自動查找順序
第一:通過<s:i18n>訪問待定位置的資源文件
第二:Action范圍的資源文件(只能由Action調(diào)用),資源文件名在Action的類文件的同級目錄下,與Action類名相同.
第三:包范圍內(nèi)的資源文件(以模塊方式管理資源文件),放在包目錄下.以package_en_zh
第四:通用性較強(qiáng)的全局資源文件,放在SRC目錄下
項(xiàng)目樹型圖

src/struts.xml
1
<?xml version="1.0" encoding="GBK"?>
2
<!DOCTYPE struts PUBLIC
3
"-//Apache Software Foundation//DTD Struts Configuration 2.0//EN"
4
"http://struts.apache.org/dtds/struts-2.0.dtd">
5
<struts>
6
<!--
7
Struts 2.0有兩個(gè)配置文件,struts.xml和struts.properties都是放在WEB-INF/classes/下。
8
struts.xml用于應(yīng)用程序相關(guān)的配置
9
struts.properties用于Struts 2.0的運(yùn)行時(shí)(Runtime)的配置
10
11
添加資源文件的方式之一:在struts.xml文件中引入資源文件
12
添加資源文件的方式之二:在struts.properties下添加語句struts.custom.i18n.resources=globalMessages
13
1.在Struts當(dāng)中用戶自定義的國際化資源文件,名為globalMessages.
14
2.value="globalMessages"沒有指定路徑,說明屬性文件在SRC目錄下,此為全局資源文件
15
-->
16
<constant name="struts.custom.i18n.resources"
17
value="globalMessages" />
18
<include file="struts-default.xml" /><!-- 使用缺省的struts的配置文件 -->
19
20
<!-- 包空間 I18nDemo 繼承 struts-default -->
21
<package name="I18nDemo" extends="struts-default">
22
23
<!-- 映射名name="LoginAction" ,使用com.Login.LoginAction來實(shí)現(xiàn) -->
24
<action name="LoginAction" class="com.Login.LoginAction">
25
<result>/LoginAction.jsp</result>
26
</action>
27
</package>
28
</struts>
29
30
WebRoot/WEB-INF/web.xml
1
<?xml version="1.0" encoding="UTF-8"?>
2
<web-app id="WebApp_ID" version="2.4"
3
xmlns="http://java.sun.com/xml/ns/j2ee"
4
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
5
xsi:schemaLocation="http://java.sun.com/xml/ns/j2ee http://java.sun.com/xml/ns/j2ee/web-app_2_4.xsd">
6
<display-name>Struts2Hello</display-name>
7
<filter>
8
<filter-name>struts2</filter-name>
9
<filter-class>
10
org.apache.struts2.dispatcher.FilterDispatcher
11
</filter-class><!-- 以過慮器的形式出現(xiàn) -->
12
</filter>
13
<filter-mapping>
14
<filter-name>struts2</filter-name>
15
<url-pattern>/*</url-pattern><!-- 過慮所有內(nèi)容 -->
16
</filter-mapping>
17
<welcome-file-list>
18
<welcome-file>index.html</welcome-file>
19
<welcome-file>index.htm</welcome-file>
20
<welcome-file>index.jsp</welcome-file>
21
<welcome-file>default.html</welcome-file>
22
<welcome-file>default.htm</welcome-file>
23
<welcome-file>default.jsp</welcome-file>
24
</welcome-file-list>
25
</web-app>
26
WebRoot/index.jsp
1
<%
@ page contentType="text/html; charset=UTF-8"%>
2
<%
@taglib prefix="s" uri="/struts-tags"%>
3
<html>
4
<head>
5
<title>Hello World</title>
6
</head>
7
<body>
8
<h2>
9
<s:text name="HelloWorld" />
10
</h2>
11
<h2>
12
<!--
13
1.取當(dāng)前項(xiàng)目文件中的key(name)叫做HelloWorld
14
2.使用EL表達(dá)式通過getText方法簡單的獲取國際化字符串
15
-->
16
<s:property value="%{getText('HelloWorld')}" />
17
</h2>
18
<!-- 通過getText設(shè)置UI標(biāo)簽中l(wèi)abel標(biāo)簽的屬性 -->
19
<s:textfield name="name" label="%{getText('HelloWorld')}" />
20
</body>
21
</html>
22
23
WebRoot/LoginAction.jsp
1
<%
@ page language="java" import="java.util.*" pageEncoding="GBK"%>
2
<%
@ page contentType="text/html; charset=GBK" %>
3
<%
4
String path = request.getContextPath();
5
String basePath = request.getScheme() + "://"
6
+ request.getServerName() + ":" + request.getServerPort()
7
+ path + "/";
8
%>
9
<%
@taglib prefix="s" uri="/struts-tags"%>
10
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
11
<html>
12
<head>
13
<title>Login Action</title>
14
</head>
15
<!-- 用http://localhost:8080/i18n/LoginAction.action?uname=admin&upass=123顯示頁面 -->
16
<body>
17
<!--
18
1.包范圍內(nèi)的資源文件(以模塊方式管理資源文件)
19
2.輸出請求文件當(dāng)中tip,user的值.(在LoginAction中已經(jīng)被放入值)
20
-->
21
${requestScope.tip}
22
<br>
23
${sessionScope.user}
24
<br>
25
26
<!--
27
1.Action范圍的資源文件(只能由Action調(diào)用)
28
2.輸出標(biāo)準(zhǔn)的request的tip屬性
29
-->
30
<jsp:useBean id="d" class="java.util.Date" scope="page" />
31
<!-- s:text name="msg"直接從資源文件中取值({0},{1}兩個(gè)值)并顯示 -->
32
<s:text name="msg">
33
34
<%
35
//給msg的{0}攜帶值
36
%>
37
<s:param>
38
<s:property value="uname" />
39
</s:param>
40
41
<%
42
//給msg的{1}攜帶值
43
%>
44
<s:param>$pcdyadn</s:param>
45
</s:text>
46
47
<!-- 通過s:i18n訪問待定位置的資源文件,此時(shí)只訪問globalMessages -->
48
<s:i18n name="globalMessages">
49
<s:text name="HelloWorld" />
50
</s:i18n>
51
<br>
52
<!-- 通用性較強(qiáng)的全局資源文件 -->
53
<s:property value="%{getText('HelloWorld')}" />
54
<br>
55
<hr>
56
<!-- 包含 LangSelector.jsp頁面-->
57
<s:include value="LangSelector.jsp"/>
58
</body>
59
</html>
60
WebRoot/LangSelector.jsp
1
<%
@ page language="java" contentType="text/html; charset=GBK"%>
2
3
<%
@taglib prefix="s" uri="/struts-tags"%>
4
5
<!-- 提交表單的方法 -->
6
<script type="text/javascript">
7
function langSelecter_onChanged()
8

{
9
document.getElementById("langForm").submit();
10
}
11
</script>
12
13
14
<!--
15
1.s:set:將用戶的的session中的WW_TRANS_I18N_LOCALE設(shè)置成SESSION_LOCALE,(SESSION_LOCALE已經(jīng)存在)
16
2.s:bean:執(zhí)行com.locales.Locales類,將內(nèi)容為SESSION_LOCALE得到的值傳入類中的參數(shù)current,
17
傳值時(shí)如果值為空則選擇為locale(本地)否則選擇為SESSION_LOCALE
18
-->
19
<s:set name="SESSION_LOCALE" value="#session['WW_TRANS_I18N_LOCALE']" />
20
<s:bean id="locales" name="com.locales.Locales">
21
<s:param name="current"
22
value="#SESSION_LOCALE == null?locale:#SESSION_LOCALE" />
23
</s:bean>
24
25
<!--
26
1.action="<s:url/>":提交給當(dāng)前的地址
27
2.s:text:獲取資源文件(這里得到的是全局資源文件的里的Key)
28
3.list="#locales.locales":通過s:bean id="locales"調(diào)用Locales.java中的getLocales()方法
29
-->
30
<form action="<s:url/>" id="langForm"
31
style="background-color: #bbbbbb; padding-top: 4px; padding-bottom: 4px;">
32
<s:text name="languag" />
33
<s:select label="Language" list="#locales.locales" listKey="value"
34
listValue="key"
35
value="#SESSION_LOCALE == null ? locale : #SESSION_LOCALE"
36
name="request_locale" id="langSelecter"
37
onchange="langSelecter_onChanged()" theme="simple" />
38
</form>
39
src/com/package_en_US.properties
succtip=Login success
failtip=Login failed

src/com/package_zh_CN.properties
succtip=\u767B\u5F55\u6210\u529F
failtip=\u767B\u5F55\u5931\u8D25

src/com.i18n.Loc.java
1
package com.i18n;
2
3
import java.util.Locale;
4
5
/** *//**
6
* @author ∪∩BUG E-mail: tidelgl@163.com
7
* @version Aug 23, 2008 3:37:45 PM
8
* @獲取語言環(huán)境
9
*/
10
public class Loc
{
11
public static void main(String[] args)
{
12
Locale[] localelist = Locale.getAvailableLocales();
13
for (int i = 0; i < localelist.length; i++)
{
14
// 打印國家名+國家編寫名+語言名+語言縮寫名
15
System.out.println(localelist[i].getDisplayCountry() + " = "
16
+ localelist[i].getCountry() + " "
17
+ localelist[i].getDisplayLanguage() + " = "
18
+ localelist[i].getLanguage());
19
}
20
// 獲取系統(tǒng)的默認(rèn)的國家/語言環(huán)境
21
// Locale myLocale = Locale.getDefault();
22
// ResourceBundle bundle = ResourceBundle.getBundle("資源文件名", myLocale);
23
// System.out.println(bundle.getString("定義的Key鍵"));
24
}
25
26
}
27
src/com.locales.Locales.java
1
package com.locales;
2
3
import java.util.Hashtable;
4
import java.util.Locale;
5
import java.util.Map;
6
7
/** *//**
8
* @author ∪∩BUG E-mail: tidelgl@163.com
9
* @version Aug 23, 2008 11:27:29 PM
10
* @本地化
11
*/
12
public class Locales
{
13
private Locale current;
14
15
// 設(shè)置當(dāng)前用戶的語言種類
16
public void setCurrent(Locale current)
{
17
this.current = current;
18
}
19
20
public Map<String, Locale> getLocales()
{
21
Map<String, Locale> locales = new Hashtable<String, Locale>();
22
23
// 往集合中裝載語言種類
24
locales.put("USA English", Locale.US);
25
locales.put("Simplified Chinese", Locale.CHINA);
26
return locales;
27
28
}
29
}
30
src/com.Login.LoginAction.java
1
package com.Login;
2
3
import com.opensymphony.xwork2.ActionContext;
4
import com.opensymphony.xwork2.ActionSupport;
5
6
/** *//**
7
* @author ∪∩BUG E-mail: tidelgl@163.com
8
* @version Aug 23, 2008 8:39:58 PM
9
* @國際化
10
*/
11
public class LoginAction extends ActionSupport
{
12
private String uname;
13
private String upass;
14
15
public LoginAction(String uname, String upass)
{
16
super();
17
this.uname = uname;
18
this.upass = upass;
19
}
20
21
public LoginAction()
{
22
23
}
24
25
public String getUname()
{
26
return uname;
27
}
28
29
public void setUname(String uname)
{
30
this.uname = uname;
31
}
32
33
public String getUpass()
{
34
return upass;
35
}
36
37
public void setUpass(String upass)
{
38
this.upass = upass;
39
}
40
41
@Override
42
public String execute() throws Exception
{
43
44
ActionContext ctx = ActionContext.getContext();// 獲取struts2的整個(gè)上下文對象,這里是request
45
if ("admin".equals(this.uname) & "123".equals(this.getUpass()))
{
46
// ctx.getSession().put("user", this.getUname()); // 把當(dāng)前的用戶名放入session當(dāng)中.
47
// ctx.put("tip", this.getText("succtip")); // Action當(dāng)中獲取資源文件的方法,這里取的key名為succtip
48
49
//占位的資源文件的獲取
50
ctx.getSession().put("user", this.getUname()); // 把當(dāng)前的用戶名放入session當(dāng)中.
51
ctx.put("tip", this.getText("succtip",new String[]
{this.uname})); //在字符串?dāng)?shù)組中的第一個(gè)數(shù)組元素放入uname的值
52
} else
{
53
// ctx.put("tip", this.getText("failtip")); // Action當(dāng)中獲取資源文件的方法,這里取的key名為failtip
54
ctx.put("tip", this.getText("failtip",new String[]
{this.uname})); //在字符串?dāng)?shù)組中的第一個(gè)數(shù)組元素放入uname的值
55
}
56
57
return SUCCESS;
58
}
59
60
}
61
src/com.locales.LoginAction_en_US.properties

succtip=
{0}Login success

failtip=
{0}Login failed

msg=
{0}welcome,now is\:
{1}

src/com.locales.LoginAction_zh_CN.properties
1
succtip=
{0}\u767B\u5F55\u6210\u529F
2
failtip=
{0}\u767B\u5F55\u5931\u8D25
3
msg=
{0}\u6B22\u8FCE,\u73B0\u5728\u662F\:
{1}
4
src/globalMessages_en_US.properties
HelloWorld=Hello World\!
com.locales=Test Locale
src/globalMessages_zh_CN.properties
HelloWorld=\u4F60\u597D,\u4E16\u754C\!
com.locales=\u672C\u5730\u6D4B\u8BD5

src/struts.properties
struts.custom.i18n.resources=globalMessages