Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум программистов > Java EE (J2EE) и Spring > Обработка JSP страницы с возвратом в сервлет


Автор: bavar 18.6.2009, 17:12
Всем доброго дня. У меня есть довольно занятная проблема, надеюсь вы поможете мне с ней разобраться ))
Есть следующая ситуация: 
1. сервлет контейнер (Tomcat 5.5) получает AJAX запрос от клиента
2. сервлет обрабатывает запрос и формирует необходимые данные
3. Далее необходимо обернуть собранные данные в HTML при помощи JSP
4. Полученный фрагмент HTML кода и вернуть клиенту в виде JSON.

Вся загвоздка состоит в пункте 3 (((
Каким образом запустить обработку jsp страницы так, чтобы в результате управление вернулось обратно в сервлет и я смог получить сгенерированный HTML в виде строки????

Я нашел следующий метод, но мне он кажется какимто "костыльным". Думается что есть более верный вариант.
Мой вариант: создать mock для объекта HttpServletResponse и сделать форвард на требуемую jsp страницу, а потом из mock'a получить HTML.
Вот как это выглядит в коде:

Код

org.springframework.mock.web.MockHttpServletResponse mockResponse = new MockHttpServletResponse();

request.getRequestDispatcher("/default.jsp").forward(request, mockResponse);

String htmlContent = mockResponse.getContentAsString();


Автор: garbuz 18.6.2009, 19:08
Цитата(bavar @  18.6.2009,  17:12 Найти цитируемый пост)
3. Далее необходимо обернуть собранные данные в HTML при помощи JSP
4. Полученный фрагмент HTML кода и вернуть клиенту в виде JSON.

Вот эти строки надо как-то доступнее описать, а то ничего не понятно.

Автор: tux 18.6.2009, 19:37
bavar, обязательно нужен JSP? Шаблонные движки типа Velocity или Freemarker не подойдут? Я не говорю, что JSP невозможно, но шаблонным движком все было бы проще.

Автор: bavar 19.6.2009, 09:36
garbuz, попробую описать более детально.
Изначально цель стоит такая: в web приложении где используется много AJAX, необходимо по запросу пользователя модифицировать несколько блоков сайта, т.е. к примеру пользователь добавил новую запись и необходимо полностью перестроить облако меток/тегов (это грубый пример, но для понимания сути вполне подойдет )) ). 
Поэтому хочется на сервере получить из базы эти метки/теги и обернуть их в HTML: <ul><li>tag1</li> <li>tag2</li></ul> (Простой пример). 
Для генерации HTML используется JSP. 
Затем, неизвестным мне способом, получить в сервлете это HTML как строку, прибавить к нему еще несколько кусков HTML'я для других частей сайта и еще какиенить данные, обернуть все это дело в JSON и оптравить все это клиенту - и пусть дальше Javascript разбирается со всем этим ))
Надеюсь теперь более понятно объяснил.


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

Автор: MisterCleric 19.6.2009, 09:53
С вашего позволения я тоже вмешаюсь в вашу дискуссию.

Я в своем проекте использую MVC-framework http://www.opensymphony.com/webwork/.
а также для рисования всяких отчетных табличек с сортировкой и пейджинированием использую http://displaytag.sourceforge.net/1.2/.
Так вот была такая задача, что заказчик заказал еще кроме сортировки и пейджинга прикрутить к таким табличкам фильтрацию в виде отдельной строки в самой таблице.

Собственно вставку строки я делаю таким способом:
Код

  private String injectSearchRow(String row) {
        StringBuilder sb = new StringBuilder();
        Writer searchFormIncludeWriter = new StringWriter();
        try {
            Include.include(jspUrl, searchFormIncludeWriter, ServletActionContext.getRequest(), ServletActionContext.getResponse());
        } catch (Exception e) {
            e.printStackTrace();
        }
        return sb.append(searchFormIncludeWriter)
                .append(row != null ? row : "")
                .toString();
    }


В определенном классе-декораторе, который я указал DisplayTag в конкретной таблице. 
Так вот как раз этим кодом я вызываю конкретную jsp и пишу ее в ... Ну эт по коду должно быть видно.
А механизм в общем-то такой:
1. Страница с таблицей и ее строкой фильтрации рисуется после вызова конкретного Action 
2. Этот Action ложит в сессию объект, который представляет фильтр.
3. Страница со строкой фильтрации выбирает из сессионнго объекта-фильтра значения фильтров.
4. Я ее получаю в виде строки и передаю дальше по цепочке тому, кто рисует саму таблицу.

Вся загвоздка в том (как для тебя), как работает вот этот самый Include.include

Ну собственно вот посмотри его исходники
http://kickjava.com/src/com/opensymphony/webwork/components/Include.java.htm
А вось да что-то для себя найдешь...

Автор: bavar 19.6.2009, 11:40
MisterCleric,  спасибо за ответ.
Посмотрел я исходники этого метода Include.include.... Вообщем идея таже самая что и привел я.
Видимо других решений нету.

Может у кого нить есть другие предложения?

Автор: tux 19.6.2009, 12:27
Есть два варианта попроще (как мне кажется). 
  • Использовать URLConnection и просто обращаться к JSP через URL, таким образом получая в поток что сгенерилось.
  • Использовать http://java.sun.com/javaee/5/docs/api/javax/servlet/RequestDispatcher.html. Тогда можно просто форварднуть на нужную JSP и получить опять-таки сгенеренный HTML в поток.

Автор: MisterCleric 19.6.2009, 12:31
Цитата

Использовать RequestDispatcher. Тогда можно просто форварднуть на нужную JSP и получить опять-таки сгенеренный HTML в поток.

по-моему я такое решение как раз и привел. Достаточно всего лишь взять кусок кода из фреймворка и юзать...

В моем случае еще такая ситуация, что шарится между основной страницей и той, которую я вставляю, OJNLValueStack и с помощью какстом-тэгов я могу брать от туда свойства, которые положил Action

Автор: tux 19.6.2009, 14:51
Цитата(MisterCleric @  19.6.2009,  12:31 Найти цитируемый пост)
по-моему я такое решение как раз и привел.

А, ну наверное. Я не смотрел в код WebWork. ;)

Автор: bavar 23.6.2009, 11:58
Всем спасибо за участие. Остановлюсь на том решении которое приводил в самом начале.

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