`
acen.chen
  • 浏览: 157281 次
  • 性别: Icon_minigender_1
  • 来自: 深圳
社区版块
存档分类
最新评论

jsf spring 国际化(包含特殊字符转义)

阅读更多

国际化的问题有多种实现方法,由于项目需要,最近研究了下,不敢独享。

以下是步骤
1.建立资源bundle文件(以下文件必须建立在src目录下,我放在com.talgroup.international.quotation包下面)

首先建立 UIResources_en_US.txt   

Index=Index:
UserCode=User Code:
UserRole=User Role:
Password=Password:
UserGroup=User Group:
Login=Login
Test=?,<>.;:'"{}()#$%&*@ !^/

UIResources_zh_CN.txt

Index=序列号:
UserCode=用户名:
UserRole=用户角色:
Password=密码:
UserGroup=用户组:
Login=登陆
Test=?,<>.;:'"{}()无悔一腔血 有意济苍生#$%&*@ !^/

然后建立 转码程序

native2ascii(en-us).bat

native2ascii -encoding TIS-620 UIResources_en_US.txt > UIResources_en_US.properties

native2ascii(zh-cn).bat

native2ascii -encoding gb2312 UIResources_zh_CN.txt > UIResources_zh_CN.properties

最后 运行两个批处理程序,产生两个properties文件

 

2.spring 的application-context.xml文件中配置资源bundle文件

<bean id="messageSource"
  class="org.springframework.context.support.ResourceBundleMessageSource">
  <property name="basename">
   <value>com.talgroup.international.quotation.UIResources</value>
  </property>
 </bean>

 

3.建立后台bean

package com.talgroup.web.quotation.ui;
import java.util.Locale;
import org.springframework.context.ApplicationContext;
import org.springframework.context.support.FileSystemXmlApplicationContext;
import org.springframework.web.util.JavaScriptUtils;
import org.springframework.web.util.HtmlUtils;
public class InternationalBean {

 private static String lan="en_US";
    private static String jsStr=null;
    private static String htmlStr=null;
//    ApplicationContext context= new FileSystemXmlApplicationContext("/WEB-INF/resource-config.xml");
    private static org.springframework.context.support.ResourceBundleMessageSource context = (org.springframework.context.support.ResourceBundleMessageSource)com.talgroup.app.frmwork.Context.getBean("messageSource");
   
   
 public String getLan() {
  return lan;
 }

 public void setLan(String lan) {
  this.lan = lan;
 }
 
 public String zh_CN_Action()
 {
  this.setLan("zh_CN");
  return null;
 }
 
 public String zh_HK_Action()
 {
  this.setLan("zh_HK");
  return null;
 }
 
 public String en_US_Action()
 {
  this.setLan("en_US");
  return null;
 }
 
 public static Locale mapStrToLocale(String lan)
 {
  if(lan.equals("zh_CN")) return Locale.CHINA;
  if(lan.equals("en_US")) return Locale.US;

  return Locale.US;
 }
 
 public static String JavaScriptEscape(String arg)
 {
  String str = context.getMessage(arg, null, mapStrToLocale(lan));
  jsStr = JavaScriptUtils.javaScriptEscape(str);
  return jsStr;
 }
 
 public static String HtmlEscape(String arg)
 {
  String str = context.getMessage(arg, null, mapStrToLocale(lan));
  //htmlStr = HtmlUtils.htmlEscape(str);
  return str;
 }

}

4.jsf的face-config.xml中注册管理bean,session级别

<managed-bean>
  <managed-bean-name>internationalBean</managed-bean-name>
  <managed-bean-class>
   com.talgroup.web.quotation.ui.InternationalBean
  </managed-bean-class>
  <managed-bean-scope>session</managed-bean-scope>
 </managed-bean>

5.页面表现层

<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<html xmlns="http://www.w3.org/1999/xhtml"
 xmlns:ui="http://java.sun.com/jsf/facelets"
 xmlns:h="http://java.sun.com/jsf/html"
 xmlns:f="http://java.sun.com/jsf/core"
 xmlns:z="http://www.qualcomm.com/jsf/core"
 xmlns:c="http://java.sun.com/jstl/core"
 xmlns:fn="http://java.sun.com/jsp/jstl/functions"
 xmlns:a4j="http://richfaces.org/a4j"
 xmlns:rich="http://richfaces.org/rich"
 xmlns:talui="http://www.talgroup.com/tags"
 xmlns:quot="http://www.talgroup.com/quotation/tags"
 xmlns:js="http://www.talgroup.com/quotation/tags"
 xmlns:html="http://www.talgroup.com/quotation/tags">
 <head>
  <meta http-equiv="PRAGMA" content="no-cache" />
 </head>
 <body>
   <div id="wrapper" align="center">
    <h:form>
     <div style="width: 620" align="right">
      <h:panelGrid columns="8">
       <h:commandLink value="chinese"
        style="color:black;font-family:Courier;font-size:10pt;width:120"
        action="#{internationalBean.zh_CN_Action}">
       </h:commandLink>/
       <h:commandLink value="chinese-hk"
        style="color:black;font-family:Courier;font-size:10pt;width:120"
        action="#{internationalBean.zh_HK_Action}">
       </h:commandLink>/
             <h:commandLink value="english"
        style="color:black;font-family:Courier;font-size:10pt;width:120"
        action="#{internationalBean.en_US_Action}">
       </h:commandLink>

       <h:outputLink id="link1" value="http://www.yourcompany.com">
        <h:outputText value="Perferences"
         style="color:black;font-family:Courier;font-size:10pt;width:120" />
       </h:outputLink>
       <h:outputLink id="link2" value="http://www.yourcompany.com">
        <h:outputText value="Help"
         style="color:black;font-family:Courier;font-size:10pt;width:60" />
       </h:outputLink>
       <h:outputLink id="link3" value="http://www.yourcompany.com">
        <h:outputText value="Contect us"
         style="color:black;font-family:Courier;font-size:10pt;width:100" />
       </h:outputLink>
      </h:panelGrid>
     </div>
    </h:form>
    <h1 id="brandBar">
     #{loginBeanWithRoleAndGroup.title}
    </h1>

    <h:form id="loginForm">
     <h:messages layout="table" errorStyle="color: red"></h:messages>
     <h:panelGrid columns="5" width="700">
      <h:panelGroup>
       <h:outputText
        style="color:black;font-family:Courier;font-size:10pt;width: 180px"
        value="#{html:HtmlEscape('Index')}" />
      </h:panelGroup>
      <h:panelGroup>
       <h:selectOneMenu id="appCode"
        value="#{loginBeanWithRoleAndGroup.appCode}" required="true"
        style="width: 140px">
        <f:selectItems value="#{loginBeanWithRoleAndGroup.applications}" />
        <a4j:support event="onchange" reRender="loginForm_userCode"
         ajaxSingle="true"
         action="#{loginBeanWithRoleAndGroup.lookUpUserByApplication}" />
       </h:selectOneMenu>
      </h:panelGroup>
      <h:panelGroup>
       <h:outputText value="" style="width: 50px"></h:outputText>
      </h:panelGroup>
      <h:panelGroup>
       <h:outputText value=""></h:outputText>
      </h:panelGroup>
      <h:panelGroup>
       <h:outputText value=""></h:outputText>
      </h:panelGroup>
      <h:panelGroup>
       <h:outputText
        style="color:black;font-family:Courier;font-size:10pt;width: 180px"
        value="#{html:HtmlEscape('UserCode')}" />
      </h:panelGroup>
      <h:panelGroup id="loginForm_userCode">
       <h:selectOneMenu id="userCode"
        value="#{loginBeanWithRoleAndGroup.userCode}" required="true"
        style="width: 140px">
        <c:if test="${!empty loginBeanWithRoleAndGroup.users}">
         <f:selectItems value="#{loginBeanWithRoleAndGroup.users}" />
        </c:if>
        <a4j:support event="onchange"
         reRender="loginForm_userRole,loginForm_userGroup"
         ajaxSingle="true"
         action="#{loginBeanWithRoleAndGroup.lookUpUserRoleAndGroup}" />
       </h:selectOneMenu>
      </h:panelGroup>
      <h:panelGroup>
       <h:outputText value=""></h:outputText>
      </h:panelGroup>
      <h:panelGroup style="width: 167px">
       <h:outputText
        style="color:black;font-family:Courier;font-size:10pt;width: 155px"
        value="#{html:HtmlEscape('UserRole')}" />
      </h:panelGroup>
      <h:panelGroup id="loginForm_userRole">
       <h:selectOneMenu value="#{loginBeanWithRoleAndGroup.userRole}"
        required="true" style="width: 140px">
        <c:if test="${!empty loginBeanWithRoleAndGroup.roles}">
         <f:selectItems id="fddd"
          value="#{loginBeanWithRoleAndGroup.roles}" />
        </c:if>
       </h:selectOneMenu>
      </h:panelGroup>
      <h:panelGroup>

       <h:outputText
        style="color:Black;font-family:Courier;font-size:10pt;width: 180px"
        value="#{html:HtmlEscape('Password')}" />
      </h:panelGroup>
      <h:panelGroup>
       <h:inputSecret id="password"
        value="#{loginBeanWithRoleAndGroup.password}" required="true"
        requiredMessage="Password can not be empty" style="width: 125px" />

      </h:panelGroup>
      <h:panelGroup>
       <h:outputText value=""></h:outputText>
      </h:panelGroup>
      <h:panelGroup>
       <h:outputText
        style="color:black;font-family:Courier;font-size:10pt;width: 155px"
        value="#{html:HtmlEscape('UserGroup')}" />
      </h:panelGroup>
      <h:panelGroup id="loginForm_userGroup">
       <h:selectOneMenu value="#{loginBeanWithRoleAndGroup.userGroup}"
        required="false" style="width: 140px">
        <c:if test="${!empty loginBeanWithRoleAndGroup.groups}">
         <f:selectItems id="dsd"
          value="#{loginBeanWithRoleAndGroup.groups}" />
        </c:if>
       </h:selectOneMenu>
      </h:panelGroup>
      <f:verbatim></f:verbatim>
      <h:outputText style="width:170px" value="" />
      <h:outputText style="width:170px" value="" />
      <h:outputText style="width:170px" value="" />
      <h:outputText style="width:170px" value="" />
      <h:panelGroup>
       <h:inputText style="width:0px;visibility:hidden" id="dsdasdsa"
        value="if you remove, you will get error" />
       <h:commandButton style="width:130px;" value="#{html:HtmlEscape('Login')}"
        action="#{loginBeanWithRoleAndGroup.loginAction}"></h:commandButton>
      </h:panelGroup>
      <h:panelGroup>
       <h:outputText style="width:170px" value="" />
      </h:panelGroup>
      <h:panelGroup>
       <h:outputText style="width:170px" value="" />
      </h:panelGroup>
      <h:panelGroup>
       <h:outputText style="width:170px" value="" />
      </h:panelGroup>
     </h:panelGrid>
     <h:panelGrid columns="1" width="150">
      <h:panelGroup style="height: 20px;">
       <f:verbatim>
        <DIV id="dynamicParameters" style="visibility: hidden;">
        </DIV>
       </f:verbatim>
      </h:panelGroup>
     </h:panelGrid>

    </h:form>
   </div>
   <br>
   alert test---
  <input type="button" value="click" onclick="alert('#{js:JavaScriptEscape('Test')}')"/>
  </br>
  <br>
   html test---
  <h:outputText style="width:170px" value="#{html:HtmlEscape('Test')}"/>
  </br>
  <h:outputText style="width:170px" value="#{html:HtmlEscape('Test')}"/>
 </body>
</html>

 

ps:

xmlns:js="http://www.talgroup.com/quotation/tags" 和xmlns:html="http://www.talgroup.com/quotation/tags">


是我自定义的两个标签,它主要是用来接受页面传过来的键值(例如:Index,UserCode。。。)将它传到后台bean(InternationalBean)中,然后根据这个键值去资源文件中查找相应的message值,最后返回到页面显示,当然这里面涉及到特殊字符转义的问题,这在bean里面都做了处理了。

 

至于标签如何定义,如何传参数,由于篇幅原因,我将在下一篇文章中做详细的介绍。

 

 

分享到:
评论

相关推荐

    JSF与Spring完美结合

    JSF主要用于构建用户界面,而Spring则提供全面的企业级应用支持,包括依赖注入、事务管理、安全控制等。当这两者结合时,可以创建出功能强大且灵活的Web应用程序。下面将详细介绍如何实现JSF与Spring的完美集成,...

    jsf+spring 实例

    在"jsf_02_spring"这个压缩包中,可能包含了以下内容: - `src/main/java`:存放Java源代码,包括JSF Managed Beans和Spring Bean。 - `src/main/webapp`:存放Web应用的资源,如JSF的XHTML页面、CSS、JavaScript...

    JSF SPRING

    jsf与spring的集成的几种方式,以及jsf的一些技术

    jsf-spring-boot-starter-2.2.6.zip

    这个压缩包通常包含了用于快速搭建JSF应用在Spring Boot环境中的必要组件和配置。 【描述】"scalafmt.zip,CoreThis回购现在是--&gt;" 这句话可能稍有误导,因为描述中提到了"scalafmt.zip",这通常与Scala相关的...

    jsf+spring整合

    JSF主要用于构建用户界面,而Spring则提供了全面的企业级应用框架服务,包括依赖注入、事务管理、安全性和AOP(面向切面编程)。将两者整合可以利用它们各自的优势,创建出高效、模块化的Web应用程序。 **JSF简介**...

    jsf-spring-4.0.3

    3. **Web应用结构**:可能有`WEB-INF`目录,包含`web.xml`,这是Servlet容器的部署描述符,可能会配置JSF和Spring的初始化参数。 4. **Maven或Gradle配置**:如果是开源项目,可能包含`pom.xml`或`build.gradle`,...

    qt.rar_jsf example_jsf spring hibernate_jsf下拉菜单_spring jsf hiber

    【标题】"qt.rar" 提供的是一个关于 "jsf example" 的实例,结合了 "jsf spring hibernate" 的技术栈,同时包含了 "jsf下拉菜单" 的实现,以及 "spring jsf hibernate" 的整合应用。这个压缩包可能是为了演示如何在...

    JSF+Spring+Hibernate的实例讲解.doc

    Spring Framework 提供了一个全面的开发工具集,包括依赖注入、AOP(面向切面编程)、事务管理等,它支持多种持久化策略,如 JDBC、JPA 或 Hibernate。Hibernate 则是一个对象关系映射 (ORM) 工具,能够将 Java 类与...

    JSF和Spring集成.doc

    具体来说,Spring 的 `ApplicationContext` 类对于 web 应用非常关键,它不仅包含了 Spring 管理的所有 bean,还封装了 `javax.servlet.ServletContext`。而 JSF 通过 `FacesContext` 类也可以访问到 ServletContext...

    jsf+spring的jar包

    JSF主要用于构建用户界面,而Spring则提供了全面的企业级应用框架服务,包括依赖注入、面向切面编程、事务管理等。 首先,JSF是一个MVC(Model-View-Controller)框架,它简化了创建用户界面的过程。JSF的核心组件...

    JSF国际化范例 源代码

    在这个JSF国际化范例中,源代码很可能会包括以下部分: - 不同语言版本的资源文件(如`messages_en.properties`,`messages_zh_CN.properties`) - XHTML视图文件,展示如何引用资源文件中的消息 - Managed Bean,...

    JSF第一步--JSF+Spring+ Hibernate+AJAX编程实践 试读

    例如,JSF负责展示层,Spring管理业务逻辑和服务,而Hibernate处理数据持久化。AJAX则提升了用户界面的响应速度和交互体验。 在"JSF第一步--JSF+Spring+Hibernate+AJAX编程实践 试读"这本书中,读者可以期待学习...

    jsf2+spring sample

    总的来说,"jsf2+spring sample"项目展示了如何在同一个应用中利用JSF2的强大组件化UI特性和Spring的灵活业务处理能力,实现高效且易于维护的Web应用。通过学习这个示例,开发者可以更好地理解两者的协同工作方式,...

    jsf1.2+Spring3.0.5+Mybatis

    例如,JSF的组件化UI使得前端开发更加直观,Spring的AOP和事务管理让业务逻辑更清晰,而Mybatis的直接SQL操作则提升了数据库访问的效率。总的来说,这个项目展示了如何利用这些技术构建一个健壮、高效的Java Web应用...

    JSF2中实现国际化

    在JavaScriptServer Faces (JSF) 2.x版本中,实现国际化是一项重要的功能,它使得应用程序能够根据用户所在的地区提供相应的语言支持。这篇文章将探讨如何在JSF 2中实现国际化,以便为全球用户提供更好的用户体验。 ...

    JSF Spring hibernate2

    总的来说,"JSF Spring Hibernate2"项目是一个结合了前端展示、后端服务和持久化层的复杂Web应用,它展示了Java技术栈在企业级应用开发中的强大能力。通过深入理解和熟练掌握这些技术,开发者可以构建出高效、稳定且...

    jsf+spring+hibernate

    总结来说,"jsf+spring+hibernate" 的组合为开发者提供了一个强大而灵活的框架,能够有效地处理复杂的 Web 应用场景,包括用户认证、数据操作和业务流程控制。通过合理的设计和配置,可以构建出高效、可扩展的应用...

    sample-jsf-spring-hibernate.rar_jsf spring

    1. **业务逻辑处理**:Spring作为中央容器,管理所有bean,包括JSF的后台Managed Beans和Hibernate的数据访问对象(DAO)。Spring的DI使得组件之间可以松散耦合,方便维护和扩展。 2. **数据持久化**:Hibernate负责...

    JSF+Spring+Hibernate(框架整合)详细过程

    1. **配置Spring**:首先,我们需要在Spring配置文件中定义Bean,包括JSF Managed Beans和Hibernate Session Factory。Bean的定义可以是XML配置或基于注解的方式。 2. **JSF与Spring的整合**:为了使JSF能够使用...

Global site tag (gtag.js) - Google Analytics