Sitemesh的问题让人非常头痛,搞了一天。现把心得整理一下

 

首先是decorator.xml里面的配置问题

 

<decorator name="admin" page="admin.jsp">
<pattern>/index/login.jsp</pattern>
<pattern>/index/index.jsp</pattern>
<pattern>/common/journal/journalHome.jsp</pattern>
</decorator>

 定义了amin这个装饰器装修的页面,均采用绝对路径

 

其次是装饰器页面里的路径,分为两部分,

<link  rel="stylesheet" type="text/css" href="<%=application.getContextPath()%>/decorators/main.css">

 

这些HTML标签里的 href可以用="<%=application.getContextPath()%>/获得应用环境的路径,没问题

 

但是



<page:applyDecorator page="<%=application.getContextPath()%>/decorators/nav.jsp" name="panel"  encoding="UTF-8" />

 就有问题了,总是编译不过,是否写错了,还是不能这样用,还在研究中

 

不过有一点还是明白的,那就sitemesh过滤器对当前的请求地址进行处理,截取最后一个/前的地址,再加到<page:applyDecorator>标签中的page属性上,如当前请求

​​http://localhost:8080/macaulites/common/journal/journalHome.jsp​​

 



<page:applyDecorator page="/decorators/nav.jsp" name="panel"  encoding="UTF-8" />

 

最后得到的地址是

 

​​http://localhost:8080/macaulites/common/journal/decorators/nav.jsp​​

 

所以经常出现找不到页面的问题,我们在装饰器标签的page属性用绝对地址"/macaulites"有问题,但用另一种绝对地址形式则无问题如

​​http://localhost:8080/macaulites/decorators/nav.jsp​​

 

 

 

现在项目的sitemesh路径的解决方法是:href src 等用 /macaulites/...... 这种形式的绝对路径

                                                       page 属性用  ​​http://localhost:8080/macaulites/​​ 这种绝对路径

 

 但是上面还是有问题,page属性采用上面那种绝对路径会产生页面乱码,最终用${application.contextPath}解决了所有问题

试一下${pageContext.request.contextPath}