如何在JSF中调用带参数的方法

时间:2011-03-11 13:50:27

标签: jsf jsf-2

我有一个显示文件夹内容的JSF页面(实际上它是一个Dropbox的帐户内容)。

我正在使用dataTable来呈现ListArray对象的内容:

<h:dataTable style="text-align: left" width="600" var="dContent" value="#{backedBean.contents}">
  <h:column>
    <f:facet name="header">
      <f:verbatim>NAME</f:verbatim>
    </f:facet>
    <h:commandButton value="#{dContent.fileName}" action="#{backedBean.updateContents(dContent)}"/>
  </h:column>
  <h:column>
    <f:facet name="header">
      <f:verbatim>SIZE</f:verbatim>
    </f:facet>
    <h:outputText value="#{dContent.size}"/>
  </h:column>
</h:dataTable>

但是当我运行此页面时,我收到以下错误:

  

/browse.xhtml @ 34,110 action =“#{backedBean.updateContents(dContent)}”   错误解析:#{backedBean.updateContents(dContent)}
...

  ...由以下原因引起:org.apache.el.parser.ParseException:遇到“   “(”“”(“”第1栏第28栏。期待以下之一:
      “}”...
      “” ...
      “[”...
      “&gt;” 中...
      “gt”......
      “&LT;” ...
      “lt”......
      “&gt; =”...
      “ge”...
...
...

有趣的是,Netbeans能够自动填充方法名称,因此我想象我的后端bean是可以的。仅当我使用参数调用方法时才会出现此问题。

有什么想法吗?

非常感谢

2 个答案:

答案 0 :(得分:39)

传递方法参数在EL 2.2中引入。因此,只有在运行支持Servlet 3.0 / EL 2.2的容器(如Tomcat 7,Glassfish 3,JBoss AS 6等)时,才能实现这一目的。web.xml已被声明为Servlet 3.0规范。

<?xml version="1.0" encoding="UTF-8"?>
<web-app version="3.0" 
    xmlns="http://java.sun.com/xml/ns/javaee" 
    xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" 
    xsi:schemaLocation="http://java.sun.com/xml/ns/javaee http://java.sun.com/xml/ns/javaee/web-app_3_0.xsd"
>
    <!-- Config here -->
</web-app>

如果不是,请检查this answer以获取有关获取数据表中当前行的替代方法,或this answer关于将EL实现替换为支持传递方法参数的方法,以便您也可以在Servlet 2.5 / EL 2.1容器上使用它。

答案 1 :(得分:1)

自JSF 1.0以来,实际上有一种“黑客”方式。您只需在您的支持bean上创建一个返回Map的方法,您就可以使用JSF EL将任何对象传递给该方法,因为JSF认为您将密钥传递给了地图。

同时,在你的支持bean方法中,你实际上返回一个根本不是地图的“冒名顶替”地图实例,其get()方法委托给你想要调用的方法。在.xhtml或.jsp文件中,您可以使用方括号表示法传递变量。

扩展HashMap是使冒名贴图易于定义的一种方法 - 简洁到足以使用匿名内部类。

这是一个黑客,但它在过去对我有用。