`

Spring i18n的better practice(相对于appfuse)

    博客分类:
  • Java
阅读更多
因为希望把SpringSide搞成国际化项目,i18n就成了必做的事情。
照抄appfuse,折腾了很久后才发现appfuse式的sample总是只顾着演示自己的一亩三分地而忽略了很多其他东西。

   1.从基础开始,没有Spring时,Java的i18n是这样的:
   1.1 jsp环境
    首先写一个messages.zh_CN.properties文件,放在class-path也就是/WEB-INF/classes里     welcome=欢迎    然后用native2ascii.exe把它转为 welcome=\u6b22\u8fce
    在web.xml中定义messages文件     
       <context-param>
            <param-name>javax.servlet.jsp.jstl.fmt.localizationContext</param-name>
            <param-value>messages</param-value>
        </context-param>
    最后在jsp里使用
<%@ taglib uri="http://java.sun.com/jstl/fmt" prefix="fmt" %>
<fmt:message key="welcome"/>
如果有多个Resource Bundle文件, 就要在jsp里用<ftm:bundle>定义了.

1.2 pure Java环境
    ResourceBundle rb = ResourceBundle.getBundle("messages");
    String welcome = rb.getString("welcome");

2.Spring的增强及appfuse的做法
   Spring增加了MessageSource的概念,一是ApplicationContext将充当一个单例的角色,不再需要每次使用i18时都初始化一次ResourceBundle,二是可以代表多个Resource Bundle.

   在ApplicationContext的定义文件中,增加如下节点: 
   <bean id="messageSource" class="org.springframework.context.support.ResourceBundleMessageSource">
        <property name="basename" value="messages"/>
    </bean>
   则在pure java环境中。  context.getMessage("welcome", null, Locale.CHINA)

  而在jsp环境中,Controller调用JSTL viewResolver再调用Jsp时,<fmt:message>将继续发挥它的功效。

  因此,appfuse等sample都是在appfuse-servlet.xml 中定义一个<messageSource>。

3.Better Practice
3.1 要不要定义javax.servlet.jsp.jstl.fmt.localizationContext[定义]
      Appfuse等sample,都是假定大家完全使用Controller作访问入口,jsp甚至藏在了/web-inf/中。而很不幸,大家的项目可能还是有很多直接访问jsp的地方,而直接访问jsp时,<messageSource>节点是没有作用的。
     但如果定义了javax...localizationContext, 又会让MessageSource失效......


3.2 messageSource定义在ApplicationContext.xml还是appfuse-servlet.xml
     ApplicationContext*.xml由ContextLoaderListener载入而appfuse-servlet.xml靠dispatchServlet载入并拥有一个指向ApplcationContex*.xml指针。所以,appfuse-servlet.xml能看到定义在ApplcationContext里的东西,而反之做不到。
     明显, 把<messageSource>定义在ApplicationContext.xml 能获得更好的可见性。
     但是appfuse没有在pure Java代码中使用i18n,也就没有考虑这个问题。

3.3 坚决不用鸡肋级<spring:message> tag
      连appfuse也不用它,可见多么鸡肋。因为fmt在找不到资源时,最多显示???welcome???,而<spring:message>则会抛出异常,谁会喜欢这种定时阿。

3.4 有趣的theme 解决"做成图片的文字"的国际化
       theme也就是把message的原理发挥了一下,让不同语言的美术字图片的路径也可以定义在theme_zh_CN.properties和theme_en_US.properties中。终于有一个不那么鸡肋的spring tag了。

4.简单归纳

1. jstl中仍然使用标准的<ftm:message>及其定义?

2.java中使用spring的<messageSource>实现单例

3.用<spring:theme>解决那些做成图片的文字的国际化问题

4.Spring 还有session,cookie locale resolver, 到时可以看一下.

分享到:
评论
2 楼 dwangel 2013-07-13  
给messageSource设置属性
<property name="useCodeAsDefaultMessage" value="true" />
也可以阻止找不到key时抛异常。
1 楼 dwangel 2013-07-13  
spring 的message tag有一个属性text,可以填写缺省值。
有缺省值时,不抛异常的。
不知道这个属性是不是后来加的。

相关推荐

    appfuse

    7. **国际化(Internationalization, i18n)**:支持多语言,通过资源文件实现。 8. **自动化测试(Automated Testing)**:提供了JUnit和Mockito支持,便于编写单元测试。 通过理解和学习AppFuse的这些组件及其...

    appfuse-light-webwork-spring-jdbc-1.8.2.zip_Java 8_appfuse_webwo

    在"appfuse-light-webwork-spring-jdbc-1.8.2.zip"这个压缩包中,我们能看到一个基于Java 8、WebWork、Spring和JDBC的项目实例。 **Java 8** Java 8是Java平台的重大更新,引入了许多新特性,如lambda表达式、函数...

    AppFuse

    ### AppFuse:加速J2EE项目开发 #### 一、简介与背景 AppFuse是一个用于启动J2EE项目的工具包,它提供了一种快速而简便的方法来构建基于Java的应用程序。该工具包由Matt Raible创建,他在网络开发领域拥有丰富的...

    APPFUSE工具研究.doc

    生成AppFuse项目时,可以通过执行特定的Maven命令来创建不同类型的项目,比如基于Struts、Spring或Hibernate的项目。这允许开发者根据项目需求选择最适合的框架组合,进一步提升开发效率。 总的来说,AppFuse通过...

    appfuse学习笔记(一)安装部署

    它使用了多种流行的技术栈,如 Spring Boot、Hibernate、Thymeleaf 和 Maven,使得开发者可以更高效地开发基于 Java 的 Web 应用。在本文中,我们将深入了解如何安装并部署 AppFuse 项目。 **1. 预备知识** 在开始...

    jbpm 项目实践 1.2 (集成appfuse spring modules)

    【jbpm 项目实践 1.2 集成appfuse spring modules】 jbpm(Java Business Process Management)是一个开源的工作流管理系统,它提供了一整套工具和服务,用于管理业务流程。在jbpm 1.2的实践中,我们将讨论如何集成...

    AppFuse2.1所需包

    AppFuse 2.1 版本是该项目的一个较早版本,但仍然包含了现代Web开发的核心技术,如Spring MVC和Hibernate4。 Spring MVC 是Spring框架的一部分,是一个用于构建Web应用程序的模型-视图-控制器(MVC)框架。它允许...

    AppFuse项目研究

    AppFuse 是一个由 Matt Raible 创建的开源项目,旨在为...通过研究和使用 AppFuse,开发者不仅可以学习到如何整合这些流行的技术,还能了解到如何利用监听器进行初始化操作以及如何利用Spring进行依赖注入等最佳实践。

    appfuse 学习笔记

    Appfuse 支持多种应用类型的配置,例如使用 JSF 或 Spring MVC 等技术栈。每种类型的配置命令略有不同: - **JSF Basic 配置命令** ```bash mvn archetype:create -DarchetypeGroupId=org.appfuse.archetypes -...

    Appfuse开发教程

    总之,Appfuse开发教程涵盖了从创建数据库表到构建基于Struts的用户界面的全过程,利用了DAO、POJO、Spring和JUnit等技术,帮助开发者高效地构建Java Web应用程序。通过本教程,你可以了解到如何在Appfuse环境中进行...

    MAVEN 搭建APPFUSE

    【MAVEN 搭建APPFUSE】是一个关于使用Maven构建基于...总之,通过这个教程,你将掌握如何使用Maven与AppFuse相结合,高效地构建和管理Java Web应用,从而提升开发效率,减少重复工作,使你的项目更加规范和易于维护。

    可直接使用的appfuse项目

    AppFuse是一个集成了众多当前最流行开源框架与工具(包括Hibernate、ibatis、Struts、Spring、DBUnit、Maven、Log4J、Struts Menu、Xdoclet、SiteMesh、OSCache、JUnit、JSTL等(现在还有lucene的,无敌了))于一身的...

    基于AppFuse框架的B2C电子商务系统研究与实现

    AppFuse作为构建Web应用的基础框架,它整合了多种开源技术,如Spring、Hibernate、Apache Struts或Spring MVC等。Spring作为核心框架,负责管理应用的业务逻辑和依赖注入;Hibernate用于对象关系映射(ORM),简化...

    appfuse-spring.pdf

    密码:ilovejava.taobao.com

    建立项目原型骨架的步骤(最新版本appfuse)appfuse2.1.0-M2

    这个框架集成了Spring、Hibernate和Struts等主流技术,使得开发者能够迅速构建出符合MVC架构的应用。在最新的版本2.1.0-M2中,AppFuse 提供了基本(basic)和模块化(modular)两种类型的原型,以便于开发者根据项目...

    appfuse 使用手册

    这一特性是通过国际化(i18n)技术实现的,允许开发者轻松添加更多语言支持。 2. **新用户注册** 对于首次使用AppFuse系统的用户,需要先进行注册。点击登录页面的“申请”链接,用户会被导向注册页面。在这个页面,...

    SSH学习及开发框架-appfuse

    appfuse 有struts2+hibernate+spring的整合 springmvc+hibernate+spring的整合 多模块,但模块都有 学习开发参考使用非常方便 可以到官方下载最新版的,我只是把自己下载的打包整理一下 注意哈,都是基于maven的...

Global site tag (gtag.js) - Google Analytics