JSF的<f:view>标签中可以通过locale属性来指定语言和区域信息来实现国际化,如:<f:view locale="#{indexBean.locale}">。
在实践中发现这个属性不起作用,后台IndexBean的locale已经改变,但是前台界面显示的语言没有跟这变化。
简单的跟踪一下代码发现大致的原因如下:
以index.jsp为例来说明:
1、第一次打开index.jsp页面,系统创建一个UIViewRoot对象,根据#{indexBean.locale}(默认为zh_CN)设置UIViewRoot对象locale值,这种情况下页面显示是正确。
2、在页面通过按钮或者选择列表改变#{indexBean.locale}的值为"en_US",按照设想页面显示的语言应该为英文,但实际情况还是中文。
跟踪代码发现问题在UIComponentClassicTagBase.java的findComponent()方法中
//获取UIViewRoot对象
parentComponent = context.getViewRoot();
if (null == parentComponent.getAttributes().get("javax.faces.webapp.CURRENT_VIEW_ROOT"))
{
try
{
//这个方法里面会用#{indexBean.locale}的值来设置UIViewRoot对象locale值
//第一次打开index.jsp时,UIViewRoot对象是新建的所以parentComponent.getAttributes().get("javax.faces.webapp.CURRENT_VIEW_ROOT")==null
//执行此方法。当通过通过触发页面上的按钮或者下拉列表重新绘制index.jsp时,由于JSF会保存的组件的状态而且可以恢复,此时的 UIViewRoot对象还是上次
//创建的对象,所以 parentComponent.getAttributes().get("javax.faces.webapp.CURRENT_VIEW_ROOT")==null 这个条件不满足,因此也不会执行此方法。
setProperties(parentComponent);
}
catch (FacesException e) {
if (e.getCause() instanceof JspException) {
throw ((JspException)e.getCause());
}
throw e;
}
if (null != this.id) {
parentComponent.setId(this.id);
}
else {
assert (null != getFacesJspId());
parentComponent.setId(getFacesJspId());
}
parentComponent.getAttributes().put("javax.faces.webapp.CURRENT_VIEW_ROOT", "javax.faces.webapp.CURRENT_VIEW_ROOT");
this.created = true;
}
else if (hasBinding()) {
try {
setProperties(parentComponent);
}
catch (FacesException e) {
if (e.getCause() instanceof JspException) {
throw ((JspException)e.getCause());
}
throw e;
}
}
3、这个问题在MyFaces中没有发现,不知道是参考实现中的BUG还是使用方法的错误。
4、一个替代的解决方法是加入一个PhaseListener,然后在PhaseId.RENDER_RESPONSE之前直接调用UIViewRoot对象的setLocale方法来改变语言和区域信息。
FacesContext.getCurrentInstance().getViewRoot().setLocale(new Locale("zh","CN"));
分享到:
相关推荐
这个压缩包中的"mojarra-1.2_12-b01-FCS"是JSF 1.2的实现之一,由Mojarra项目提供,它是Oracle公司维护的开源JSF参考实现。 **JSF 1.2核心概念** 1. **组件模型**: JSF的核心是组件模型,它允许开发者通过拖放组件...
- **国际化与本地化**:JSF 1.2支持多语言环境,允许开发人员轻松地为不同地区提供支持。 3. **下载JSF 1.2** 要下载JSF 1.2,你可以访问Oracle的官方站点或Apache MyFaces项目,这两个都是JSF实现的提供商。选择...
9. **国际化和本地化**:JSF 1.2支持多语言环境,可以通过资源包(resource bundle)提供不同语言的文本和标签。 10. **性能优化**:虽然JSF 1.2相对后来的版本可能在性能方面稍显不足,但仍然可以通过合理的缓存...
6. **国际化与本地化**:JSF 1.2提供了更好的I18N和L10N支持,使得开发者可以轻松地为应用程序添加多语言功能。 ### JSF 1.2 实战应用 在实际项目中,JSF 1.2通常与EJB、JPA、Spring等其他Java EE技术结合使用,...
8. **国际化和本地化支持**: - JSF 1.2加强了对多语言环境的支持,开发者可以轻松地为应用程序添加不同语言的资源文件,以满足全球用户的需求。 9. **事件和监听器机制**: - 事件和监听器机制的增强使得开发者...
国际化与本地化 JSF 1.2支持资源包,允许开发者为不同地区和语言提供本地化的消息和标签。通过`<f:loadBundle>`标签,可以加载相应的资源文件。 ### 10. 整合其他技术 JSF 1.2能够很好地与其他Java EE技术(如...
6. **国际化和本地化支持**:JSF 1.2加强了对多语言环境的支持,开发者可以轻松地为应用添加不同语言的资源文件。 7. **Ajax支持**:虽然不如后续版本的AJAX功能强大,但JSF 1.2已经开始引入了部分异步更新功能,...
在这个"JSF1.2.07版源代码"中,我们可以深入理解JSF的核心机制和实现细节。 1. **JSF架构概述** JSF由多个组件构成,包括视图层、模型层、控制层和服务层。源代码中包含的组件如Facelets、UIComponent、Managed ...
这一功能增强了应用程序的用户友好性和可维护性,同时也促进了国际化和本地化的工作。 #### 提供状态保存特性 状态管理是Web应用中一个至关重要的方面。JSF 1.2引入了更灵活的状态保存机制,包括服务器端和客户端...
在JSF(JavaServer Faces)1.2版本中,实现国际化是一项重要的功能,它使得应用程序能够根据用户所在的地区提供相应的语言环境。以下是对这个主题的详细讲解。 首先,我们需要了解JSF的基本概念。JSF是一种用于构建...
- **国际化与本地化**:JSF内置了支持多语言的机制,通过资源包来管理不同语言的文本。 - **Faces Servlet**:JSF的核心Servlet,负责处理请求,管理组件树和执行生命周期。 通过深入分析JSF 1.2的源码,开发者...
总结来说,"试图化组件jsf1.2开发包"中的`myfaces-core-1.1.7`库为开发者提供了一套完整的JSF 1.2实现,涵盖了JSF的核心功能,包括组件模型、生命周期管理、事件处理和Ajax支持等。开发者可以通过这个库构建基于Java...
6. **国际化和本地化**:JSF 1.2提供了强大的I18N(国际化)和L10N(本地化)支持,允许开发者轻松地创建多语言应用。 7. **自定义标签和组件**:开发者可以创建自定义的UI组件和标签,扩展JSF的功能。这可以通过...
6. **国际化与本地化**:考虑到不同地区和语言的需求,JSF提供了全面的支持来帮助开发者创建多语言应用程序。这包括消息资源文件的使用、日期格式化等功能。 7. **视图状态管理**:为了保持页面状态并在用户之间...
使用jsf1.2+spring3.0+hibernate3.3实现集成,利用annotation实现自动对象管理注入,用户表的登录增删改查操作,包括验证码ajax集成,消息机制,国际化处理,自定义转换器,自定义验证器等 qq:38732796 欢迎讨论
7. **国际化和本地化**:JSF支持多语言环境,通过资源包管理不同区域的文本和格式。 8. **FacesContext**:这是JSF的核心上下文对象,包含了当前请求的所有相关信息,开发者可以通过它来访问组件树、请求参数、响应...
4. **增强的国际化和本地化**:JSF 1.2改进了对多语言环境的支持。 5. **可扩展性**:允许开发人员通过自定义行为、渲染器和组件来扩展框架。 **在压缩包中可能包含的内容**: - `jsf-api.jar` 和 `jsf-impl.jar`...
2. **国际化与本地化**:增强了对多语言支持,方便开发者创建全球化应用。 3. **自定义标签库**:引入了自定义组件的概念,允许开发者创建自己的UI组件库。 4. **Facelets**:作为一种视图表示技术替代了JSP,使得...