Как вызвать метод с параметром в 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 в порядке. Проблема возникает только при вызове метода с параметром.
Любые идеи?
Большое спасибо
Ответы
Ответ 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
- один из способов упростить определение карты самопомощи - достаточно кратким, чтобы таким образом использовать анонимный внутренний класс.
Это взлом, но в прошлом он работал хорошо для меня.