Вызов метода в EL - PullRequest
       28

Вызов метода в EL

5 голосов
/ 28 марта 2009

Когда я пишу веб-приложения на Java, я обычно использую теги JSTL. Я думаю, что эти теги хороши, за исключением одной вещи, которая меня бесит: хотя язык выражений позволяет вам получать доступ к свойствам бина, он не позволяет вам вызывать его методы.

В версии 1.0 даже не было возможности получить длину строки или количество элементов в коллекции. Начиная с версии 1.1, была добавлена ​​функция fn: length, так что вы можете делать такие вещи как:

...
<%@ taglib prefix="fn" uri="http://java.sun.com/jsp/jstl/functions" %>
...
<c:if test="${fn:length(str) > 10}">
    ...
</c:if>
...

Что более многословно и более некрасиво (ИМХО), чем:

...
<c:if test="${str.length() > 10}">
    ...
</c:if>
...

Похоже, что JSTL 2.0 позволит вам определять новые функции, но вам нужно будет написать класс специально для этой цели, в котором вы будете определять свои (статические) методы, а также вам нужно будет написать файл TLD. это будет включено в каждый jsp, который будет использовать эти функции.

Независимо от того, определяете ли вы пользовательскую функцию или используете другой обходной путь, вам нужно написать много дополнительного кода.

Я где-то читал, что JCP добровольно запретил вызов методов из языка выражений.

Может кто-нибудь из вас помочь мне понять, почему, черт возьми, JCP делает это с нами?

Ответы [ 4 ]

4 голосов
/ 29 марта 2009

Может кто-нибудь из вас помочь мне понять, почему, черт возьми, JCP делает это с нами?

Это часть рабства и дисциплины мышления определенного подмножества Java-программистов, которые знают Единый Истинный Путь, что каждый должен создавать приложения.

Нельзя доверять, что при написании шаблонов в вашем распоряжении полнофункциональный язык, потому что вы можете злоупотреблять им, чтобы смешивать бизнес-логику и представление, как это делают эти ужасные, неуклюжие программисты PHP. Эх, представь!

Программист является врагом, и от него не должно быть зла. Может оказаться, что программист на самом деле просто пытается что-то отладить, или быстро взломает приложение, чтобы временно запустить приложение. Или может оказаться, что существует такая вещь, как логика представления, и заставить вас переместить эти вещи в набор классов тегов и bean-компонентов в вашем приложении так же неприятно, как и наоборот.

Но это не имеет значения! Стоит побеспокоить вас ради защиты целомудрия Java.

[Извините за снарка, но это был уже довольно странный вопрос, ах.]

PS. Наверное, всегда есть Groovy.

3 голосов
/ 28 марта 2009

Требуемая функция определена в JSR 245 ( больше здесь ). Если вы хотите его сейчас, скачайте его из проекта UEL или альтернативной реализации (например, JUEL ). Если вам нужно подождать, пока он станет частью стандарта, он будет включен в JEE6. До тех пор ... ну, вы уже знаете свои варианты.

2 голосов
/ 29 марта 2009

Посмотрите на Шов ! С Seam EL стал таким, каким должен быть. Вызов методов даже с параметрами работает очень быстро.

0 голосов
/ 28 марта 2009

Я ожидаю, что цель состояла в том, чтобы обеспечить строгое разделение вида модели, как в StringTemplate .

Идея довольно проста: если у вас нет доступа к методам, вы вынуждены вычислить все свои данные в контроллере, а затем просто отформатировать их в представлении. Конечно, они запутали сообщение, позволив вам иметь доступ к функциям, и им не помог тот факт, что составлять списки карт кортежей (читай: структурированные данные без классов) не так просто, как Python, Ruby и т. Д.

В любом случае, вот статья о написании тега, который позволяет вам вызывать произвольных методов , может оказаться полезным.

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