我正在尝试更改一页中的 JSF 应用程序区域设置,并且这必须更改我的所有页面区域设置。我已关注此链接,效果很好JSF 中的本地化,如何记住每个会话而不是每个请求/视图选择的区域设置 https://stackoverflow.com/questions/4830588/jsf-locale-is-set-per-request-view-not-for-session
如果我运行该应用程序,我可以更改我的区域设置索引.xhtml并且该区域设置是按会话设置的,因此如果我转到页面index_1.xhtml我会看到区域设置发生变化。
我的问题是,当我运行应用程序并编写 URL 时:http://localhost:8080/Myapp-war/faces/index_.xhtml http://localhost:8080/Myapp-war/faces/index_.xhtml去index_1.xhtml页面,我更改了区域设置,区域设置在index.xhtml中没有更改。
这是我的代码:
托管Bean
package controllers;
import java.io.Serializable;
import java.util.Locale;
import javax.annotation.PostConstruct;
import javax.faces.bean.ManagedBean;
import javax.faces.bean.SessionScoped;
import javax.faces.context.FacesContext;
@ManagedBean
@SessionScoped
public class LanguageSwitcher implements Serializable{
private Locale locale;
@PostConstruct
public void init()
{
locale = FacesContext.getCurrentInstance().getViewRoot().getLocale();
}
public Locale getLocale() {
return locale;
}
public String getLanguage() {
return locale.getLanguage();
}
//Change locale
public void changeLanguage(String language) {
locale = new Locale(language);
FacesContext.getCurrentInstance().getViewRoot().setLocale(locale);
}
}
文件index.xhtml:
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN"
"http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<html lang="#{languageSwitcher.language}"
xmlns="http://www.w3.org/1999/xhtml"
xmlns:h="http://java.sun.com/jsf/html"
xmlns:f="http://java.sun.com/jsf/core"
xmlns:ui="http://java.sun.com/jsf/facelets"
xmlns:p="http://primefaces.org/ui">
<h:head>
</h:head>
<h:body>
<h3>Language switcher:</h3>
<h:form id="language_form">
<h:commandLink action="#{languageSwitcher.changeLanguage('es')}" value="Español" rendered="#{languageSwitcher.language != 'es'}"/> |
<h:commandLink action="#{languageSwitcher.changeLanguage('en')}" value="English" rendered="#{languageSwitcher.language != 'en'}"/>
</h:form>
<h:outputText value="#{msg['greeting']}" />
</h:body>
</html>
文件index_1.xhtml:
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN"
"http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<html lang="#{languageSwitcher.language}"
xmlns="http://www.w3.org/1999/xhtml"
xmlns:h="http://java.sun.com/jsf/html"
xmlns:f="http://java.sun.com/jsf/core"
xmlns:ui="http://java.sun.com/jsf/facelets"
xmlns:p="http://primefaces.org/ui">
<f:view locale="#{languageSwitcher.locale}">
<h:head>
</h:head>
<h:body>
<h3>Language switcher:</h3>
<h:form id="language_form">
<h:commandLink action="#{languageSwitcher.changeLanguage('es')}" value="Español" rendered="#{languageSwitcher.language != 'es'}"/> |
<h:commandLink action="#{languageSwitcher.changeLanguage('en')}" value="English" rendered="#{languageSwitcher.language != 'en'}"/>
</h:form>
<h:outputText value="#{msg['greeting']}" />
</h:body>
</f:view>
</html>
如果我写<f:view locale="#{languageSwitcher.locale}">
在我的 index.xhtml 中,当我运行该应用程序时,出现错误。
我该如何解决呢?
UPDATE:
运行应用程序时出现的错误是:
java.lang.NullPointerException
在controllers.LanguageSwitcher.init(LanguageSwitcher.java:56)