Я взломал его, выполнив: request.removeAttribute ("com.opensymphony.sitemesh.APPLIED_ONCE"); перед выполнением возврата new ModelAndView ("forward: ..."); который позволяет SiteMesh украшать после форварда.

аюсь интегрировать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 выполняетвперед:

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)

Ваш ответ на вопрос