Использование SiteMesh с forwardDespatcher's forward () - PullRequest
5 голосов
/ 06 марта 2009

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

В 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, и я надеюсь, что смогу заставить его работать в этом случае.

1 Ответ

9 голосов
/ 12 июня 2009

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

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

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

Что дает указание контейнеру работать только с запросами FORWARD. Другие варианты: ВКЛЮЧИТЬ и ЗАПРОСИТЬ, вы можете иметь несколько элементов.

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

...