2009-03-06 4 views
5

Я пытаюсь интегрировать SiteMesh в устаревшее приложение, используя Tomcat 5 в качестве моего контейнера. У меня есть main.jsp, который я украшаю простым декоратором.Использование SiteMesh с ForwardDispatcher forward()

В decorators.xml, я только что получил один декоратор, определенный:

<decorators defaultdir="/decorators"> 
    <decorator name="layout-main" page="layout-main.jsp"> 
    <pattern>/jsp/main.jsp</pattern> 
    </decorator> 
</decorators> 

Этот декоратор работает, если я вручную перейти к http://example.com/my-webapp/jsp/main.jsp. Тем не менее, есть несколько мест, где сервлет, вместо того, чтобы делать переадресацию на JSP, делает forward:

getServletContext().getRequestDispatcher("/jsp/main.jsp").forward(request, response); 

Это означает, что URL остается на что-то вроде http://example.com/my-webapp/servlet/MyServlet вместо файла JSP и поэтому не будучи украшенным, я полагаю, поскольку он не соответствует шаблону в decorators.xml.

Я не могу сделать <pattern>/*</pattern>, потому что есть другие jsps, которые не должны быть украшены layout-main.jsp. Я не могу сделать <pattern>/servlet/MyServlet*</pattern>, потому что MyServlet может пересылать main.jsp иногда и, возможно, error.jsp в другое время.

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

Документация SiteMesh действительно не так уж велика. Я работал в основном с примера приложения, которое поставляется с дистрибутивом. Мне очень нравится SiteMesh, и я надеюсь, что смогу заставить его работать в этом случае.

ответ

9

Я понимаю, что SiteMesh интегрирован в приложение как фильтр сервлетов. По умолчанию фильтры сервлетов вызывается только на исходный входящий запрос (в вашем случае запрос на сервлет). Последующие вперед или включенные запросы не передаются через фильтр, и поэтому не будут передаваться через sitemesh.

Вы можете, однако, инструктировать фильтр, который будет вызван на форвардов, используя что-то вроде этого:

<filter-mapping> 
    <filter-name>sitemesh</filter-name> 
    <servlet-name>MyServlet</servlet-name> 
    <dispatcher>FORWARD</dispatcher> 
</filter-mapping> 

который инструктирует контейнер для работы только по запросам FORWARD. Другие опции INCLUDE и REQUEST, вы можете иметь несколько элементов.

Итак, ваши варианты - либо изменить конфигурацию фильтра, чтобы указать FORWARD, либо изменить фильтрацию фильтра, чтобы он соответствовал пути сервлета, а не пути JSP. Любой должен работать.

+1

Это сработало, применяя фильтр к пересылаемому запросу и тем самым применяя декоратор sitemesh к пересылаемой странице jsp. Благодаря! –

+1

Спасибо, скаффман, это была просто ОГРОМНАЯ помощь мне! –

+1

Я видел эти новые директивы, но еще не нуждался в них. Отличный совет. –

Смежные вопросы