Генерация HTML из JSP - PullRequest
       7

Генерация HTML из JSP

2 голосов
/ 27 июля 2010

Базовая настройка сервлета JSP, с которой я знаком ....

RequestDispatcher dispatcher = request.getRequestDispatcher(resourceA.jsp);

dispatcher.forward(request, response);

Проблема в том, что помимо отправки ответа обратно в браузер (resourceA.jsp) мне нужно создать второй вывод HTML из resourceB.jsp, который, в свою очередь, будет отправлен по электронной почте или использован для создания PDF-документа.

Это делается не каждый раз, просто в определенных условиях и по телефону

dispatcher.forward(request, response);

во второй раз я получаю и IllegalArgumentException .

Мне просто нужен способ генерации HTML из jsp (, в основном заменяющий значения $ {par} ) и возвращая html в виде String, без кода состояния или заголовков, просто html и A не имеют ничего общего с B, поэтому фильтры не будут работать.

------ повторить в первый ответ ----- комментарий к маленькому --- без форматирования

Я не понимаю, почему это так сложно ....

все магния есть для объединения данных с содержимым HTML в

${par}
${par['key']}
<c:if test="${patBoolean}" >
<c:forEach var="pvar" varStatus="s_pvar" items="${parList}">

Я даже создал оболочку для маскировки getOutputStream () и getWriter (), создав собственный PrintWriter

public class ResponseWrapper extends HttpServletResponseWrapper{
  private PrintWriter printWriter;

  public ResponseWrapper(HttpServletResponse response){
       super(response);
  }

  public ServletOutputStream getOutputStream() throws java.io.IOException{....}

  public PrintWriter getWriter() throws java.io.IOException {....}

}

в получении результата для resourceB.jsp, но проблема в dispatcher.forward (запрос, ответ) устанавливает isCommitted некоторые изделия в оригинальном HttpServletResponse.

Ответы [ 2 ]

1 голос
/ 27 июля 2010

JSP здесь не то, что нужно делать.Создайте отдельный процесс, который заполняет шаблон Velocity (для электронной почты) или генерирует PDF, используя XSL-FO или iText, и исключите JSP из него.Это совершенно отдельный случай использования от отправки ответа HTTP.

0 голосов
/ 20 июля 2018

Это очень возможно.
Да, возможно, это неправильный вариант использования, может быть, просто обходной путь, но это просто .Какая разница.

Если у вас есть экземпляр HttpServletRequest, вы можете легко создать макет HttpServletResponse для перенаправления вывода jsp в строку.

Вам нужен StringWriter
Чтобы получить вывод JSP, вам нужен StringWriter.

StringWriter sw=new StringWriter();

Обернуть его
Анализатор JSP или что-то еще PrintWriter.

PrintWriter pw=new PrintWriter(sw);

Создание ложного ответа
Вы не можете легко повторно использовать существующий HttpServletResponse, поэтому создайте свой собственный.

HttpServletResponse res=new HttpServletResponse() {

        @Override
        public PrintWriter getWriter() throws IOException {
            // return your own writer!
            return pw;
        }

}

Вы должны реализовать и другие методы, но просто использовать быстрое исправление IDE и оставить их по умолчанию.
Генерировать его
something.jsp должен быть существующим,

request.getRequestDispatcher("/something.jsp").forward(request,res);

Получить вывод
Это выведет вывод JSP на консоль сервера.

System.out.printf("{%s}",sw.toString());

Продолжайте с реальным ответом
Используя сервлеты, вы должны продолжать иметь дело с реальным HttpServletResponse точно так же, как вы раньше не генерировали JSP.В то время как весной нет никакого реального Response, чтобы заботиться.

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

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