Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум программистов > Java EE (J2EE) и Spring > Struts + JSTL


Автор: svby 7.8.2005, 17:42
Нужно в Struts-тег вложить выражение JSTL. Вторая строчка не работает. Как правильна записать?
Код

<c:set var="isbn" value="${per.value.disk.disk_id}"/>
<html:text property='<c:out value="${isbn}"/>' value='<c:out value="${per.value.quantity}"/>' />




Автор: gEndelf 9.8.2005, 18:52
а зачем ты в поле property подставляешь значение ?
там должно быть название геттера

ну а если в input необходимо подставить значение и имя, то делается так

Код

<html:text property="название геттера для этого поля" value="${per.value.quantity}" />

Автор: kkorsakoff 4.4.2006, 19:44
У меня почему-то выводится строка без обработки, т.е. что-то вроде ${screenname.screenname}.
<c:out> вообще работает.

Приходится выводить при помощи нелепой конструкции
value="<%=((Screenname)pageContext.getAttribute("screenname")).getScreenname()%>"

Автор: kkorsakoff 4.4.2006, 23:54
Решил не создавать новую тему.

Сегодня был первый практический опыт применения технологии JSTL. Первые впечатления:

Уменьшает количество скриплетов, повышает читаемость кода. Однако, кто сказал, что тому же дизайнеру будет проще работать с <c:out..>, чем с <%=...%>. Это еще не факт.

Итерация радует донельзя.

Но не могу сделать простейшие вещи (или не умею?):

1. Раз уж мы все рабочие данные поместили в аттрибуты (страницы/запроса/сессии/приложения), то должен быть простой спрособ вынимать эти данные в любом месте, а не только в тэгах <c:...>
Наглядный пример - мой пост выше.

<html:text property="..." value="${per.value.quantity}" /> - выводит ${per.value.quantity}, вместо значения этого поля.

2. Полная невозможность получать данные для манипулирования из методов с параметрами (не знаю как их правильно назвать).

Пример: пользователь хочет посмотреть кто сколько сообщений ему оставил. Он видит список "друзей", перед именем каждого кол-во новых сообщений.

Страница messages.jsp - запрос к БД в самой странице не делаем, а имеем класс, который выполняет всю логику. Назовем его Main. Объект класса всегда лежит в applicationScope. Чтобы получить список друзей/сообщений необходимо вызвать метод

Main.getNewMessages(String account);

Получается при помощи чистого JSTL коллекцию уже не получить.

Приходится в начале страницы вставлять

Код

<%
Main main=(Main)application.getAttribute(Main.APPLICATION_ATTRIBUTE_KEY);
...
pageContext.setAttribute("newMessages",newMessages)
%>

, а затем работать через ${newMessages}

Теряется суть JSTL - где же тут упрощение.

Или абсолютно все зашивать в Action'ы и передавать в jsp чистые данные в виде готовых переменных, коллекций, объектов...

Получается на каждую страницу необходимо писать по одному Action'у, плюс по Action'у для "действительно" действий, таких как удаление сообщений, создание и т.д.
Это неплохо затягивает сроки разработки. Тогда уж проще в начале страницы написать парочку скриплетов.

Поясните, может я архитектурно что-то не так понимаю.

3. if есть, else нет. Ну ладно, переживем....(всё повышаем читаемость) smile

4. Что больше всего не понравилось - отсутствие возможности использовать константы в выражениях jstl.

Хочу сделать простейшую проверку, что человек залогинился и его статус - не заблокирован

Код

<c:if test="${(empty sessionScope.Passport) || (sessionScope.Passport.status==Passport.STATUS_BLOCKED)}">
...redirect...
</c:if>


выдает ошибку

javax.servlet.jsp.JspTagException: javax.servlet.jsp.JspException: An error occurred while evaluating custom action attribute "test" with value "${(empty sessionScope.Passport) || (sessionScope.Passport.status==Passport.STATUS_BLOCKED)}": Unable to find a value for "STATUS_BLOCKED" in object of class "....Passport" using operator "."

Автор: zera 5.4.2006, 12:54
по пункту 3 - есть же <c:choose> <c:when>...</c:when>[<c:otherwise>..</c:otherwise>]</c:choose>
1 и 2 - в силу незнания стратса не отвечу, но ${main.newMessage} -должно работать. и <c:out зачастую не нужен

Автор: kkorsakoff 5.4.2006, 17:00
Не работает ни в аттрибутах стратсах, ни просто в хтмле. Работает ${} только в тегах JSTL

Автор: zera 6.4.2006, 18:19
если в web.xml
Код

<!DOCTYPE web-app PUBLIC "-//Sun Microsystems, Inc.//DTD Web Application 2.3//EN" "http://java.sun.com/dtd/web-app_2_3.dtd">
- то не работает, уже за давностью забыл, если честно.
а вот если
Код

<web-app version="2.4"
         xmlns="http://java.sun.com/xml/ns/j2ee"
         xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
         xsi:schemaLocation="http://java.sun.com/xml/ns/j2ee http://java.sun.com/xml/ns/j2ee/web-app_2_4.xsd">

- работает. первый пример под рукой оказался.
Код

          var answer = confirm("Запись будет удалена. Вы согласны?");
          if (answer==true) {
            var answerurl = '${viewConf.operationView}?cmd=delete&amp;object.id='.concat(_vars['selectedNode'][0].nodeValue);
            bpc.execute('<s:task b:action="load" b:url="'+answerurl+'" b:destination="id(\'${viewConf.confirmView}\')" b:mode="replace" />');
          };

или мы о разном говорим? smile

Автор: kkorsakoff 6.4.2006, 20:34
О том, о томsmile
Спасибо!

Powered by Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)