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}