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