关于JSF国际化问题
由于最近一个项目的MVC层框架用的是JSF,所以在摸索中遇到了不少的问题,其中有一项就是关于国际化的的问题。
小弟在网上找了很多的资料,其实无外乎内容就都那样,可不知是小弟人品太差还是由于确实技术上有问题,按照网上的配置老是会出现如下情况。
页面上有一个选择语言栏的下拉框,当小弟选择不同语言的时候,由于调用(action或者actionlistener)的方法没有返回值,页面会出现在当前页面刷新的状况,可是页面刷新之后,上面的输出依旧没有改变,是中文的还是中文,但是在浏览器重新打开一个窗口访问当前URL的时候,就会发现语言已经切换了,不知道大家明白我说的没有。简单说就是点击更换语言后页面有刷新动作,但实际在页面上看不出变化,一旦重新打开一个窗口(new window 不是 new session),就可以看到变化后的结果。
后来小弟发现,其实只要在点击语言选择栏后,为调用的方法增加返回值(也就是返回一个String),在配置文件中跳转回当前页面并加上<redirect/>标签,也就是说在你每次选择完语言后,页面会重定向到当前页面,一切就显示正常了。
但这里出现了一个问题,如果有十个甚至一百个页面,那岂不是要写上成百上千个导航配置,那样是很麻烦的。
因此,我想起了servert中的HttpServletResponse的重定向方法,那么我只需要在更改语言的方法中,每次更改完语言地区后利用HttpServletResponse重定向会当前的请求发起页面不就解决了吗,因此我写了如下代码。
首先,为了可扩展性,我定义了一个abstract的父类BaseBo,这个类主要就是用于在JSF框架中取得HttpServert的一些内置对象,以及sping的一个获取bean的方法。
import javax.faces.application.Application;
import javax.faces.context.ExternalContext;
import javax.faces.context.FacesContext;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import javax.servlet.http.HttpSession; import org.springframework.context.ApplicationContext;
import org.springframework.web.context.support.WebApplicationContextUtils; public abstract class BaseBO { // Get FacesContext
protected FacesContext getFacesContext() {
return FacesContext.getCurrentInstance();
} // Get Application
protected Application getApplication() {
return getFacesContext().getApplication();
} // Get HttpServletRequest
protected HttpServletRequest getRequest() {
return (HttpServletRequest) getFacesContext().getExternalContext()
.getRequest();
} // Get HttpServletResponse
protected HttpServletResponse getResponse() {
return (HttpServletResponse) getFacesContext().getExternalContext()
.getResponse();
} // Get HttpSession
protected HttpSession getSession() {
ExternalContext extContext = FacesContext.getCurrentInstance()
.getExternalContext();
HttpSession session = (HttpSession) extContext.getSession(false);
return session;
}
// Get Bean
protected Object getBeanObject(String beanName) {
ApplicationContext ctx = WebApplicationContextUtils
.getWebApplicationContext(getSession().getServletContext());
return ctx.getBean(beanName);
}
}
然后我有一个专门用于控制loacle的类和方法,并继承了BaseBo,如下代码(PS, locale属性已经通过spring容器默认注入了"cn")
import java.io.IOException; import javax.faces.event.ValueChangeEvent;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse; public class LocaleBo extends BaseBO { private String locale; public String getLocale() {
return locale;
} public void setLocale(String locale) {
this.locale = locale;
} // Change locale setting.
public void changeLocale(ValueChangeEvent e) throws IOException {
HttpServletRequest request = this.getRequest();
HttpServletResponse response = this.getResponse();
if (locale.equals("cn")) {
locale = "en";
} else {
locale = "cn";
}
String reqURL = request.getRequestURI();
System.out.println(reqURL);
response.sendRedirect(reqURL);
}
}
页面选择语言的下拉代码如下(managed-bean配置以及properties文件的配置就不多讲了,不懂的可以问问谷大哥或者百大哥)
<f:view locale="#{localeSetting.locale}">
<f:loadBundle basename="resources.messages" var="msgs" />
<h:form>
<h:selectOneMenu styleClass="toplink" immediate="true"
onchange="this.form.submit();" value="#{localeSetting.locale}"
valueChangeListener="#{localeSetting.changeLocale}">
<f:selectItem itemValue="en" itemLabel="#{msgs.LBL_EN_LANGUAGE}" />
<f:selectItem itemValue="cn" itemLabel="#{msgs.LBL_CN_LANGUAGE}" />
</h:selectOneMenu>
</h:form>
</f:view>
支持,当你每次选择下拉菜单的时候,都会调用changeLocale方法去改变locale值,并且在执行完成后会重定向到请求的页面,也就解决了,页面无法显示正常语言的问题了。
可能之前看文章不仔细才造成小弟不得不这样“瞎搞”,还望各位高手指出,但请勿喷我啊,小弟会流泪的,哈哈,感谢了。
关于JSF国际化问题的更多相关文章
- (私人收藏)[开发必备]最全Java离线快速查找手册(可查询可学习,带实例)
(私人收藏)[开发必备]最全Java离线快速查找手册(可查询可学习,带实例) https://pan.baidu.com/s/1L54VuFwCdKVnQGVc8vD1TQnwmj java手册 Ja ...
- vue.js国际化vue-i18n插件的使用问题,在模版文本、组件方法、jsf方法里的使用
vue.js国际化vue-i18n插件的使用问题,在模版文本.组件方法.jsf方法里的使用 1.在文本里使用{{$t("xxx")}} <span>{{$t(" ...
- [转载][翻译] 利用JSF、SpringFramework和Hibernate构建Web应用的实例讲述
[原作者] Derek Yang Shen[原文链接] http://www.javaworld.com/javaworld/jw-07-2004/jw-0719-jsf.html[源码链接] htt ...
- JSF框架认识
JSF框架 编辑 JavaServer Faces (JSF) 是一种用于构建Java Web 应用程序的标准框架(是Java Community Process 规定的JSR-127标准).它提供了 ...
- JSF开篇之Login案例
开发环境:Myeclipse+JDK5+MyEclipse Tomcat+jsf2.2.8 JSF看起来和STRUTS还是有些像的,刚开始还是遇到一点问题:资源包的存放路径及文件访问路径. 开发Log ...
- JSF标签大全详解
1. JSF入门 藉由以下的几个主题,可以大致了解JSF的轮廓与特性,我们来看看网页设计人员与应用程序设计人员各负责什么. 1.1简介JSF Web应用程序的开发与传统的单机程序开发在本质上存在着太多 ...
- jsf标签,jsp标签与jstl标签
JSF通过定制标签与JSP集成.之前展示过的所有 JSF标签,<h:inputText>.<h:outputText>.<h:form> 和<f:view&g ...
- JSF和Struts的区别概述
JSF和Struts的区别概述,都采用taglib来处理表示层:在jsp页面中,二者都是采用一套标记库来处理页面的表示和model层的交互. 据说JSF的主要负责人就是struts的主要作者,所以二者 ...
- JSF简单介绍
JSF简单介绍 一. 什么是 JSF: JavaServer Faces (JSF) 是一种用于构建 Web 应用程序的新标准 Java 框架.它提供了一种以组件为中心来开发 Java Web 用户界 ...
随机推荐
- navicat连接oracle数据库报ORA-28547: connection to server failed, probable Oracle Net admin error错误的解决方法
原文:navicat连接oracle数据库报ORA-28547: connection to server failed, probable Oracle Net admin error错误的解决方法 ...
- mysql utf8mb4与emoji表情
一 什么是Emoji emoji就是表情符号:词义来自日语(えもじ,e-moji,moji在日语中的含义是字符) 表情符号现已普遍应用于手机短信和网络聊天软件. emoji表情符号,在外国的手机短信里 ...
- 在 VS2013的ASPNET站点开发中用 xheditor v1.1.13 作为HTML编辑器
要用vs2013开发一个博客站点,.net framework 4,须要一个HTML编辑器作为写文章的工具.经多方试用,排除了dotnettextbox.kceditor.认为xheditor ...
- Shell的学习就从重装系统开始吧
小标题:与Fedora的爱恨情仇 干巴巴的shell学习实在枯燥,看来学习姿势还是要从实践入手 起因:传说中的不作死就不会死,昨晚偶遇一本PDF,讲glade编辑界面的,以下就被吸引了,跟着讲解搞出个 ...
- Redis3
Redis到底该如何利用 上两篇受益匪浅,秉着趁热打铁,不挖到最深不罢休的精神,我决定追加这篇.上一篇里最后我有提到实现分级缓存管理应该是个可行的方案,因此今天特别实践了一下.不过缓存分级之后也发现了 ...
- [译]关于Java 字符串最常被问到的十个问题
(说明,该文章翻译自Top 10 questions of Java Strings) 下面是关于Java字符串最常被问到的十个问题 1.怎么去比较字符串?使用==还是使用equals()? 简单来说 ...
- 探秘ReSharper8.1版本中Architecture(架构工具)的改进
在ReSharper 8.0新版本中,有一个叫做Architecture(结构工具)的新功能,此功能被定义为项目依赖关系分析.其目的是让用户可视化操作解决方案的结构.接下来,小编将在ReSharper ...
- Rails当你运行一个数据库回滚错误:ActiveRecord::IrreversibleMigration exception
最近rails3.2在更改数据库表字段,然后要回滚取消,但在运行rake db:rollback命令,错误: rake aborted! An error has occurred, all late ...
- t_sql语句得到表中所有信息
--得到所有数据库SELECT Name FROM Master..SysDatabases ORDER BY Name --得到某一数据库的所有表SELECT Name FROM MyPhotos. ...
- Android项目----AsyncTask异步操作
public abstract class AsyncTask extends Object java.lang.Object ↳ android.os.AsyncTask<Params, ...