将支持 bean 操作传递给 Facelet 标记文件

Posted

技术标签:

【中文标题】将支持 bean 操作传递给 Facelet 标记文件【英文标题】:Passing backing bean action to Facelet tag file 【发布时间】:2012-05-12 07:17:46 【问题描述】:

在我的 JSF 1.2 项目中,我创建了一个 facelet 标记文件并定义了一个具有 actionListener 属性的 inputText,我需要将支持 bean 方法名称传递给该属性。 我尝试在标签文件中定义一个变量 actionListener="#actionListener" 。在我调用组件的 xhtml 中,当我将值传递为

actionListener="#myBean.preFillData"

标签文件将其视为一个属性,并且错误指示未找到属性“preFillData”。如果我将其更改为

actionListener="#myBean.preFillData()"

然后标记文件中存在解析错误,因为它不喜欢括号来指示方法名称。

我们如何将方法名传递给标签文件?

谢谢 时间

【问题讨论】:

【参考方案1】:

标签文件不支持传递方法表达式。只有从 JSF 2.0 开始,才有可能使用所谓的复合组件。

您可以做的是将 bean 引用和方法名称分开,以便您可以使用大括号表示法来调用方法。我只是不确定这是否适用于 actionListener,您通常不会使用它来调用操作,但它肯定适用于 action

例如

<my:tag ... bean="#myBean" actionMethod="preFillData" />

里面有tag.xhtml

<h:commandButton ... action="#bean[actionMethod]" />

仅当您碰巧在 Facelets 上使用 JSF 2.0 时,您才能使用 &lt;o:methodParam&gt; 将方法表达式传递给标记文件。另见 a.o. Dynamic ui include and commandButton.

【讨论】:

谢谢@Balusc。很高兴知道 JSF 1.2 的限制和一个升级的理由:) 关于您对通常不用于调用操作的 actionListener 的评论,我有一个案例,其中 2 个文本框的值(邮政编码和扩展名)需要在调用另存为之前合并到我的域对象中的单个属性中我的行动。这种合并是否也应该在 action 方法而不是 actionListener 中完成? 啊,有道理。但是为什么不直接在标签文件中声明呢?它似乎是一个可重用的 ActionListener 实现,不一定需要引用 bean 方法。 很抱歉,当你说“你为什么不直接在标签文件中声明它”时,我没有得到你。能详细点吗? @BalusC 在这个例子中如果beanactionMethod 没有值——空值怎么办?有没有办法在客户端进行分析?

以上是关于将支持 bean 操作传递给 Facelet 标记文件的主要内容,如果未能解决你的问题,请参考以下文章

Apache Shiro,无法将值从登录表单传递到支持 bean

p:fileUpload 未在支持 bean 中设置上传的文件 [重复]

将输入文本值传递给 bean 方法,而不将输入值绑定到 bean 属性

如何将 JSF 托管 bean 属性传递给 JavaScript 函数?

Java:如何将值从类/bean传递给servlet

Spring Batch:如何将 jobParameters 传递给自定义 bean?