Как вызвать метод с параметром в JSF - PullRequest
23 голосов
/ 11 марта 2011

У меня есть страница 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: Encountered "" ("" ("" в строке 1, столбец 28. Ожидал одного из:
"}" ...
"." ...
"[" ...
">" ...
"gt" ...
"<" ... <br>"lt" ...
"> =" ...
"ge" ...
...
...

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

Есть идеи?

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

Ответы [ 3 ]

39 голосов
/ 11 марта 2011

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

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

3 голосов
/ 07 января 2013

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.

1 голос
/ 14 декабря 2015

На самом деле, с JSF 1.0 был "хакерский" способ сделать это.Вы просто создаете метод на своем компоненте поддержки, который возвращает Map, и вы можете использовать JSF EL для передачи любого объекта в этот метод, так как JSF думает, что вы передаете ключ на карту.

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

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

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...