Как вызвать метод с параметром в 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)}
...
...
Вызвано: org.apache.el.parser.ParseException: Обнаружено " "(" "( "" в строке 1, столбец 28. Ожидалось одно из:
"}"...
""...
"["...
">"...
"GT"...
"<"...
"лт"...
"> ="...
"гэ"...
...
...
Самое смешное, что Netbeans может автозаполнять имя метода, поэтому я представляю, что мой бэкэнд-бин в порядке. Проблема возникает только тогда, когда я вызываю метод с параметром.
Есть идеи?
Большое спасибо
3 ответа
Передача аргументов метода была введена в 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 контейнеры, а также.
Jboss 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.
На самом деле существует "хакерский" способ сделать это с JSF 1.0. Вы просто создаете метод на своем компоненте поддержки, который возвращает Map, и вы можете использовать JSF EL для передачи любого объекта, который вы хотите этому методу, потому что JSF считает, что вы передаете ключ на карту.
Между тем, в вашем методе backing bean вы на самом деле возвращаете "самозваный" экземпляр карты, который на самом деле не является картой, чей get()
метод делегирует метод, который вы хотите вызвать. В вашем файле.xhtml или.jsp вы можете использовать квадратную скобку для передачи переменной.
простирающийся HashMap
это один из способов сделать карту самозванца легкой для определения - достаточно краткой, чтобы таким образом использовать анонимный внутренний класс.
Это взлом, но в прошлом он работал хорошо для меня.