欧美性猛交XXXX免费看蜜桃,成人网18免费韩国,亚洲国产成人精品区综合,欧美日韩一区二区三区高清不卡,亚洲综合一区二区精品久久

打開(kāi)APP
userphoto
未登錄

開(kāi)通VIP,暢享免費電子書(shū)等14項超值服

開(kāi)通VIP
JSF實(shí)現的自選語(yǔ)言界面
〖 作者:qjyong 〗〖 大?。?k 〗〖 發(fā)布日期:2007-12-16 〗〖 瀏覽:0 〗
Source: http://www.java3z.com/cwbwebhome/article/article2/21023.html?id=1735
問(wèn)題描述:實(shí)現一個(gè)帶自選語(yǔ)言欄的用戶(hù)登錄驗證示例的國際化。對于這個(gè)實(shí)例分兩部分來(lái)實(shí)現:先實(shí)現用戶(hù)登錄驗證的國際化,再加上自選語(yǔ)言欄。
第一部分:實(shí)現用戶(hù)登錄驗證
創(chuàng )建一個(gè)名為I18N_demo的JSF Web項目。
1.         創(chuàng )建后臺Bean
在項目中創(chuàng )建一個(gè)后臺Bean:RegistrationBean.java
package org.qiujy.web.controller;
import java.text.MessageFormat;
import java.util.Locale;
import java.util.ResourceBundle;
public class RegistrationBean {
private String userName;
private String password;
//以下是屬性的getter和setter方法
......
public String validate() {
boolean flag = true;
if (!"test".equals(userName)) {
FacesMessage msg = MessageFactory.getMessage(FacesContext
.getCurrentInstance(), "field_ISERROR",
new Object[] { "userName" });
FacesContext.getCurrentInstance().addMessage(null, msg);
flag = false;
}
if (!"123456".equals(password)) {
FacesMessage msg = MessageFactory.getMessage(FacesContext
.getCurrentInstance(), "field_ISERROR",
new Object[] { "password" });
FacesContext.getCurrentInstance().addMessage(null, msg);
flag = false;
}
if (flag) {
return "success";
} else {
return "failure";
}
}
}
這個(gè)Bean中提供跟頁(yè)面綁定的屬性,以及跟動(dòng)作按鈕綁定的動(dòng)作處理方法validate(),在這個(gè)方法中需要注意的是,對用戶(hù)名、密碼都進(jìn)行了相應的判斷,如果是test、123456,就是合法用戶(hù),返回結果字符串“success”,否則是非法用戶(hù),通過(guò)JSF提供的MessageFactory來(lái)獲取并創(chuàng )建好一則本地化錯誤消息(消息“鍵”是“field_ISERROR”),添加到FacesContext中,然后返回結果字符串“failure”。這樣到了失敗頁(yè)面就可以取出相應的經(jīng)過(guò)本地化的錯誤消息。
2.         配置托管Bean和資源文件綁定
在faces-config.xml文件中把RegistrationBean配置成托管Bean。同時(shí)為了支持國際化,指定了錯誤消息文件和資源文件,它們是同一個(gè)文件,就是存放在應用的org/qiujy/web/resources目錄下的ApplicationMessages.properties文件,稍后再來(lái)看這個(gè)文件的內容:
<faces-config>
<application>
<message-bundle>
org.qiujy.web.resources.ApplicationMessages
</message-bundle>
<locale-config>
<default-locale>zh_CN</default-locale>
<supported-locale>en</supported-locale>
<supported-locale>zh_TW</supported-locale>
</locale-config>
<resource-bundle>
<base-name>
org.qiujy.web.resources.ApplicationMessages
</base-name>
<var>bundle</var>
</resource-bundle>
</application>
<managed-bean>
<managed-bean-name>registrationBean</managed-bean-name>
<managed-bean-class>
org.qiujy.web.controller.RegistrationBean
</managed-bean-class>
<managed-bean-scope>request</managed-bean-scope>
</managed-bean>
......
</faces-config>
3.         創(chuàng )建頁(yè)面和本地化資源文件
用戶(hù)登錄頁(yè)面:userlogin.jsp
<%@ page language="java" pageEncoding="UTF-8"%>
<%@ taglib uri="http://java.sun.com/jsf/html" prefix="h"%>
<%@ taglib uri="http://java.sun.com/jsf/core" prefix="f"%>
<f:view>
<html>
<head>
<title><h:outputText value="#{bundle.title_login}" /></title>
</head>
<body>
<h:form id="loginForm">
<h:panelGrid columns="2">
<h:graphicImage url="#{bundle.login_logo}"
width="220" height="160"/>
<h:panelGrid columns="3">
<f:facet name="caption">
<h:outputText value="#{bundle.title_login}" />
</f:facet>
<h:outputText value="#{bundle.login_userName}" />
<h:inputText id="textName"
value="#{registrationBean.userName}"
required="true">
</h:inputText>
<h:message for="textName" style="color:red" />
<h:outputText value="#{bundle.login_password}" />
<h:inputSecret id="textPwd"
value="#{registrationBean.password}"
required="true">
<f:validateLength minimum="6" maximum="20"/>
</h:inputSecret>
<h:message for="textPwd" style="color:red" />
<f:facet name="footer">
<h:panelGroup>
<h:commandButton value="#{bundle.button_submit}"
action="#{registrationBean.validate}" />
<h:outputText value=" "></h:outputText>
<h:commandButton value="#{bundle.button_reset}"
type="reset" />
</h:panelGroup>
</f:facet>
</h:panelGrid>
</h:panelGrid>
</h:form>
</body>
</html>
</f:view>
在這個(gè)頁(yè)面中,所有靜態(tài)文本,錯誤消息都通過(guò)值表達式用資源文件的別名“bundle”來(lái)獲取的。所有的資源消息“鍵”在本地化資源文件中都配置了相應的“值”,如下:
代碼片段7.15 缺省的資源文件ApplicationMessages.properties
button_submit=Submit
button_reset=Reset
button_back=Back
title_login=User Login Page
login_userName=UserName:
login_password=Password:
login_logo=/images/jsf_i18n_en.gif
success_welcome=Welcome:
failure_error=Failure!
field_ISERROR= {0} is error.
英文的資源文件ApplicationMessages_en.properties的內容跟這個(gè)相同。下面再來(lái)看簡(jiǎn)體中文的資源文件:
簡(jiǎn)體中文的資源文件ApplicationMessages_zh_CN.properties
button_submit=提交
button_reset=重置
button_back=后退
title_login=用戶(hù)登錄頁(yè)面
login_userName=用戶(hù)名:
login_password=密碼::
login_logo=/images/jsf_i18n_zh_CN.gif
success_welcome=歡迎:
failure_error=失敗!
field_ISERROR= {0} 不正確
需要注意是,使用是別忘了進(jìn)行Uncodei編碼轉換。至于繁體中文的資源文件也跟這個(gè)文件差不多,在此不再贅述。
另外要對標準的錯誤消息進(jìn)行國際化,可以把SUN的RI實(shí)現中的錯誤消息全部復制到本地化資源文件中,對簡(jiǎn)體中文的資源進(jìn)行漢化,由于內容較多,在這就不帖出代碼了,具體可能看本例的源代碼。
接下來(lái)看登錄成功后的頁(yè)面的代碼:success.jsp
<%@ page language="java" pageEncoding="UTF-8"%>
<%@ taglib uri="http://java.sun.com/jsf/html" prefix="h"%>
<%@ taglib uri="http://java.sun.com/jsf/core" prefix="f"%>
<f:view>
<html>
<head>
<title><h:outputText value="#{bundle.success_welcome}"/></title>
</head>
<body>
<h2>
<h:outputText value="#{bundle.success_welcome}" />
<h:outputText value="#{registrationBean.userName}" />
</h2>
<jsp:useBean id="currentDate" class="java.util.Date" scope="request"/>
<h:outputText value="#{currentDate}">
<f:convertDateTime type="both"/>
</h:outputText>
</body>
</html>
</f:view>
在這個(gè)頁(yè)面中,為了演示日期時(shí)間的國際化,先創(chuàng )建了一個(gè)日期對象,然后用Output組件標簽輸出,并給這個(gè)標簽注冊了DateTimeConverter,這樣就能實(shí)現日期時(shí)間的國際化了。
最后再來(lái)看登錄失敗頁(yè)面的代碼:failure.jsp
<%@ page language="java" pageEncoding="UTF-8"%>
<%@ taglib uri="http://java.sun.com/jsf/html" prefix="h" %>
<%@ taglib uri="http://java.sun.com/jsf/core" prefix="f" %>
<f:view>
<html>
<head>
<title><h:outputText value="#{bundle.failure_error}"/></title>
</head>
<body>
<h2><h:outputText value="#{bundle.failure_error}"/></h2>
<h:messages style="color:red"/><br/>
<h:outputLink value="userlogin.faces">
<h:outputText value="#{bundle.button_back}"/>
</h:outputLink>
</body>
</html>
</f:view>
在這個(gè)頁(yè)面,用<h:message>標簽輸出了登錄失敗的原因,這個(gè)錯誤消息是在后臺Bean中的validate()方法中從資源文件中引用的經(jīng)過(guò)本地化后的消息。
4.         配置導航規則
導航規則比較簡(jiǎn)單,直接看代碼:
<navigation-rule>
<from-view-id>/userlogin.jsp</from-view-id>
<navigation-case>
<from-outcome>success</from-outcome>
<to-view-id>/success.jsp</to-view-id>
</navigation-case>
<navigation-case>
<from-outcome>failure</from-outcome>
<to-view-id>/failure.jsp</to-view-id>
</navigation-case>
</navigation-rule>
第二部分: 實(shí)現自選語(yǔ)言欄
實(shí)現頁(yè)面的語(yǔ)言可以讓用戶(hù)根據自己的喜好進(jìn)行選擇,也是在做web應用時(shí)比較常見(jiàn)的一個(gè)功能。下面就來(lái)完成這個(gè)任務(wù)。
1.         創(chuàng )建后臺Bean
在這個(gè)應用中添加一個(gè)處理用戶(hù)自選語(yǔ)言的后臺Bean,LanguageSelectorBean,代碼如下:
package org.qiujy.common;
import java.util.HashMap;
import java.util.Locale;
import java.util.Map;
import javax.faces.context.FacesContext;
import javax.faces.event.ValueChangeEvent;
public class LanguageSelectorBean {
private String currentLocale;
// 本應用支持的語(yǔ)言Map
private Map<String, Locale> supportLocals;
public LanguageSelectorBean() {
supportLocals = new HashMap<String, Locale>();
supportLocals.put("zh_CN", Locale.CHINA);
supportLocals.put("zh_TW", Locale.TAIWAN);
supportLocals.put("en", Locale.ENGLISH);
this.currentLocale = FacesContext.getCurrentInstance().getViewRoot()
.getLocale().toString();
}
public String getCurrentLocale() {
return currentLocale;
}
public void setCurrentLocale(String currentLocale) {
this.currentLocale = currentLocale;
}
// 改變當前語(yǔ)言區域的事件處理方法
public void changeLocale(ValueChangeEvent event) {
String currentLocale = (String) event.getNewValue();
// 設置當前的語(yǔ)言區域
Locale myLocale = this.supportLocals.get(currentLocale);
FacesContext.getCurrentInstance().getViewRoot().setLocale(myLocale);
// 把自定義語(yǔ)言存放到Session中
HttpServletRequest request = (HttpServletRequest) FacesContext
.getCurrentInstance().getExternalContext().getRequest();
request.getSession().setAttribute("myLocale", myLocale);
}
}
在這個(gè)后臺Bean中有一個(gè)值改變事件處理方法changeLocale(),它根據用戶(hù)選中的語(yǔ)言代碼來(lái)更改當前FacesContext中的視圖的默認語(yǔ)言區域。同時(shí),為了讓當前用戶(hù)的整個(gè)會(huì )話(huà)過(guò)程的語(yǔ)言區域都是用戶(hù)的自行選擇的,需要把用戶(hù)選擇的語(yǔ)言區域對象存放到Session中。
2.         創(chuàng )建階段事件監聽(tīng)器來(lái)設置自選語(yǔ)言環(huán)境
用戶(hù)設置好語(yǔ)言環(huán)境后,要想在當前會(huì )話(huà)的后續請求中繼續生效,就要在所有JSF請求處理生命周期的“呈現響應階段”發(fā)生前更改當前FacesContext中的視圖的默認語(yǔ)言區域,這個(gè)任務(wù)交由階段事件監聽(tīng)器來(lái)實(shí)現。所在,在本應用中還要添加一個(gè)階段事件監聽(tīng)器的實(shí)現類(lèi)。如:
package org.qiujy.common;
import java.util.Locale;
import javax.faces.context.FacesContext;
import javax.faces.event.PhaseEvent;
import javax.faces.event.PhaseId;
import javax.faces.event.PhaseListener;
import javax.servlet.http.HttpServletRequest;
/**
* 階段事件監聽(tīng)器實(shí)現類(lèi):主要是用來(lái)設置自選語(yǔ)言環(huán)境
*/
@SuppressWarnings("serial")
public class MyPhaseListener implements PhaseListener {
/**
* 結束某個(gè)階段時(shí)會(huì )調用到的方法
*/
public void afterPhase(PhaseEvent pe) {
}
/**
* 開(kāi)始某個(gè)階段時(shí)會(huì )調用到的方法
*/
public void beforePhase(PhaseEvent pe) {
System.out.println("this is Phase: " + pe.getPhaseId().toString());
// 呈現響應階段,設置自選語(yǔ)言環(huán)境
HttpServletRequest request = (HttpServletRequest) FacesContext
.getCurrentInstance().getExternalContext().getRequest();
Locale myLocale = (Locale) request.getSession().getAttribute("myLocale");
System.out.println("current request locale is: "
+ FacesContext.getCurrentInstance().getViewRoot().getLocale()
.toString());
if (myLocale != null) {
FacesContext.getCurrentInstance().getViewRoot().setLocale(myLocale);
System.out.println("current Custom locale is: "
+ FacesContext.getCurrentInstance().getViewRoot()
.getLocale().toString());
}
}
/**
* 只監聽(tīng)"呈現響應階段"
*/
public PhaseId getPhaseId() {
return PhaseId.RENDER_RESPONSE;
}
}
這個(gè)類(lèi)實(shí)現了PhaseListener接口,通過(guò)在getPhashId()方法中返回PhaseId.RENDER_RESPONSE來(lái)監聽(tīng)“呈現響應階段”事件,在開(kāi)始“呈現響應階段”事件時(shí),會(huì )調用本類(lèi)的beforePhase()方法,在這個(gè)方法中,通過(guò)從Session對象中取出用戶(hù)設置好的語(yǔ)言環(huán)境,來(lái)更改當前FacesContext中的視圖的默認語(yǔ)言區域。這樣,當前會(huì )話(huà)的后續響應都會(huì )用用戶(hù)選擇的語(yǔ)言環(huán)境來(lái)呈現視圖了。注意,要把此監聽(tīng)器類(lèi)配置在faces-config.xml中,它的作用才生效,如:
<lifecycle>
<phase-listener>
org.qiujy.common.MyPhaseListener
</phase-listener>
</lifecycle>
3.         配置托管Bean和資源文件綁定
像其它托管Bean一樣,把它配置在faces-config.xml文件中,但要注意一點(diǎn)的是,這個(gè)托管Bean的存放范圍應該選擇session,這樣才能保證對語(yǔ)言區域的選擇在當前用戶(hù)的整個(gè)會(huì )話(huà)過(guò)程中都有效。
<managed-bean>
<managed-bean-name>languageSelectorBean</managed-bean-name>
<managed-bean-class>
org.qiujy.common.LanguageSelectorBean
</managed-bean-class>
<managed-bean-scope>session</managed-bean-scope>
</managed-bean>
4.         創(chuàng )建頁(yè)面和本地化資源文件
接下來(lái)創(chuàng )建一個(gè)語(yǔ)言選擇欄頁(yè)面:
<%@ page language="java" pageEncoding="UTF-8"%>
<%@ taglib uri="http://java.sun.com/jsf/html" prefix="h"%>
<%@ taglib uri="http://java.sun.com/jsf/core" prefix="f"%>
<f:subview id="languageView">
<h:form id="languageForm"
style="background-color:#bbbbbb; padding-top:4px; padding-bottom:4px;">
<h:outputText value="#{bundle.selectYourLocale}"></h:outputText>
<h:selectOneMenu value="#{languageSelectorBean.currentLocale}"
immediate="true" onchange="submit();"
valueChangeListener="#{languageSelectorBean.changeLocale}">
<f:selectItem itemValue="zh_CN" itemLabel="#{bundle.zh_CNText}" />
<f:selectItem itemValue="zh_TW" itemLabel="#{bundle.zh_TWText}" />
<f:selectItem itemValue="en" itemLabel="#{bundle.enText}" />
</h:selectOneMenu>
</h:form>
</f:subview>
這個(gè)頁(yè)面的特殊之處有三處:
q 它的根視圖標簽是<f:subview>,而不是常用的<f:view>了,這是因為這個(gè)頁(yè)面經(jīng)常是用來(lái)內嵌到其它頁(yè)面的,而JSF規范又要求一個(gè)頁(yè)面只能有一個(gè)<f:view>頂層視圖,所以就只能用<f:subview>來(lái)創(chuàng )建一個(gè)子視圖。
q 給selectOneMenu組件添加了一個(gè)值改變事件監聽(tīng)器,同時(shí)添加了一個(gè)JavaScript的onchange事件來(lái)提交表單,這樣在改變下拉菜單的選中項時(shí),會(huì )提交表單,同時(shí)會(huì )觸發(fā)值改變事件。這樣就能實(shí)現改變語(yǔ)言區域的功能了。
q 把selectOneMenu組件的immediate屬性值設置為true,這樣可以使這個(gè)組件提交表單時(shí),請求處理生命周期的應用請求階段就會(huì )調用值改變事件的處理方法,從而把應用驗證“短路”掉,這樣即使頁(yè)面的一些必填字段(本例中的用戶(hù)名,密碼)沒(méi)有輸入值,也不會(huì )報錯了。
最后,還要在所有的本地化資源文件中分別加上這個(gè)頁(yè)面中出現的消息“鍵-值”對,例如在缺省的資源文件中添加如下代碼:
zh_CNText=Chinese,Simplify
zh_TWText=Chinese,Traditional
enText=English
selectYourLocale=Select Language:
5.         在頁(yè)面上包含自選語(yǔ)言欄頁(yè)面
在用戶(hù)登錄頁(yè)面中用JSP的include動(dòng)作把自選語(yǔ)言欄頁(yè)面包含進(jìn)來(lái),在userlogin.jsp頁(yè)面body體的首行添加如下代碼:
<jsp:include page="languageSelector.jsp"/>
6.         運行查看效果
到此整個(gè)應用開(kāi)發(fā)完畢,項目目錄結構如圖:
自選語(yǔ)言項目目錄結構圖
重新部署應用,運行,訪(fǎng)問(wèn)主頁(yè):
中文主頁(yè)圖
通過(guò)在下拉列表選中“英文”來(lái)更新想要的英文界面:
英文主頁(yè)圖
本站僅提供存儲服務(wù),所有內容均由用戶(hù)發(fā)布,如發(fā)現有害或侵權內容,請點(diǎn)擊舉報。
打開(kāi)APP,閱讀全文并永久保存 查看更多類(lèi)似文章
猜你喜歡
類(lèi)似文章
JSF問(wèn)題集錦
六、 國際化訊息
JSF的中文化與國際化的簡(jiǎn)便方法
JR - 精品文章 - JSF開(kāi)發(fā)實(shí)戰(二)
用JSF和MyFaces上傳文件
借助 Ajax 自動(dòng)保存 JSF 表單: 第 2 部分
更多類(lèi)似文章 >>
生活服務(wù)
分享 收藏 導長(cháng)圖 關(guān)注 下載文章
綁定賬號成功
后續可登錄賬號暢享VIP特權!
如果VIP功能使用有故障,
可點(diǎn)擊這里聯(lián)系客服!

聯(lián)系客服

欧美性猛交XXXX免费看蜜桃,成人网18免费韩国,亚洲国产成人精品区综合,欧美日韩一区二区三区高清不卡,亚洲综合一区二区精品久久