web-dev-qa-db-ja.com

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)}"構文解析エラー:#{backedBean.updateContents(dContent)}
...
...
原因:org.Apache.el.parser.ParseException:行1、列28で ""( ""( ""に遭遇しました。
"}" ...
"。" ...
"[" ...
">" ...
"gt" ...
"<" ...
"lt" ...
"> =" ...
"ge" ...
...
...

おもしろいことに、Netbeansはメソッド名をオートコンプリートできるので、バックエンドBeanは大丈夫だと思います。この問題は、パラメーターを指定してメソッドを呼び出す場合にのみ発生します。

何か案は?

どうもありがとう

23
Neos76

メソッド引数の受け渡しはEL 2.2で導入されました。したがって、これは、Tomcat 7、Glassfish 3、JBoss AS 6などのサーブレット3.0/EL 2.2対応のコンテナで実行している場合にのみ可能ですandきみの 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コンテナでも使用できるようにします。

39
BalusC

Jboss Seamはこの機能の取得にも役立ちます。

Seamは、標準の統一表現言語(EL)の拡張を提供するJBoss 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で正常に機能します。

3

実際、JSF 1.0以降、これを行うための「ハック」方法がありました。 Mapを返すメソッドをバッキングBeanで作成するだけで、JSF ELを使用して、そのメソッドに任意のオブジェクトを渡すことができます。JSFは、キーをマップに渡すと考えているためです。

一方、バッキングBeanメソッドでは、実際にはまったくマップではない「偽者」マップインスタンスを返します。このインスタンスは、get()メソッドが呼び出したいメソッドに委任します。 .xhtmlまたは.jspファイルでは、角括弧表記を使用して変数を渡すことができます。

HashMapを拡張することは、詐欺師のマップを簡単に定義できるようにする1つの方法です。そのように匿名の内部クラスを使用するのに十分な簡潔さです。

これはハックですが、過去に私にとってはうまく機能しました。

1
Michael Lucas