使用SiteMesh和Jquery的一些问题

t0ckh 2011-08-16

在项目中使用了SiteMesh框架修饰jsp页面,同时使用了jquery的页面要注意以下一些问题:

1、必须将js文件放在</head>之前或者<body></body>之间,如果放在</head>和<body>之间的话,被修饰的jsp页面将不会引人这些js,导致不能执行脚本。

2、sitemesh的修饰

它通过过滤器(filter)来拦截页面访问,并根据被访问页面的URL找到合适的装饰模板,然后提取被访问页面的内容,放到装饰模板中合适的位置,最终将装饰后的页面发送给客户端。因此如果被修饰页面用到了jquery,就要在自己的页面中加入jquery.js文件,不要写在sitemesh模板页里面,否则很可能出现"Jqueryundefined"异常。

3、如果被装饰的页面的body有onload方法,则不会执行该onload方法,因为只是加入body内部的内容。可以使用jquery的ready方法替代onload方法。

     可以通过 sitemesh的 配置解决。

    备注:

4.   一定在要decorators.xml文件中 排除不需要装饰的文件

    <excludes>

<pattern>*/ajax/*</pattern>

<pattern>*.js</pattern>

<pattern>*.css</pattern>

<pattern>*.html</pattern>

<pattern>*.jws</pattern>

<pattern>/test/*</pattern>

    </excludes>

sitemesh装饰模式的强大就不用说了,但使用过程中遇到的最郁闷的莫过于排除装饰action的困扰了,例如使用某个ajax请求要求返回不装饰的数据,但sitemesh却死活给你装饰了,以前用了个小技巧绕过了sitemesh的装饰--在返回的头部声明为xml类型:ServletActionContext.getResponse().setContentType("text/xml;charset=utf-8");

看了文档知道sitemesh默认装饰所有text/html的页面的,要装饰其他类型的页面还得自己配置。

但是总觉得这样很麻烦,况且有些页面是对外公开的api页面,只需要显示内容给其他iframe嵌入,这个时候如何排除呢?

在excludes里面排除的却总是不起作用!

经过查阅文档和不断的实践终于发现无法排除的原因了,原来排除的是相对于url目录层次的,而非文件所在的目录!

<!-- 在excludes元素下指定的页面将不会由SiteMesh来装饰 -->

<excludes>

<pattern>/index.jsp</pattern>

<pattern>/scripts/*.*</pattern>

<pattern>/htmleditor/*.*</pattern>

<pattern>/chart/*.*</pattern>//排除chart目录下的所有action请求

<pattern>/flash/*.*</pattern>

<pattern>/other/*.*</pattern>

<pattern>/remote_requst.action*</pattern>//排除根目录下的remote_requst.action包括带参数的请求,如果action后面不带*则只能排除不带参数的请求

 </excludes>

<decorator name="global" page="global.ftl">

<pattern>*.action</pattern>

</decorator>

<decoratorname="editor"page="blog.ftl"webapp="/editor/">

<pattern>/editor/*.action</pattern>

</decorator>

<decoratorname="browser"page="blog.ftl"webapp="/browser/">

<pattern>/browser/*.action</pattern>

</decorator>

<decoratorname="admin"page="admin.ftl"webapp="/admin/">

<pattern>/admin/*.action</pattern>

</decorator>