passText=密码
commandText=送出
然后使用 JDK 的工具程序 native2ascii 来转换,例如:
native2ascii -encoding Big5 messages_zh_cn.txt messages_zh_cn.properties
转换后的内容会如下:messages_zh_cn.properties
titleText=JSF\u793a\u7bc4
hintText=\u8acb\u8f38\u5165\u540d\u7a31\u8207\u5bc6\u78bc
nameText=\u540d\u7a31
passText=\u5bc6\u78bc
commandText=\u9001\u51fa
接下来您可以使用<f:loadBundle>卷标来指定加载讯息资源,一个例子如下:index.jsp
<%@ taglib uri="http://java.sun.com/jsf/core" prefix="f"%>
<%@ taglib uri="http://java.sun.com/jsf/html" prefix="h"%>
<%@page contentType="text/html;charset=UTF8"%>
<f:view>
<f:loadBundle basename="messages" var="msgs" />
<html>
<head>
<title><h:outputText value="#{msgs.titleText}" /></title>
</head>
<body>
<h:form>
<h3><h:outputText value="#{msgs.hintText}" /></h3>
<h:outputText value="#{msgs.nameText}" />:<h:inputText value="#{user.name}" /><p>
<h:outputText value="#{msgs.passText}" />:<h:inputSecret value="#{user.password}" /><p>
<h:commandButton value="#{msgs.commandText}" actionListener="#{user.verify}" action="#{user.outcome}" />
</h:form>
</body>
</html>
</f:view>
如此一来,如果您的浏览器预设接受 zh_cn 语系的话,则页面上就可以显示中文,否则预设将以英文显示,也就是 messages.properties 的内容,为了能显示多国语系,
我们设定网页编码为 UTF8。<f:view>可以设定 locale 属性,直接指定所要使用的语系,例如:
<f:view locale="zh_cn">
<f:loadBundle basename="messages" var="msgs" />
直接指定以上的话,则会使用繁体中文来显示,JSF 会根据<f:loadBundle>的 basename 属性加上<f:view>的 locale 属性来决定要使用哪一个讯息资源文件,就上例而言,
就是使用 messages_zh_cn.properties,如果设定为以下的话,就会使用 messages_en.properties:
<f:view locale="en">
<f:loadBundle basename="messages" var="msgs" />
您也可以在 faces-config.xml 中设定语系,例如:
<faces-config>
<application>
<local-config>
<default-locale>en</default-locale>
<supported-locale>zh_cn</supported-locale>
</local-config>
</application>
.....
</faces-config>
在<local-config>一定有一个<default-locale>,而<supported-locale>可以有好几个,这告诉 JSF 您的应用程序支持哪些语系。当然,如果您可以提供一个选项让使用者选择
自己的语系会是更好的方式,例如根据 user 这个 Bean 的 locale 属性来决定页面语系:
<f:view locale="#{user.locale}">
<f:loadBundle basename="messages" var="msgs" />
在页面中设定一个窗体,可以让使用者选择语系,例如设定单选钮:
<h:selectOneRadio value="#{user.locale}">
<f:selectItem itemValue="zh_cn" itemLabel="#{msgs.zh_cnText}" />
<f:selectItem itemValue="en" itemLabel="#{msgs.enText}" />
</h:selectOneRadio>
1.2 Managed Beans
JSF 使用 Bean 来达到逻辑层与表现层分离的目的,Bean 的管理集中在组态档案中,您只要修改组态档案,就可以修改 Bean 之间的相依关系。
1.2.1 Backing Beans
JSF 使用 JavaBean 來達到程式邏輯與視圖分離的目的,在 JSF 中的 Bean 其角色是屬於 Backing Bean,又稱之為 Glue Bean,其作用是在真正的業務邏輯 Bean 及 UI 元件
之間搭起橋樑,在 Backing Bean 中會呼叫業務邏輯 Bean 處理使用者的請求,或者是將業務處理結果放置其中,等待 UI 元件取出當中的值並顯示結果給使用者。JSF 將 Bean
的管理集中在 faces-config.xml 中,一個例子如下:
...
<managed-bean>
<managed-bean-name>user</managed-bean-name>
<managed-bean-class>onlyfun.caterpillar.UserBean</managed-bean-class>
<managed-bean-scope>session</managed-bean-scope>
</managed-bean>
...
這個例子我們在 第一個 JSF 程式 看過,<managed-bean-class>設定所要使用的 Bean 類別,<managed-bean-name>設定之名稱,可供我們在 JSF 頁面上使用 Expression
Language 來取得或設定 Bean 的屬性,例如:
<h:inputText value="#{user.name}"/>
<managed-bean-scope>設定 Bean 的存活範圍,您可以設定為 request、session 與 application,設定為 request 時,Bean 的存活時間為請求階最,設定為 session 則在使用
者應用程式交互開始,直到關閉瀏覽器或 顯式的結束會話為止(例如登出程式),設定為 application 的話,則 Bean 會一直存活,直到應用程式關閉為止。您還可以將存活
範圍設定為 none,當設定為 none 時會在需要的時候生成一個新的 Bean,例如您在一個 method 中想要生成一個臨時的 Bean,就可以將之設定為 none。在 JSF 頁面上要取得
Bean 的屬性,是使用 JSF 表示語言 (Expression Language) ,要注意到的是,JSF 表示語言是寫成 #{expression},而 JSP 表示語言 是寫成 ${expression},因為表示層可能是
使用 JSP,所以必須特別區分,另外要注意的是,JSF 的標籤上之屬性設定時,只接受 JSF 表示語言。
1.2.2 Beans 的组态与设定
JSF 预设会读取 faces-config.xml 中关于 Bean 的定义,如果想要自行设置定义档的名称,我们是在 web.xml 中提供 javax.faces.CONFIG_FILES 参数,例如:
<web-app>
<context-param>
<param-name>javax.faces.CONFIG_FILES</param-name>
<param-value>/WEB-INF/beans.xml</param-value>
</context-param>
...
</web-app>
定义档可以有多个,中间以 "," 区隔,例如:
/WEB-INF/navigation.xml,/WEB-INF/beans.xml
一个 Bean 最基本要定义 Bean 的名称、类别与存活范围,例如:
....
<managed-bean>
<managed-bean-name>user</managed-bean-name>
<managed-bean-class>onlyfun.caterpillar.UserBean</managed-bean-class>
<managed-bean-scope>session</managed-bean-scope>
</managed-bean>