JSP программно представляют

Я должен программно представить страницу JSP. Насколько я понимаю, JSP должен иметь некоторый компилятор. Вопросом является банка, я использую этот компилятор непосредственно без JspServlet и других? Все, в чем я нуждаюсь, является документацией, как использовать компилятор JSP (Jasper, например).

Некоторая дополнительная информация разъяснила бы ситуацию, я думаю. Я не могу использовать стандартный JspServlet. Я хочу измениться, источник JSP перед компиляцией в некотором роде (объедините два JSP вместе, чтобы быть точными), таким образом, мне нужен способ скомпилировать результат JSP InputStream (или Читатель) использование компилятора JSP непосредственно.

Слияние двух JSP является требованием расположения. Можно спросить: "Но почему этот парень просто не использует SiteMesh или что-то вроде этого?". Одна из страниц JSP не статична. Это обеспечивается пользователем и хранится в базе данных. Мы sanitify и проверяет это расположение JSP (пользователи могут использовать только подмножество тегов, и все они не стандарт, но созданный особенно для них), кэшируйте их и так далее. Но теперь нам нужен способ использовать эти страницы JSP (которые хранятся в памяти) как разметки для всех страниц JSP тот пользовательский запрос.

13
задан Kevin Burke 17 August 2012 в 22:20
поделиться

6 ответов

Мне нужна страница JSP для программного рендеринга.

Каковы все же функциональные требования? Вы явно ищете решение в неправильном направлении. Что это, проблема / требование, для которой вы думаете, что это решение? Мы можем предложить лучшие предложения.

Вам, например, нужен только его вывод ? Если это так, то java.net.URLConnection может быть достаточно.

Редактировать : вы редактировали свой вопрос:

Я хочу каким-то образом изменить исходный JSP перед компиляцией (точнее, объединить два JSP вместе), поэтому мне нужен способ скомпилировать результат JSP из InputStream (или Reader) напрямую с помощью компилятора JSP.

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

Вы, например, просто хотите включить один JSP в другой? Например, включение head.jsp в main.jsp ? Если да, то может быть достаточно. Или, что еще хуже, содержат ли они необработанный код Java с каким-то конкретным кодом, который вы хотели использовать повторно? Если это так, то вы должны использовать для этого простые классы Java и, если необходимо, библиотеки тегов.

Редактировать 2 : как вы прокомментировали:

Но теперь нам нужен способ использовать эти страницы JSP (которые хранятся в память между прочим) в качестве макетов для всех страниц JSP, запрашиваемых пользователем

Просто сохраните файлы JSP в файловой системе диска внутри webapp '

8
ответ дан 1 December 2019 в 23:47
поделиться

Возможно, вы могли бы использовать задачу Tomcat JspC ant ?

1
ответ дан 1 December 2019 в 23:47
поделиться

JSTL - это просто библиотека тегов, используемых внутри файлов JSP.

1
ответ дан 1 December 2019 в 23:47
поделиться

По какой причине вы должны это делать? Если вам нужно объединить 2 файла jsp для обработки, можно использовать include Или вам нужны другие идеи? Не могли бы вы дать образец по вашему запросу?

1
ответ дан 1 December 2019 в 23:47
поделиться

Если JSP уже был предварительно скомпилирован сервером приложений, вы можете найти сгенерированный файл .class. В Tomcat это должно быть в каталоге $ CONTEXT_ROOT / org / apache / jsp /. Возможно, вам удастся каким-то образом запустить этот класс и сгенерировать свой вывод.

РЕДАКТИРОВАТЬ: Пропущено ваше изменение об изменении источника JSP.

Взгляните на org.apache.jasper.compiler.AntCompiler (включен в jasper.jar в Tomcat). Существует защищенный метод под названием generateClass, который вы можете переопределить и использовать:)

1
ответ дан 1 December 2019 в 23:47
поделиться

Я не совсем уверен, что это именно то, что вы ищете, но структура DWR содержит метод под названием WebContext.forwardToString , который пересылает текущий запрос плюс объект поддельного ответа на URL-адрес, а затем считывает содержимое буфера в память. Вот пример кода:

StringWriter sout = new StringWriter();
StringBuffer buffer = sout.getBuffer();

HttpServletResponse realResponse = getHttpServletResponse();
HttpServletResponse fakeResponse = new SwallowingHttpServletResponse(realResponse, sout, realResponse.getCharacterEncoding());

HttpServletRequest realRequest = getHttpServletRequest();
realRequest.setAttribute(WebContext.ATTRIBUTE_DWR, Boolean.TRUE);

getServletContext().getRequestDispatcher(url).forward(realRequest, fakeResponse);

return buffer.toString();

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

5
ответ дан 1 December 2019 в 23:47
поделиться
Другие вопросы по тегам:

Похожие вопросы: