【问题标题】:Passing actionListener method names as arguments to include view将 actionListener 方法名称作为参数传递以包含视图
【发布时间】:2013-03-03 08:37:39
【问题描述】:

我正在尝试将操作参数传递给页面中的部分视图,但由于某种原因,它说我的参数是 null,即使它是在外部页面中使用的 bean。

页面:

<ui:include src="/templates/common/ajaxConfirmPopup.xhtml">
    <ui:param name="bean" value="#{paginaBean}" />
    <ui:param name="action" value="deleteAll" />
</ui:include>

在部分中调用动作:

actionListener="#{bean[action]}"

但我得到以下异常:

Caused by: javax.el.PropertyNotFoundException: Target Unreachable, identifier 'bean' resolved to null
    at org.apache.el.parser.AstValue.getTarget(AstValue.java:98) [jbossweb-7.0.13.Final.jar:]
    at org.apache.el.parser.AstValue.invoke(AstValue.java:244) [jbossweb-7.0.13.Final.jar:]
    at org.apache.el.MethodExpressionImpl.invoke(MethodExpressionImpl.java:278) [jbossweb-7.0.13.Final.jar:]

我做错了吗?

注意:当方法有ActionEvent参数时一切正常,当方法没有参数时它不起作用。

【问题讨论】:

  • 原来使用“action”而不是“actionListener”使它工作,这解决了我的问题。我不知道为什么它对 actionListener 不起作用。
  • 如果deleteAll 方法有ActionEvent 参数,你能检查这是否有效?我想我以前有时会遇到这种情况,这解决了问题。当使用 ui:param 传递 bean 时,这样的方法不适用于无参数方法。
  • 是的,id 可以!但我有其他方法作为 actionListeners,它们无需任何参数即可工作。即:如果我不使用包含的视图,则相同的方法适用于 actionListener(并且没有参数)。

标签: jsf-2 facelets


【解决方案1】:

如果您一直在 EL 2.2 语法中声明 actionListener 方法而没有任何参数,则此问题是可以解释的:

actionListener="#{bean.method()}"

这确实需要一个无参数的方法。但是,标准 JSF方式如下

actionListener="#{bean.method}"

它确实需要ActionEvent 参数。您的问题历史确实suggests 一直在使用 EL 2.2 语法,因此您以某种方式认为它是“标准”,而事实并非如此。

当为包含模板参数化 actionListener 方法时,就像在使用 actionListener="#{bean[action]}" 的方法中一样,actionListener 方法被解释为

actionListener="#{bean.method}"

因此需要ActionEvent 参数。

你基本上有 3 个选项来解决这个问题:

  1. 在方法中指定ActionEvent参数,没有任何借口。

  2. actionListener 替换为action。保留方法void是没有问题的。如果例如Eclipse EL 验证混蛋,只需在首选项中tone 即可。

  3. 使用 EL 2.2 语法,如 actionListener="#{bean[action]()}"。然而,这在早期的 Tomcat 和 Glassfish 版本中是 fails

另见:

【讨论】:

    猜你喜欢
    • 2014-02-09
    • 2014-07-14
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-02-23
    • 2013-04-18
    • 1970-01-01
    相关资源
    最近更新 更多