`
qxs965266509
  • 浏览: 3870 次
  • 性别: Icon_minigender_1
  • 来自: 北京
最近访客 更多访客>>
社区版块
存档分类
最新评论

Java乔晓松-Struts2-国际化和OGNL表达式

 
阅读更多

国际化

准备资源文件,资源文件的命名格式如下:

baseName_language_country.properties

baseName_language.properties

baseName.properties

其中baseName是资源文件的基本名,我们可以自定义,但languagecountry必须是java支持的语言和国家。如:

中国大陆: baseName_zh_CN.properties

美国: baseName_en_US.properties

现在为应用添加两个资源文件:

第一个存放中文:csdn_zh_CN.properties

内容为:welcome=欢迎来到传智播客

第二个存放英语(美国): csdn_en_US.properties

内容为: welcome=welcome to csdn

对于中文的属性文件,我们编写好后,应该使用jdk提供的native2ascii命令把文件转换为unicode编码的文件。命令的使用方式如下:

native2ascii 源文件.properties 目标文件.properties

l 配置全局资源与输出国际化信息

当准备好资源文件之后,我们可以在struts.xml中通过struts.custom.i18n.resources常量把资源文件定义为全局资源文件,如下:

<constant name="struts.custom.i18n.resources" value=csdn" />

csdn为资源文件的基本名。

后面我们就可以在页面或在action中访问国际化信息:

l JSP页面中使用<s:text name=“”/>标签输出国际化信息:

<s:text name=“user”/>name为资源文件中的key

l Action类中,可以继承ActionSupport,使用getText()方法得到国际化信息,该方法的第一个参数用于指定资源文件中的key

l 在表单标签中,通过key属性指定资源文件中的key,如:

<s:textfield name="realname" key="user"/>

l

国际化输出带占位符的国际化信息

资源文件中的内容如下:

welcome= {0},欢迎来到传智播客{1}

jsp页面中输出带占位符的国际化信息

<s:text name="welcome">

<s:param><s:property value="realname"/></s:param>

<s:param>学习</s:param>

</s:text>

Action类中获取带占位符的国际化信息,可以使用getText(String key, String[] args)getText(String aTextName, List args)方法。

l 国际化包范围资源文件

在一个大型应用中,整个应用有大量的内容需要实现国际化,如果我们把国际化的内容都放置在全局资源属性文件中,显然会导致资源文件变的过于庞大、臃肿,不便于维护,这个时候我们可以针对不同模块,使用包范围来组织国际化文件。

方法如下:

java的包下放置package_language_country.properties资源文件,package为固定写法,处于该包及子包下的action都可以访问该资源。当查找指定key的消息时,系统会先从package资源文件查找,当找不到对应的key时,才会从常量struts.custom.i18n.resources指定的资源文件中寻找。

l 国际化—Action范围资源文件

我们也可以为某个action单独指定资源文件,方法如下:

Action类所在的路径,放置ActionClassName_language_country.properties资源文件,ActionClassNameaction类的简单名称。

当查找指定key的消息时,系统会先从ActionClassName_language_country.properties资源文件查找,如果没有找到对应的key,然后沿着当前包往上查找基本名为package 的资源文件,一直找到最顶层包。如果还没有找到对应的key,最后会从常量struts.custom.i18n.resources指定的资源文件中寻找。

l 国际化—JSP中直接访问某个资源文件

struts2为我们提供了<s:i18n>标签,使用<s:i18n>标签我们可以在类路径下直接从某个资源文件中获取国际化数据,而无需任何配置:

<s:i18n name=csdn">

<s:text name=welcome/>

</s:i18n>

csdn为类路径下资源文件的基本名。

如果要访问的资源文件在类路径的某个包下,可以这样访问:

<s:i18n name=cn/csdn/action/package">

<s:text name="welcome">

<s:param>小张</s:param>

</s:text>

</s:i18n>

上面访问cn.csdn.action包下基本名为package的资源文件。

OGNL表达式语言
OGNL是Object Graphic Navigation Language(对象图导航语言)的缩写,它是一个开源项目。 Struts 2框架使用OGNL作为默认的表达式语言。

相对EL表达式,它提供了平时我们需要的一些功能,如:
支持对象方法调用,如xxx.sayHello();
支持类静态方法调用和值访问,表达式的格式为@[类全名(包括包路径)]@[方法名 | 值名],例如:@java.lang.String@format('foo %s', 'bar')或@cn.csdn.Constant@APP_NAME;
操作集合对象。

Ognl 有一个上下文(Context)概念,说白了上下文就是一个MAP结构,它实现了java.utils.Map接口,在Struts2中上下文(Context)的实现为ActionContext,下面是上下文(Context)的结构示意图

访问上下文(Context)中的对象需要使用#符号标注命名空间,如#application、#session

另外OGNL会设定一个根对象(root对象),在Struts2中根对象就是ValueStack(值栈) 。如果要访问根对象(即ValueStack)中对象的属性,则可以省略#命名空间,直接访问该对象的属性即可。

在struts2中,根对象ValueStack的实现类为OgnlValueStack,该对象不是我们想像的只存放单个值,而是存放一组对象。在OgnlValueStack类里有一个List类型的root变量,就是使用他存放一组对象
|--request
|--application
context ------|--OgnlValueStack root变量[action, OgnlUtil, ... ]
|--session
|--attr
|--parameters

在root变量中处于第一位的对象叫栈顶对象。通常我们在OGNL表达式里直接写上属性的名称即可访问root变量里对象的属性,搜索顺序是从栈顶对象开始寻找,如果栈顶对象不存在该属性,就会从第二个对象寻找,如果没有找到就从第三个对象寻找,依次往下访问,直到找到为止。
大家注意: Struts2中,OGNL表达式需要配合Struts标签才可以使用。如:<s:property value="name"/>

由于ValueStack(值栈)是Struts 2中OGNL的根对象,如果用户需要访问值栈中的对象,在JSP页面可以直接通过下面的EL表达式访问ValueStack(值栈)中对象的属性:
${foo} //获得值栈中某个对象的foo属性

如果访问其他Context中的对象,由于他们不是根对象,所以在访问时,需要添加#前缀。
application对象:用于访问ServletContext,例如#application.userName或者#application['userName'],相当于调用ServletContext的getAttribute("username")。

session对象:用来访问HttpSession,例如#session.userName或者#session['userName'],相当于调用session.getAttribute("userName")。

request对象:用来访问HttpServletRequest属性(attribute)的Map,例如#request.userName或者#request['userName'],相当于调用request.getAttribute("userName")。

parameters对象:用于访问HTTP的请求参数,例如#parameters.userName或者#parameters['userName'],相当于调用request.getParameter("username")。

attr对象:用于按page->request->session->application顺序访问其属性。
为何使用EL表达式能够访问valueStack中对象的属性
原因是Struts2对HttpServletRequest作了进一步的封装。简略代码如下:

public class StrutsRequestWrapper extends HttpServletRequestWrapper {
public StrutsRequestWrapper(HttpServletRequest req) {
super(req);
}
public Object getAttribute(String s) {
......
ActionContext ctx = ActionContext.getContext();
Object attribute = super.getAttribute(s);//先从request范围获取属性值
if (ctx != null) {
if (attribute == null) {//如果从request范围没有找到属性值,即从ValueStack中查找对象的属性值
......
ValueStack stack = ctx.getValueStack();
attribute = stack.findValue(s);
......
}
}
return attribute;
}
}
采用OGNL表达式创建List/Map集合对象
如果需要一个集合元素的时候(例如List对象或者Map对象),可以使用OGNL中同集合相关的表达式。
使用如下代码直接生成一个List对象:
<s:set name="list" value="{'zhangming','xiaoi','liming'}" />
<s:iterator value="#list" id="n">
<s:property value="n"/><br>
</s:iterator>

生成一个Map对象:
<s:set name="foobar" value="#{'foo1':'bar1', 'foo2':'bar2'}" />
<s:iterator value="#foobar" >
<s:property value="key"/>=<s:property value="value"/><br>
</s:iterator>

Set标签用于将某个值放入指定范围。
scope:指定变量被放置的范围,该属性可以接受application、session、request、 page或action。如果没有设置该属性,则默认放置在OGNL Context中。
value:赋给变量的值.如果没有设置该属性,则将ValueStack栈顶的值赋给变量。
采用OGNL表达式判断对象是否存在于集合中
对于集合类型,OGNL表达式可以使用in和not in两个元素符号。其中,in表达式用来判断某个元素是否在指定的集合对象中;not in判断某个元素是否不在指定的集合对象中,如下所示。
in表达式:
<s:if test="'foo' in {'foo','bar'}">

</s:if>
<s:else>
不在
</s:else>

not in表达式:
<s:if test="'foo' not in {'foo','bar'}">
不在
</s:if>
<s:else>

</s:else>

分享到:
评论

相关推荐

    光伏短期功率预测-靳晓松-201810211

    光伏短期功率预测是太阳能发电领域中的关键环节,它涉及到对光伏电站未来一段时间内发电能力的...通过精细化的数据处理和科学的预测模型,可以减小预测误差,提高光伏电站的运行效率,并为电力系统的稳定运行提供保障。

    光伏短期功率预测-靳晓松-201810201

    光伏短期功率预测是太阳能发电系统运营中的关键环节,它涉及...通过深入理解光照与功率输出的关系,并精确识别和处理异常数据,可以提升预测的准确性,这对于实现太阳能资源的最大化利用和电力系统的稳定运行至关重要。

    Windows内核实现的34个关键问题

    资源名称:Windows内核实现的34个关键问题资源截图: 资源太大,传百度网盘了,链接在附件中,有需要的同学自取。

    胡晓松:云计算在促进技术与教育深度融合中的作用

    通过云计算,教育者可以打破传统教育模式的局限,创造出更多创新的教学方法和学习体验,使得教育资源的获取更为便捷和高效,同时也为学习者提供了更为个性化和灵活的学习路径。随着云计算技术的不断进步和应用的深入...

    多媒体技术教程 胡晓松等

    为了跟上技术的发展步伐,胡晓松等编著的《多媒体技术教程》应运而生,它不仅为初学者提供了一个全面了解和学习多媒体技术的平台,也为企业技术人才提供了进一步深化和实践的机会。 多媒体技术是集图像、声音、视频...

    1997-2020年各省三废排放量和熵值法计算的环境规制综合指数(无缺失值)

    1997-2020年各省三废排放量和环境规制综合指数(熵值法合成工业三废) 包括30个省份 包括工业二氧化硫排放量、工业烟尘排放量和工业废水排放量 环境规制综合指数是由工业废水排放量、工业 SO2 排放量以及工业烟尘...

    课程设计课程设计课程设计课程设计

    在本次的“课程设计课程设计课程设计课程设计”中,我们将重点探讨编程实践与项目开发的关键知识点,旨在提升学生的编程技能和团队协作能力。通过实际的课程设计,学生将有机会运用所学理论知识解决实际问题,加深对...

    配网自动化建设与运维分析.pdf

    此外,配网自动化的维护方面也存在问题,尤其是在与变电站自动化和调度自动化协调方面工作不到位,导致系统容易出现故障。 3. 配网自动化运维中存在的问题 配网自动化运维是确保配网稳定运行的关键环节。当前运维中...

    DLT 5222-2005 导体和电器选择设计技术规定.pdf

    总的来说,《DLT 5222-2005 导体和电器选择设计技术规定》对电气工程的设计和施工具有深远影响,它的执行有助于提高电力系统的安全性和稳定性,保障电力设施的正常运行,同时也推动了电气工程行业的标准化和规范化。

    1997-2020年各省三废排放量和环境规制综合指数(熵值法合成工业三废)

    1997-2020年各省三废排放量和环境规制综合指数(熵值法合成工业三废) 环境 规制综合指数是由工业废水排放量、工业 SO2 排放量以及工业烟尘排放量计算而来( 表格中有详细的三废排放量及具体计算过程和公式) 具体...

    软件测试原书第2版

    软件测试原书第2版 作者佩腾

    基于WINCC的连铸连轧监控系统的设计及实现.pdf

    基于WINCC的连铸连轧监控系统提高了生产过程的透明度和效率,对于提升CSP生产线的自动化水平和故障响应能力具有重要意义。同时,该系统在教学和科研方面也提供了实践平台,具有较高的实用价值和推广潜力。 参考文献...

    互评-team20-软件需求规格说明书-问题清单1

    《图书管理系统需求规格说明书》是软件开发过程中至关重要的文档,它详细定义了系统应具备的功能、性能、接口和约束等需求。本问题清单主要针对该文档的V1.2版本,旨在识别并解决存在的问题,确保项目的顺利进行。 ...

    产品经理数据分析手册(于晓松).pdf

    数据分析

    基于WINCC的连铸连轧监控系统的设计与实现.pdf

    - **主板插槽**: 4个ISA插槽和2个PCI插槽 - **通讯卡**: MPI、SINECL2或SINECHI(根据需求选择) - **监控画面布局**:如图3所示,CSP连铸连轧生产线监控系统被划分为三个主要区域:顶部显示区、主监控画面区和...

    华为桌面云

    此外,M1的部署和运维效率显著提高,通过集中部署和自动化运维,部署时间缩短至一小时以内,运维效率提升10倍。同时,其多媒体重定向技术确保了高清视频播放的流畅度,提供优质的用户体验。 Desktop Cloud A1和A2是...

    早教面试英文自我介绍精选.doc

    ASCC),这是一个全球控制与自动化领域的顶级会议,从中可以了解到应聘者可能有跨学科的背景,至少在数学和网络研究方面有一定基础,同时,与加州大学河滨分校的林晓松教授学习图论的经历,暗示了其英语能力和对...

    华中科技大学数学与机械学博士生交叉学科创新论坛.pdf

    2. **学习数学和运用数学** - 高小山研究员的报告,展示了如何将数学理论应用于实际问题,如数控加工的时间最优插补算法。 3. **非线性数学物理方程** - 施保昌和甘文峰等教授的研究,讨论了在制造优化和介观格子...

Global site tag (gtag.js) - Google Analytics