将支持 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 时,您才能使用 <o:methodParam>
将方法表达式传递给标记文件。另见 a.o. Dynamic ui include and commandButton.
【讨论】:
谢谢@Balusc。很高兴知道 JSF 1.2 的限制和一个升级的理由:) 关于您对通常不用于调用操作的 actionListener 的评论,我有一个案例,其中 2 个文本框的值(邮政编码和扩展名)需要在调用另存为之前合并到我的域对象中的单个属性中我的行动。这种合并是否也应该在 action 方法而不是 actionListener 中完成? 啊,有道理。但是为什么不直接在标签文件中声明呢?它似乎是一个可重用的ActionListener
实现,不一定需要引用 bean 方法。
很抱歉,当你说“你为什么不直接在标签文件中声明它”时,我没有得到你。能详细点吗?
@BalusC 在这个例子中如果bean
或actionMethod
没有值——空值怎么办?有没有办法在客户端进行分析?以上是关于将支持 bean 操作传递给 Facelet 标记文件的主要内容,如果未能解决你的问题,请参考以下文章
Apache Shiro,无法将值从登录表单传递到支持 bean
p:fileUpload 未在支持 bean 中设置上传的文件 [重复]
将输入文本值传递给 bean 方法,而不将输入值绑定到 bean 属性