首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >JSF: commandLink作为outputFormat的参数

JSF: commandLink作为outputFormat的参数
EN

Stack Overflow用户
提问于 2009-07-30 09:08:30
回答 3查看 2.7K关注 0票数 4

我正在国际化一些JSF文件,因此正在对字符串进行外部化(以及使用占位符连接字符串)。我几乎没有使用JSF的经验(今天和昨天),所以请原谅,如果我的问题有一个明显的答案!

对于简单的占位符,我已经成功地使用了h:outputFormat标记(和f:param标记),但是现在我想用commandLink组件替换占位符。

代码语言:javascript
复制
<h:outputFormat value="#{adminMsgs.scheduleUpdateLink} ">
    <h:commandLink value="#{adminMsgs.update}" action="refresh" />
</h:outputFormat>

属性文件:

代码语言:javascript
复制
scheduleUpdateLink = After waiting a few seconds, please {0} the page.
update = update

并按照以下方针进行产出:

代码语言:javascript
复制
After waiting a few seconds, please <a href="#" class="..." onclick="...;return false;">update</a> the page.

这不起作用(更新链接出现在'scheduleUpdateLink‘文本之前),有人知道我会怎么做吗?

提前谢谢。

编辑/更新

谢谢你的回复McDowell -非常有用,但仍然没有完全解决我的问题。我还需要对输入框(h:inputText)进行同样的操作,而且在一个资源字符串中也可能存在多个占位符。因此,我不能保证,比方说阿拉伯语的顺序是一样的。

如果我使用了一个Java函数;您知道我是否可以以字符串的形式传递JSF标记,例如<h:outputFormat value=..。并使用faces上下文获取呈现的HTML,然后我可以将其插入到相应的占位符中,并以普通HTML的形式返回?或者其他类似的想法?

干杯。

EN

回答 3

Stack Overflow用户

回答已采纳

发布于 2009-07-30 10:23:46

据我所知,H:输出格式标记将只使用f:param子元素作为参数。

如果消息是一个链接(而不是一个H:命令链接),您可以使用HTML文本:

代码语言:javascript
复制
<h:outputFormat escape="false" 
    value="...seconds, please &lt;a href='etc..." />.

我不建议通过这样做来模仿h:commandLink。也许可以在第三方图书馆中找到一个更丰富的h:命令链接版本,它完全可以实现您想要的功能。

将字符串分成两部分是可能的,但这会使翻译人员的生活变得困难,翻译质量可能会受到影响(尤其是如果您经常这样做的话)。

我会考虑使用这样的自定义函数:

代码语言:javascript
复制
<f:loadBundle basename="i18n.I18n" var="bundle" />
<h:outputText value="#{i18n:fragment(bundle.scheduleUpdateLink, 0)}" />
<h:commandLink>
  <h:outputText value="#{bundle.update}" />
</h:commandLink>
<h:outputText value="#{i18n:fragment(bundle.scheduleUpdateLink, 1)}" />

呈现的输出的形式如下:

代码语言:javascript
复制
After waiting a few seconds, please <script type="text/javascript"><!--
    /*JavaScript elided*/
//-->
</script><a href="#"
      onclick="return oamSubmitForm('someClientId');">update</a> the page.

函数由一个静态方法支持,该方法拆分字符串并返回请求的片段:

代码语言:javascript
复制
public static String fragment(String string, int index) {
  // TODO: regex probably not complete; ask stackoverflow!
  // see http://java.sun.com/javase/6/docs/api/java/text/MessageFormat.html
  final String regex = "\\{\\d.*?\\}";
  String[] fragments = string.split(regex, index + 2);
  return fragments[index];
  // TODO: error handling
}

取决于您的视图技术(Facelets或JSP),函数声明略有不同:

编辑:基于更多信息

JSF采用声明式方法来构建接口。您需要一个动态UI,并根据其子用户在翻译后的字符串中显示的顺序进行排序。这两件事是不一致的,但并非都失去了。

有几种方法可以解决这个问题。

  • 重新设计UI以使用上面的文本,下面的输入/控制表(流行的表单方法)。这是最简单的解决方案,但可能不会让您的UI设计人员高兴。
  • 使用面板上的绑定属性创建并以编程方式对所有内容进行排序。这可能意味着支持bean中有很多重复的代码。
  • 编写一个可重用的自定义控件,它可能如下所示:

代码语言:javascript
复制
<ed:formatPane string="click {0} after filling in forename {1} and surname {2}">
   <h:commandLink value="#{bundle.linkMsg}" />
   <h:inputText value="#{bean.prop1}" />
   <h:inputText value="#{bean.prop2}" />
</ed:formatPane>

只需替换h:outputFormat以支持任意的子控件(而不是创建一个完整的自定义控件)可能(而且工作量较少)是可能的,但我反对它,因为它可能会导致长期维护过程中的混乱。

有人可能已经写了一个定制的控件来做我建议的事情(这很难是一个原创的想法)。

票数 6
EN

Stack Overflow用户

发布于 2009-07-30 09:29:58

为了让JSF正确地呈现纯文本,它必须由生成(有一些模糊的技术原因)。我会用一个outputText、一个commandLink和一个outputText来完成这个任务。

一般来说,在处理JSF时,一切都必须是标记,而不是纯文本。

方便的参考资料:http://exadel.com/tutorial/jsf/jsftags-guide.html

票数 0
EN

Stack Overflow用户

发布于 2009-07-30 10:21:08

为了解决你的问题,你可以用代替,就像Thorbj rn说的。

基本上,您的代码和属性文件如下所示:

代码语言:javascript
复制
<h:outputText value="#{adminMsgs.scheduleUpdateLink1}" />
<h:commandLink value="#{adminMsgs.update}" action="refresh" />
<h:outputText value0"#{adminMsgs.scheduleUpdateLink2}" />

属性文件如下所示:

代码语言:javascript
复制
scheduleUpdateLink1 = After waiting a few seconds, please
update = update
scheduleUpdateLink2 = the page.

我认为outputFormat不适用于UiComponents,而只适用于文本。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/1205386

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档