Интерпретация запроса как JSP, а не через сервлет - PullRequest
0 голосов
/ 08 сентября 2010

Это должно быть относительно просто сделать, но я еще не нашел описание того, как это сделать.

Моя установка - это простое веб-приложение, которое обрабатывает каждый запрос через сервлет (для этого вопроса я назову его MyEverythingServlet). Вот немного измененная версия моего web.xml:

<servlet>
    <servlet-name>MyEverythingServlet</servlet-name>
    <servlet-class>blah.blah.blah.MyEverythingServlet</servlet-class>
</servlet>

<servlet-mapping>
    <servlet-name>MyEverythingServlet</servlet-name>
    <url-pattern>/*</url-pattern>
</servlet-mapping>

Прямо сейчас, сервлет довольно прост и либо выполняет некоторую работу (когда work.do является частью пути), и если в пути указан файл .txt, мы проведем некоторую проверку и затем загрузим файл и отправьте текст в ответ:

response.getOutputStream().print( content );

То, что я хотел бы сделать, это либо:

  • Внутри сервлета, если запрос является URL-адресом к файлу .jsp, я бы хотел, чтобы контейнер интерпретировал части JSP scriptlet parts / taglib, прежде чем я напишу строку в ответ.
  • Измените мой web.xml, чтобы он обрабатывал файлы .jsp за пределами MyEverythingServlet.

1 Ответ

4 голосов
/ 08 сентября 2010
  • Внутри сервлета, если запрос является URL-адресом к файлу .jsp, я бы хотел, чтобы контейнер интерпретировал части JSP-сценариев part / taglib перед тем, как записать строку в ответ.

Нет прямого API, который обрабатывал бы файлы JSP программным способом. Теоретически, вы хотите, чтобы JSP находился в общедоступном веб-контенте, и пересылать запрос в JSP. Вы можете сделать это с RequestDispatcher#forward().

if (request.getServletPath().endsWith(".jsp")) {
    request.getRequestDispatcher(request.getServletPath()).forward(request, response);
} else {
    // Write "plain" to response as you did.
}

Возможно, вы захотите сделать только некоторые проверки правильности путей, но это должно, по крайней мере, дать вам общее представление. Однако есть небольшая проблема: сервлет будет вызываться рекурсивно, поскольку он сопоставлен с /*. Вы бы предпочли заменить этот MyEverythingServlet на Filter, который просто делегирует остаток задания встроенному сервлету по умолчанию сервера приложений. Наличие Servlet для прослушивания /* уже является признаком запаха дизайна, что это должен был быть Filter с самого начала;)

  • Измените мой web.xml, чтобы он обрабатывал файлы .jsp за пределами MyEverythingServlet.

Вы не можете иметь "минус" url-pattern в web.xml. Лучшее, что вы можете сделать, это позволить сервлету прослушивать более специфичные url-pattern, такие как *.txt или /static/*, и хранить там файлы JSP снаружи.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...