Подтвердить что ты не робот

Выполнить JSP прямо из Java

Мне нужно выполнить JSP. Но мне нужно напрямую с Java, без использования Tomcat или любого другого контейнера сервлета. Компиляция JSP тоже была бы неплохой, но не необходимой. Я думаю, возможно, пакет org.apache.jasper хорош для этого, но я не могу найти хороший пример или учебник онлайн.

Мне нужно что-то вроде:

Class compiledJSP = compileJSP(new File("helloWorld.jsp"));
String html = executeJSP(compiledJSP, httpServletRequest, httpServletResponse, ...);

html --> "Hello World, John!"

Спасибо!

4b9b3361

Ответ 1

Если вам нужно записать JSP-выход в виде строки, он достаточно прост (хотя и не идеален с точки зрения дизайна) из внутри Контейнер сервлета:
1. Расширьте javax.servlet.HttpServletResponseWrapper и переопределите методы getWriter()/getOutputStream() для предоставления собственных буферизованных версий (например, StringWriter)
2. Вызовите метод "include()" RequestDisparcher, обернув исходный ответ в свои собственные.
3. Загрузите содержимое буфера.

Теперь, если вам нужно сделать то же самое снаружи Servlet Container, вам действительно нужно спросить себя "почему?". Возможно, вы должны использовать механизм шаблонов (FreeMarker/Velocity/StringTemplate/etc...) вместо JSP? Если ваши JSP файлы являются хорошо сформированными XML файлами и не используют вставки в java-код, может быть достаточно тривиально преобразовать их в шаблоны FreeMarker (FreeMarker поддерживает собственные библиотеки тегов JSP), что значительно упростит вашу задачу.

Тем не менее, если это абсолютное жесткое требование, ваши самые простые варианты:
 1. Запустите внешний контейнер сервлетов и позвольте ему обрабатывать JSP-интерпретацию. Ваша программа отправит HTTP-запросы на него и захватит вывод.
 2. То же, что и выше, но вы можете запустить встроенный контейнер сервлетов (например, Jetty).

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

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

Ответ 2

Вам понадобится контейнер. JSP - это абстракция на сервлете. Сервлеты имеют зависимость от жизненного цикла, предоставляемого контейнером. Для обеспечения жизненного цикла необходим контейнер.

Ответ 3

Это возможно без контейнера сервлетов. Для этого есть два шага.

Первый - это сгенерировать исходный код. Если вы посмотрите на исходный код задачи jspc ant, это можно сделать непосредственно в коде. Или вы можете просто вызвать задачу ant.

Сгенерированный код - это просто сервлет, и вы можете вызвать методы на сервлете вне контейнера:

Просто создайте экземпляр, а затем вызовите doGet (запрос, ответ). Я не совсем уверен, что вам нужно, но ваша жизнь будет легче с помощью spring mock объектов для HTTP-запроса и ответа.

Это заполнит объект Response. вы можете получить результат с помощью:

res.getContentAsString();

См. пример здесь:

http://ytreyvus.blogspot.com/2007/03/private-void-cloneplaneffectrelationshi.html

Ответ 4

Попробуйте MockRunner выполнить его. Однако вам нужно будет скомпилировать JSP. Я использую Maven 2 для этого (и JSP Compiler plugin)