`
younglibin
  • 浏览: 1211025 次
  • 性别: Icon_minigender_1
  • 来自: 北京
社区版块
存档分类
最新评论

struts2中加载资源文件的顺序

阅读更多

据Struts2的文档,当由action加载页面时资源文件的的搜索顺序为:

 

ActionClass.properties
Interface.properties (every interface and sub-interface)
BaseClass.properties (all the way to Object.properties)
ModelDriven's model (if implements ModelDriven), for the model object repeat from 1
package.properties (of the directory where class is located and every parent directory all the way to the root directory)
search up the i18n message key hierarchy itself
global resource properties

 

资源文件的命名:basename_language_country.properties

JAVA国际化
如果系统同时存在资源文件、类文件,系统将以类文件为主,而不会调用资源文件。
对于简体中文的Locale,ResourceBundle搜索资源的顺序是:
(1)baseName_zh_CN.class
(2)baseName_zh_CN.properties
(3)baseName_zh.class
(4)baseName_zh.properties
(5)baseName.class
(6)baseName.properties

 

Struts2的国际化入门
Struts2国际化是建立在Java国际化的基础上的,一样是通过提供不同国家/语言环境的消息资源,然后通过ResourceBundle
加载指定Locale对应的资源文件,再取得该资源文件中指定key对应的消息--整个过程与JAVA程序的国家化完全相同,只是
Struts2框架对JAVA程序国际化进行了进一步封装,从而简化了应用程序的国际化。


Struts2需要国际化的部分
类型转换:
数据校验:
验证框架xml配置文件的国际化:RegisterAction-validation.xml文件<message key="username.xml.invalid"/>
JSP页面的国际化:<s:text name="addUser"/>
Action的国际化:利用ActionSupport类提供的getText()方法.


Struts2中加载全局资源文件
struts.xml
<constant name="struts.custom.i18n.resources" value="baseName"/>

struts.properties
struts.custom.i18n.resources=baseName


访问国际化消息
Struts2访问国际化消息主要有如下三种方式:
(1)JSP页面:<s:text name="key"/>
(2)Action类中:使用ActionSupport类的getText方法。
(3)表单元素的Label里:为表单元素指定一个key属性


输出带占位符的国际化消息
Struts2中提供了如下两种方式来填充消息字符串中的占位符
(1)JSP页面,在<s:text.../>标签中使用多个<s:param.../>标签来填充消息中的占位符。
(2)Action中,在调用getText方法时使用getText(String aTextName,List args)或getText(String key, String[] args)方法来填充占位符。
除此之外,Struts2还提供了对占位符的一种替代方式,这种方式允许在国际化消息资源文件中使用表达式,对于这种方式,则可避免在使用国际化消息时还需要为占位符传入参数值。
如下在消息资源中使用表达式
succTip=${username}, 欢迎, 您已经登录!
在上面的消息资源中,通过使用表达式,可以从ValueStack中取出该username属性值,自动填充到该消息资源中。


加载资源文件的方式
(1)加载全局资源文件: <constant name="struts.custom.i18n.resources" value="baseName"/>
(2)包范围资源文件 :为Struts2指定包范围资源文件的方法是,在包的根路径下建立多个文件名为package_language_country.properties的文件,一旦建立了
    这个系列的国际化资源文件,应用中处于该包下的所有Action都可以访问该资源文件。需要注意的是上面的包范围资源文件的baseName就是package,
不是Action所在的包名。
(3)Action范围资源文件:在Action类文件所在的路径建立多个文件名为ActionName_language_country.properties的文件。
(4)临时指定资源文件:<s:i18n.../>标签的name属性指定临时的国际化资源文件


加载资源文件的顺序
Action中加载资源文件,假设我们在某个ChildAction中调用了getText("user.title"),Struts 2.0的将会执行以下的操作:
(1)优先加载系统中保存在ChildAction的类文件相同位置,且baseName为ChildAction的系列资源文件。
(2)如果在(1)中找不到指定key对应的消息,且ChildAction有父类ParentAction,则加载系统中保存在ParentAction的类文件相同位置,且
   baseName为ParentAction的系列资源文件。
(3)如果在(2)中找不到指定key对应的消息,且ChildAction有实现接口IChildAction,则加载系统中保存在IChildAction的类文件相同位置,且
   baseName为IChildAction的系列资源文件。
(4)如果在(3)中找不到指定key对应的消息,且ChildAction有实现接口ModelDriven(即使用模型驱动模式),则对于getModel()方法返回的model对象,
   重新执行第(1)步操作。
(5)如果在(4)中找不到指定key对应的消息,则查找当前包下baseName为package的系列资源文件。
(6)如果在(5)中找不到指定key对应的消息,则沿着当前包上溯,直到最顶层包来查找baseName为package的系列资源文件。
(7)如果在(6)中找不到指定key对应的消息,则查找struts.custom.i18n.resources常量指定baseName的系列资源文件。
(8)如果经过上面的步骤一直找不到key对应的消息,将直接输出该key的字符串值。

对于在JSP中访问国际化消息,则简单的多,他们又可以分为两种形式:
(1)对于使用<s:i18n.../>标签作为父标签的<s:text.../>标签、表单标签的形式:
   a、将从<s:i18n.../>标签指定的国际化资源文件中加载指定key对应的消息。
   b、如果在a中找不到指定key对应的消息,则查找struts.custom.i18n.resources常量指定baseName的系列资源文件。
   c、如果经过上面步骤一直找不到该key对应的消息,将直接输出该key的字符串值。
(2)如果<s:text.../>标签、表单标签没有使用<s:i18n.../>标签作为父标签:
    直接加载struts.custom.i18n.resources常量指定baseName的系列资源文件。如果找不到该key对应的消息,将直接输出该key的字符串值。


允许用户自行选择程序语言
Struts2国际化的运行机制
    在Struts2中,可以通过ActionContext.getContext().setLocale(Locale arg)设置用户的默认语言。
为了简化设置用户默认语言环境,Struts2提供了一个名为i18n的拦截器(Interceptor),并且将其注册在默认的拦截器中(defaultStack)。
    i18n拦截器在执行Action方法前,自动查找请求中一个名为request_locale的参数。如果该参数存在,拦截器就将其作为参数,转换成Locale对象,
并将其设为用户默认的Locale(代表国家/语言环境)。
除此之外,i18n拦截器还会将上面生成的Locale对象保存在用户Session的名为WW_TRANS_I18N_LOCALE的属性中。一旦用户Session中存在一个名为
WW_TRANS_I18N_LOCALE的属性,则该属性指定的Locale将会作为浏览者的默认Locale。

<%@ page language="java" contentType="text/html; charset=GBK"%>
<%@taglib prefix="s" uri="/struts-tags"%>
<script. type="text/javascript">
function langSelecter_onChanged()
{
document.getElementById("langForm").submit();
}
</script>

<%-- 设置SESSION_LOCALE为用户session中的WW_TRANS_I18N_LOCALE属性值 --%>
<s:set name="SESSION_LOCALE" value="#session['WW_TRANS_I18N_LOCALE']"/>

<%-- 使用lee.Locales创建locales实例 --%>
<s:bean id="locales" name="lee.Locales">
<%-- 为locales实例传入current参数值,如果SESSION_LOCALE为空,则返回ValueStack中locale属性值(即用户浏览器设置的Locale) --%>
<s:param name="current" value="#SESSION_LOCALE == null ? locale : #SESSION_LOCALE"/>
</s:bean>

<%-- 让用户选择语言的表单 --%>
<form. action="<s:url/>" id="langForm"
    style="background-color:#bbbbbb; padding-top: 4px; padding-bottom: 4px;">
    <s:text name="languag"/>
<s:select label="Language" list="#locales.locales" listKey="value" listValue="key"
        value="#SESSION_LOCALE == null ? locale : #SESSION_LOCALE"
        name="request_locale" id="langSelecter"
        nchange="langSelecter_onChanged()" theme="simple"/>
</form>

在其他页面中包含该页面:
<s:include value="selectlanguage.jsp"/>

在struts.xml文件中增加Action通配符的配置:
<?xml version="1.0" encoding="GBK"?>
<!DOCTYPE struts PUBLIC
        "-//Apache Software Foundation//DTD Struts Configuration 2.0//EN"
        "http://struts.apache.org/dtds/struts-2.0.dtd">
<struts>
<constant name="struts.custom.i18n.resources" value="messageResource"/>
<constant name="struts.i18n.encoding" value="GBK"/>

    <package name="lee" extends="struts-default">
<!-- 使用通配符定义Action的name -->
<action name="*">
   <!-- 将请求转发给/WEB-INF/jsp/路径下同名的JSP页面 -->
   <result>/WEB-INF/jsp/{1}.jsp</result>
</action>
    </package>
</struts>

分享到:
评论

相关推荐

    struts2 资源配置

    在Struts2框架中,国际化资源文件的加载顺序非常重要,它决定了当框架查找特定语言环境下的资源时,将按照怎样的顺序去匹配资源文件。Struts2遵循如下的加载顺序: 1. **特定国家与地区设置的资源文件**: `baseName...

    struts2面试题

    6. **资源文件的支持**:Struts2提供了对国际化资源文件的支持,便于多语言应用的开发。 #### Struts2核心组件详解 - **StrutsPrepareAndExecuteFilter**:作为Struts2框架的核心过滤器,它负责初始化框架并处理...

    Struts2各配置文件详解.doc

    在Struts2中,配置文件起着至关重要的作用,它们定义了框架的行为、拦截器、对象工厂、类型检测以及动作映射等关键组件。下面将详细解析Struts2的主要配置文件。 1)struts-default.xml 这是Struts2框架默认加载的...

    Struts2(一)

    - 动作类的搜索顺序遵循一定的规则,通常情况下,Struts2会根据配置文件中的顺序来查找对应的动作类。 通过以上内容,我们可以了解到Struts2作为一个成熟的MVC框架,在项目开发中扮演的重要角色。从环境搭建到第一...

    Struts2的工作流程及配置文件

    拦截器是Struts2中的核心组件之一,它可以在Action执行前后进行拦截操作,比如验证用户输入、记录日志等。 5. **Action执行**:一旦通过了所有的拦截器,Action就会被执行。Action执行的结果通常是一个视图,如JSP...

    struts2的复习

    12. 国际化:Struts2支持多语言环境,通过资源文件(如.properties或.properties.xml)管理不同语言的文本,根据用户浏览器的设置动态加载相应的语言资源。 十、表单验证 13. 表单验证:Struts2提供了强大的表单...

    struts2主要配置文件总结

    每个被包含的文件都应遵循struts.xml的格式,配置文件按顺序加载。 4. **Interceptor configuration**: 拦截器是Struts2中的关键组件,用于在Action方法调用前后执行额外的逻辑。拦截器有许多用途,如验证、属性...

    Struts2权威指南源码(完整),不含JAR文件

    本资源包含的是《Struts2权威指南》一书所配套的源码,但不包括JAR文件。了解并学习这些源码,可以帮助开发者深入理解Struts2的工作原理和内部机制。 Struts2的核心组件包括: 1. **Action**:Action是业务逻辑的...

    Struts2输入校验总结

    输入校验的流程在Struts2中是结构化的,涉及多个步骤: 1. **类型转换**:首先,Struts2框架使用类型转换器将HTTP请求中的字符串参数转换为相应的Java类型,如Integer、Date等,并将这些值设置为Action类的属性。 ...

    struts2基本类库

    OGNL是Struts2中的表达式语言,用于在Action对象和视图之间传递数据。它可以方便地访问和修改对象的属性,甚至执行复杂的表达式。 6. **Plug-in机制**: Struts2支持插件机制,允许开发者扩展框架功能,如自定义...

    struts2 2.3.1api

    - **Action**:在Struts2中,Action是业务逻辑的载体,它接收来自视图层的请求,处理数据并返回一个Result。开发者可以自定义Action类,实现特定的业务逻辑。 - **Result**:Result表示Action执行后返回的结果,它...

    STRUTS2优缺点

    - **配置文件较多:**虽然 STRUTS2 提供了 XML 和注解两种配置方式,但在实际开发中仍然需要编写大量的配置信息。 - **配置文件理解难度大:**对于初学者来说,理解这些配置文件的作用和意义可能需要花费一定的...

    struts2教程我在培训时用的

    - **加载资源文件的顺序**:配置资源文件的加载顺序。 - **允许用户自行选择程序语言**:通过表单选择语言,动态改变页面的语言显示。 #### 五、整合其他框架 **5.1 为Struts2整合Spring作准备** - **目的**:将...

    struts2笔记

    Struts2是一个强大的Java web应用程序开发框架,它简化了MVC(模型-视图-控制器)设计模式的实现,提供了一种组织应用结构和处理...在实际项目中,结合Struts2的扩展性和丰富的社区资源,可以更好地应对各种复杂需求。

    Struts2核心包

    9. **开发文档**:包含在压缩包中的开发文档是理解Struts2框架的重要资源,它详细介绍了每个组件的工作原理、配置选项以及最佳实践。 通过学习和使用Struts2的核心包,开发者可以深入理解MVC架构,掌握Java Web开发...

    struts2开发所需架包

    10. **国际化(Internationalization, I18n)**:Struts2支持多语言环境,通过资源包(properties文件)管理不同语言的文本。 在导入"lib2"这个压缩包后,确保将其添加到项目的类路径(Classpath)中,以便Eclipse...

Global site tag (gtag.js) - Google Analytics