Загрузка страниц JSP из пользовательских источников

#jsp #servlets

Вопрос:

Можно ли было бы выполнить страницу JSP и захватить ее вывод за пределами веб-приложения? В частности, в моем случае все еще существует обычное веб-приложение, но оно загружает страницы JSP не из своего пути к классу, а из произвольного источника. Похоже, я не могу просто получить RequestDispatcher и указать на файл JSP на диске.

Ответ №1:

Я думаю, что вам лучше использовать шаблонный движок, такой как скорость. Это обеспечивает чистую инфраструктуру для динамического контента, которая явно отличается от материалов jsp/сервлетов, о которых вы просите.

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

  • вы полагаетесь на то, что ваше приложение будет «взорвано» — например, оно не может запускаться непосредственно из военного архива (это может ограничить ваши возможности развертывания).
  • возможность редактирования jsp во время выполнения может открыть дыры в системе безопасности, если вы не отключите скриптлеты (также, если вы отключите, но это будет несколько сложнее…). Отключение скриптов запрещает реальный Java-код в jsp, тогда вы ограничены библиотеками тегов.
  • Вам понадобится компилятор Java, доступный во время выполнения, который вы, возможно, не захотите использовать в производственных системах — например, вы не можете предварительно скомпилировать свои JSP перед развертыванием. Кроме того, вы платите обычный штраф за перевод jsp во время выполнения в вашей производственной системе.

web.xml конфигурация для отключения сценариев:

 <jsp-config>
    <jsp-property-group>
        <url-pattern>*.jsp</url-pattern>
        <scripting-invalid>true</scripting-invalid>
    </jsp-property-group>
</jsp-config>
 

Я надеюсь, что это web.xml фрагмент прошел, предварительный просмотр показал его неправильно…

Обновление: Попытался правильно отобразить xml-фрагмент.

Ответ №2:

Поправьте меня, если я ошибаюсь, но я думаю, вы имеете в виду, что хотите захватить HTML… а не JSP. JSP обрабатывается (в файл JAVA) на движке сервлетов (сервер веб-приложений) и после того, как HTML отформатирован и передан запрашивающему через веб-сервер (не то же самое, что сервер веб-приложений). Вы не можете заставить RequestDispatcher работать с прямым JSP с диска, потому что он еще не был обработан сервером веб-приложений. Теперь, чтобы захватить вывод JSP (в HTML), должна быть возможность, но я никогда не делал этого раньше. Возможно, существуют некоторые хитрые API, которые более осведомлены, чем я, но HTTP обычно выполняется на порту 80, поэтому я думаю, что можно было бы читать/записывать на порт 80 в сокете TCPIP. Возможно, есть еще кое-что, что нужно сделать в дополнение к этому, но, по крайней мере, это какой-то момент, чтобы начать изучать.
Извините, что не могу сообщить больше подробностей, но, черт возьми… для меня на данный момент все это теория.