2011-03-11 52 views
20

我有一個顯示文件夾內容(實際上是Dropbox的帳戶內容)的JSF頁面。如何使用JSF中的參數調用方法

我使用一個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)}" Error Parsing: #{backedBean.updateContents(dContent)}
...
...
Caused by: org.apache.el.parser.ParseException: Encountered " "(" "("" at line 1, column 28. Was expecting one of:
"}" ...
"." ...
"[" ...
">" ...
"gt" ...
"<" ...
"lt" ...
">=" ...
"ge" ...
...
...

有趣的是, Netbeans能夠自動完成方法名稱,所以我認爲我的後端bean是可以的。只有當我使用參數調用方法時纔會出現問題。

任何想法?

非常感謝

回答

38

在EL 2.2中引入了傳遞方法參數。所以這隻有在運行於Tomcat 7,Glassfish 3,JBoss AS 6等支持Servlet 3.0/EL 2.2的容器時纔可能。您的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容器。

+0

非常感謝,我剛纔在調查,可能原因是我的容器(tomcat6)不支持這個功能。事實上,在glassfish v3上部署應用程序時,錯誤消失。非常感謝。 – Neos76 2011-03-11 14:34:09

+0

請注意:我讀過JSF 2.0中支持的方法參數,Netbeans允許我使用tomcat 6和JSF 2.0支持來配置此應用程序。 JSF 2.0和EL 2.2在某些方面相關嗎? – Neos76 2011-03-11 14:37:55

+1

這不是一個JSF 2.0功能。這是一個EL 2.2。特徵。 JSF 2.0與Java EE 6捆綁在一起,後者又捆綁了Servlet 3.0/EL 2.2。所以它*看起來像* JSF 2.0功能。但是,JSF 2.0向後兼容Java EE 5,後者又捆綁了Servlet 2.5/EL 2.1,但EL 2.1不支持這一點。 – BalusC 2011-03-11 14:52:52

3

Jboss Seam也可以幫助獲得該功能。

Seam使用JBoss EL,它提供了對標準統一表達式語言(EL)的擴展。 JBoss EL提供了許多增強功能,增加了EL表達式的表現力和強大功能。

實施例:

通用單引號的文字串: <h:commandLink action="#{printer.println('Hello world!')}" value="Hello"/>

或 用於動態值 <h:commandButton action="#{hotelBooking.bookHotel(hotel)}" value="Book Hotel"/>

限制:

的JBoss EL目前不能用JSP使用2.1,因爲編譯器拒絕帶有參數的表達式。所以,如果你想在JSF 1.2中使用這個擴展,你將需要使用Facelets。該擴展與JSP 2.0正常工作。

+0

它的工作原理:我使用Seam 2.2.0.GA,在JBoss 4.2.3.GA和richfaces 3.3.3.Final:我的代碼工作:rendered =「#{bean.method(StringArgument)}」 – 2017-05-05 16:24:45

1

自從JSF 1.0以來,實際上已經有了這樣做的「黑客」方法。您只需在支持bean上創建一個返回Map的方法,並且您可以使用JSF EL將所需的任何對象傳遞給該方法,因爲JSF認爲您將密鑰傳遞給了地圖。

同時,在你的支持bean方法中,你實際上返回一個「冒充者」地圖實例,它根本不是一張真正的地圖,其方法委託給你想調用的方法。在.xhtml或.jsp文件中,您可以使用方括號表示法來傳遞變量。

擴展HashMap是使冒名頂圖容易定義的一種方法 - 簡潔到足以使用匿名內部類的方式。

這是一個黑客攻擊,但它在過去對我很有幫助。