Вопрос по java – Выполнять JSP напрямую из Java

19

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

Мне нужно что-то как:

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

html --> "Hello World, John!"

Спасибо!

Это было ранее помечено как обман дляstackoverflow.com/questions/956112/… или жеstackoverflow.com/questions/8141813/… , Это не так. Sean Patrick Floyd
Но почему вы хотите это сделать? Вы просто хотите программно генерировать HTML? Raedwald

Ваш Ответ

4   ответа
0

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

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

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

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

res.getContentAsString();

Смотрите пример здесь:

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

4

зависят от жизненного цикла, предоставляемого контейнером. Вам необходим контейнер для обеспечения жизненного цикла.

0

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

19

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

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

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

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

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

Обратите внимание, что это (в настоящее время) не будет работать на Jetty, из-заjira.codehaus.org/browse/JETTY-1485 , Он прекрасно работает на Tomcat. Здесь более подробное описание этого подхода:technologicaloddity.com/2011/10/04/…
Спасибо за совет. Я на самом деле не хочу реализовывать свой собственный контейнер сервлетов. Я тоже не хочу компилировать и обрабатывать JSP, но я не вижу альтернативы тому, что я ищу. Я хочу создать ответы сервера в виде JSON, например: {html1: & quot; & lt; pre & gt; 1 & lt; / pre & gt; & quot ;, html2: & quot; & lt; script & gt; ... & lt; / script & gt; & quot;} каждый html должно быть сделано с JSP, но JSON не может быть там. Я использовал FreeMarker и не вижу, как это может помочь. Если бы вы знали, как делать то, что я ищу, я был бы признателен. Благодарю.
Я не совсем понимаю, чего вы пытаетесь достичь. Вы возвращаете этот JSON-ответ от запущенного приложения?outside контейнер сервлетов? Зачем? Мне сложнее всего представить, как использовать JSON для взаимодействия между приложениями. Если бы вы могли уточнить, что вы пытаетесь сделать немного больше, я был бы рад помочь. Отличие FreeMarker в том, что вы можете полностью запустить его из своего приложения, не прибегая к фальшивой среде сервлета. Например. каждый "html" фрагмент в вашем ответе будет создан отдельным шаблоном FTL, и вы просто вызовите Template.process (модель, писатель) для каждого из них.

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