Выполнить 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!"
Спасибо!
Ответы
Ответ 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)