Подтвердить что ты не робот

Как вызвать метод с параметром в JSF

У меня есть страница 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)}


...
Caused by: org.apache.el.parser.ParseException: Encountered "" ( "" ( "" в строке 1, столбец 28. Ожидал один из:
     "}"...
     "...
    " [ "...
    " > "...
    " gt "...
    " & Л; "...
    " lt "...
    " >= "...
    " ge"...
...
...

Самое смешное, что Netbeans может автозаполнять имя метода, поэтому я вижу, что мой backend bean в порядке. Проблема возникает только при вызове метода с параметром.

Любые идеи?

Большое спасибо

4b9b3361

Ответ 1

Аргументы метода передачи были введены в 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>

Если вы этого не сделаете, выберите этот ответ для альтернатив в отношении получения текущей строки в datatables или this ответ в отношении замены реализации EL на тот, который поддерживает передачу аргументов метода, чтобы вы могли использовать его также в контейнерах Servlet 2.5/EL 2.1.

Ответ 2

Jboss Seam также может помочь получить эту функцию.

Seam использует JBoss EL, который обеспечивает расширение стандартного Unified Expression Language (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. Вы просто создаете метод в своей поддержке bean, который возвращает карту, и вы можете использовать JSF EL для передачи любого объекта, который вы хотите использовать для этого метода, потому что JSF думает, что вы передаете ключ на карту.

Между тем, в вашем поддерживающем bean методе вы фактически возвращаете экземпляр карты "imposter", который вообще не является картой, метод get() делегирует метод, который вы хотите вызвать. В вашем файле .xhtml или .jsp вы можете использовать обозначение квадратной скобки для передачи переменной.

Расширение HashMap - один из способов упростить определение карты самопомощи - достаточно кратким, чтобы таким образом использовать анонимный внутренний класс.

Это взлом, но в прошлом он работал хорошо для меня.