Как использовать статические методы в EL?

Я работаю в jsp. bean.getConfigurationActionButtonBar() возвращает список объектов кнопки. WebUtils.getActionButtonBar(List buttonList) берет этот список и возвращает сгенерированный HTML. Очень простой.

Теперь по какой-то причине это не работает:

<td colspan="2">
    ${WebUtils.getActionButtonBar(bean.getConfigurationActionButtonBar())}
</td>

Список кнопок настроен. Что-то не так с вызовом статического WebUtils.getActionButtonBar. Этот звонок просто никогда не делается. Любая идея?


person jacekn    schedule 23.03.2012    source источник


Ответы (1)


Вам нужно объявить его как функцию EL и зарегистрировать в отдельной taglib.

Сначала создайте /WEB-INF/functions.tld файл:

<?xml version="1.0" encoding="UTF-8" ?>
<taglib 
    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-jsptaglibrary_2_1.xsd"
    version="2.1">

    <display-name>Custom Functions</display-name>    
    <tlib-version>1.0</tlib-version>
    <uri>http://example.com/util</uri>

    <function>
        <name>getActionButtonBar</name>
        <function-class>com.example.WebUtils</function-class>
        <function-signature>java.lang.String getActionButtonBar(java.util.List)</function-signature>
    </function>
</taglib>

Тогда вы можете использовать его следующим образом:

<%@taglib uri="http://example.com/util" prefix="util" %>
...
${util:getActionButtonBar(bean.getConfigurationActionButtonBar())}

Однако вы идете совершенно неверным путем в достижении конкретных функциональных требований. HTML должен создаваться файлами JSP, а не необработанным кодом Java. Вместо этого используйте включаемый файл JSP или файл тегов.

person BalusC    schedule 23.03.2012
comment
Что ж, я не пойду по ложному пути. Это был вызов статического метода, который собирает html в StringBuilder и выплевывает его. Типичная логика настраиваемого тега. Я просто хотел увидеть, что я получу, еще до того, как начну добавлять это в поддержку настраиваемых тегов. Я был сбит с толку, почему jstl не смог до него добраться. Ваш ответ говорит мне, что jstl ничего не знает о классе WebUtils или его методах. Я не пробовал настроить вашу функцию, потому что предпочитаю придерживаться своего настраиваемого тега tld и уже переместил туда этот код. Спасибо за ваш вклад. - person jacekn; 24.03.2012
comment
Только Java может запретить интуитивно понятное трехстрочное решение в пользу избыточного 17-строчного определения и назвать это прогрессом. - person Magnus; 18.08.2012