Двухпроходный рендеринг JSP-страницы - PullRequest
0 голосов
/ 20 апреля 2010

Предположим пример. У меня есть следующий интерфейс:

public interface DataSource<T> {

  Future<T> fetch();
}

Этот источник данных может выполнять асинхронную выборку данных. И у нас есть следующий тег для использования источника данных в JSP:

<html>
  <d:fetch from="${orderDS}" var="orders">
    <c:foreach in="${orders}" var="order">
      <div class="order">
        <c:out value="${order.title}" />
      </div>
    </c:foreach>
  </d:fetch>
</html>

Итак, что я хочу? Я хочу, чтобы движок рендеринга JSP дважды вызывал мой пользовательский тег (в этом примере FetchTag). При первом вызове FetchTag выполнит вызов DataSource.fetch () и сохранит Future локально как поле объекта. При втором вызове FetchTag выполняет вызов Future.get () и будет заблокирован, пока данные не станут доступными.

Есть ли способ сделать такую ​​вещь?

1 Ответ

3 голосов
/ 20 апреля 2010

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

В общем, я обнаружил, что встраивание вещей в библиотеки пользовательских тегов - плохая идея. JSTL и / или библиотеки тегов Spring - все, что мне нужно. Если я чувствую, что мой пользовательский интерфейс должен делать больше, я думаю об этом неправильно.

Для клиентов с отключенным JS я просто заставляю их совершать данные в обоих направлениях, а не в фоновом режиме. Дайте им выбор: подождите или включите JS.

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