Spring和JSF集成:国际化和本地化

如果您正在开发针对多种语言的JSF应用程序,那么您可能很熟悉<f:loadBundle>标记。 即使您的应用程序不支持使用消息包的国际化仍然是一个好主意。 在<f:loadBundle>标记下,它从Java java.util.ResourceBundle中读取消息,尽管这可以工作,但Spring开发人员通常更喜欢org.springframework.context.MessageSource接口。

作为<f:loadBundle>的替代方案,我一直在开发一个新的<s:messageSource>组件,该组件可用于公开来自任何Spring MessageSource的消息,并提供其他一些优点。

新组件是<f:loadBundle>的直接替代。

<s:messageSource source="#{messageSource}" var="messages"/>
<p><h:outputText value="#{messages.hello}"/>
</p>

source属性可以是任何解析为MessageSource实例的EL表达式。 如果未指定源,则将使用Spring ApplicationContextvar属性是将用于访问消息的变量的名称。

与标准JSF不同,要加载的消息的密钥将根据要呈现的页面的ID构建。 例如,假设上面的页面来自文件WEB-INF / pages / messages / simple.xhtml ,则用于加载问候消息的键将为pages.messages.simple.hello 。 使用这些复合键可以防止消息键冲突,并使页面标记清晰美观。 如果需要,可以使用prefix属性覆盖此行为。

如果您在XHTML中引用了忘记定义的消息,则将看到警告消息(在开发中),或者将引发异常(在生产中)。

与标准JSF一样,您的消息并包含与<h:outputFormat>一起使用的占位符

pages.message.simple.welcome=Welcome to {1} with {0}
<h:outputFormat value="#{messages.welcome}"><f:param value="Spring"/><f:param value="JSF"/>
</h:outputFormat>

<h:outputFormat>标签有点冗长,因此为了方便起见,Spring消息可以用作Map 。 这使您可以更简洁地引用占位符:

<h:outputText value="#{messages.welcome['Spring']['JSF']}"/>

相同的语法允许您将Java对象映射到消息。 默认情况下,对象是通过从类名称构建消息键来映射的。 例如,以下类:

package org.example;
public class ExampleObject {
}

可以在JSF中引用:

<h:outputText value="#{messages[exampleInstance]}"/>

解决以下消息:

org.example.ExampleObject=example

对于枚举对象,消息键包括枚举名称和类:

package org.example;
public enum ExampleObject {ONE, //mapped to message key org.example.ExampleObject.ONETWO  //mapped to message key org.example.ExampleObject.TWO
}

对象消息还可以引用应构成消息一部分的属性:

org.example.PersonName=Name is {first} {last}
...package org.example;
public class PersonName {...public String getFirst() {...}public String getLast() {...}
}

您还可以通过使用实现org.springframework.springfaces.message.ObjectMessageSource接口的消息源来定义自己的对象消息策略。

如果要检查其中的任何代码,请查看GitHub Project中的org.springframework.springfaces.messageorg.springframework.springfaces.message.ui软件包。

参考: Phil Webb博客博客中来自我们JCG合作伙伴 Phillip Webb的Spring和JavaServer Faces集成:国际化和本地化 。


翻译自: https://www.javacodegeeks.com/2012/06/spring-jsf-integration.html

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/372681.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

一个实用的却被忽略的命名空间:Microsoft.VisualBasic:

当你看到这个命名空间的时候&#xff0c;别因为是vb的东西就匆忙关掉网页&#xff0c;那将会是您的损失&#xff0c;此命名空间中的资源最初目的是为了简化vb.net开发而创建的&#xff0c;所以microsoft.visualbasic并不属于system命名空间&#xff0c;而是独立存在的。虽然是为…

Linux基础之命令练习Day2-useradd(mod,del),groupadd(mod,del),chmod,chown,

作业一&#xff1a; 1) 新建用户natasha&#xff0c;uid为1000&#xff0c;gid为555&#xff0c;备注信息为“master” 2) 修改natasha用户的家目录为/Natasha 3) 查看用户信息配置文件的最后一行 4) 为natasha用户设置密码“123” 5) 查看用户密码配置文件的最后一行 6) 将nat…

动态表单,JSF世界早已等待

新的PrimeFaces扩展版本0.5.0带来了新的DynaForm组件。 通常&#xff0c;如果知道行/列的数量&#xff0c;元素的位置等&#xff0c;则可以通过h&#xff1a;panelGrid或p&#xff1a;panelGrid来构建非常简单的表单。 对于静态表单&#xff0c;这是正确的。 但是&#xff0c;如…

C# 定时器事件(设置时间间隔,间歇性执行某一函数,控制台程序)

定时器事件代码 static void Main(string[] args) {Method();#region 定时器事件 Timer aTimer new Timer();aTimer.Elapsed new ElapsedEventHandler(TimedEvent);aTimer.Interval seconds * 1000; //配置文件中配置的秒数aTimer.Enabled true;#endregionstring strLi…

总结get和post区别

参考博文&#xff1a;   浅谈HTTP中Get与Post的区别 1. 数据传递方向&#xff1a; Get是向服务器发索取数据的一种请求&#xff0c;Post是向服务器提交数据的一种请求 &#xff08;都是请求&#xff0c;并不是一个取一个发&#xff09; Get&#xff1a;①用于获取信息&#x…

Vmware安装Centos NAT方式设置静态IP

【Vmware中在搭建集群环境等&#xff0c;DHCP自动获取IP方式不方便&#xff0c;为了固定IP减少频繁更改配置信息&#xff0c;建议使用静态IP来配置&#xff0c;网络连接主要有三种方式 1.nat 2.桥接&#xff0c;3主机模式 &#xff0c;在这里主要介NAT方式&#xff0c; 为什么使…

1 TB /节点时快速,可预测且高度可用

世界正每秒从移动设备&#xff0c;Web和各种小工具向应用程序推送大量数据。 如今&#xff0c;更多的应用程序必须处理此数据。 为了保持性能&#xff0c;这些应用程序需要快速访问数据层。 在过去的几年中&#xff0c;RAM价格下降了&#xff0c;我们现在可以便宜得多地获得具有…

java jni 内存_Android开发之JNI内存模型

Java 与JNI 内存管理是怎样的想要弄清楚Java与JNI的内存管理的关系&#xff0c;首先要弄清楚JVM的内存模型JVM内存模型.png其中本地方法栈就是运行时调用native 方法的数据保存区。本地方法栈的大小可以设置成固定的或者是动态扩展。Java中的内存泄露JAVA 编程中的内存泄漏&…

04 linux用户群组和权限

作业一&#xff1a; 1)新建用户natasha&#xff0c;uid为1000&#xff0c;gid为555&#xff0c;备注信息为“master” 2)修改natasha用户的家目录为/Natasha 3)查看用户信息配置文件的最后一行 4)为natasha用户设置密码“123” 5)查看用户密码配置文件的最后一行 6)将natasha用…

基于 CoreText 实现的高性能 UITableView

引起UITableView卡顿比较常见的原因有cell的层级过多、cell中有触发离屏渲染的代码&#xff08;譬如&#xff1a;cornerRadius、maskToBounds 同时使用&#xff09;、像素是否对齐、是否使用UITableView自动计算cell高度的方法等。本文将从cell层级出发&#xff0c;以一个仿朋友…

RESTEasy教程第1部分:基础

RESTEasy是JBoss / RedHat的JAX-RS实现&#xff0c;内置于JBoss 6之后。 在这里&#xff0c;我将向您展示如何使用RESTEasy和JBossAS7.1.1.FINAL开发一个简单的RESTful Web服务应用程序。 步骤1&#xff1a;使用Maven配置RESTEasy依赖项。 <project xmlnshttp:maven.apache.…

php函数相关函数,PHP数组相关函数汇总

这篇文章主要介绍了PHP数组相关函数,汇总说明了php中相关的数组,具有一定参考借鉴价值,需要的朋友可以参考下本文总结了PHP数组相关的函数。分享给大家供大家参考。具体如下&#xff1a;这里包括函数名和用法说明&#xff0c;没有详细的代码范例。感兴趣的朋友可以查阅本站相关…

Web Magic 总体架构

1.2 总体架构 WebMagic的结构分为Downloader、PageProcessor、Scheduler、Pipeline四大组件&#xff0c;并由Spider将它们彼此组织起来。这四大组件对应爬虫生命周期中的下载、处理、管理和持久化等功能。WebMagic的设计参考了Scapy&#xff0c;但是实现方式更Java化一些。 而S…

L1-006. 连续因子

一个正整数N的因子中可能存在若干连续的数字。例如630可以分解为3*5*6*7&#xff0c;其中5、6、7就是3个连续的数字。给定任一正整数N&#xff0c;要求编写程序求出最长连续因子的个数&#xff0c;并输出最小的连续因子序列。 输入格式&#xff1a; 输入在一行中给出一个正整数…

基于Java JAAS表单的身份验证

使用JAAS实现登录模块是一个高级主题&#xff0c;而且大多数开发人员也很少有机会参与这种开发。 但是JAAS登录模块的基本实现并不是那么困难&#xff0c;这是因为我打算将其发布。 在这里&#xff0c;我正在解释如何实现tomcat管理的身份验证模块。 此实现与容器无关。 我们可…

java自动投票代码,Java 投票(自动添一)

Java 投票(自动加一)数据库建立&#xff1a;SQL> create table vote(2 id number,3 name varchar(200),4 num number5 );//index.jsppageEncoding"utf-8"%>投票Connection conn1 null;Statement stmt1 null;ResultSet rs1 null;try {Class.forName("or…

SpringMVC搭建+实例

想做一点自己喜欢的东西&#xff0c;研究了一下springMVC,所以就自己搭建一个小demo,可供大家吐槽。 先建一个WEB工程&#xff0c;这个相信大家都会&#xff0c;这里不在多说。去网上下载spring jar包&#xff0c;然后在WEB-INF下新建一个lib文件&#xff0c;将下载的jar包放进…

Mockito和Hamcrest的试驾制造商

过去&#xff0c;很多人问我是否测试吸气剂和吸气剂&#xff08;属性&#xff0c;属性等&#xff09;。 他们还问我是否测试我的建筑商。 在我看来&#xff0c;答案取决于情况。 当使用遗留代码时&#xff0c;我不会费心去测试数据结构&#xff0c;这意味着对象只带有getter和s…

php8更新,PHP 8 中新特性以及重大调整

PHP 8&#xff0c;PHP 的一个新的大版本&#xff0c;预计将于2020年12月3日发布&#xff0c;这意味着将不会有 PHP 7.5 版本。PHP8目前正处于非常活跃的开发阶段&#xff0c;所以在接下来的几个月里&#xff0c;情况可能会发生很大的变化。在这篇文章中&#xff0c;我会维持一个…

Javascript学习之函数(function)

http://www.cnblogs.com/royalroads/p/4418587.html 在JS中,Function(函数)类型实际上是对象;每个函数都是Function类型的实例&#xff0c;而且都与其他引用类型一样具有属性和方法。由于函数是对象,因此函数名实际上也是一个指向函数对象的指针。 一 函数的声明方式 //1.函数声…