使用sitemesh
使用sitemesh建立复合视图 - 1.hello. 1
使用sitemesh建立复合视图 - 2.装饰器 decorator 4
sitemesh.xml 可以设置2种信息: 5
使用sitemesh建立复合视图- 3.其他讨论... 9
记事贴:我被AppFuse的SiteMesh折磨了2天!... 12
sitemesh简化布局... 14
用 SiteMesh 优雅地分离页面的内容与框架... 18
AppFuse里消息显示机制... 19
使用sitemesh建立复合视图 - 1.hello. 1
使用sitemesh建立复合视图 - 2.装饰器 decorator 4
sitemesh.xml 可以设置2种信息: 5
使用sitemesh建立复合视图- 3.其他讨论... 9
记事贴:我被AppFuse的SiteMesh折磨了2天!... 12
sitemesh简化布局... 14
用 SiteMesh 优雅地分离页面的内容与框架... 18
AppFuse里消息显示机制... 19
word文档下载:http://www.chq.name/component/option,com_docman/task,doc_download/gid,10/
使用sitemesh建立复合视图 - 1.hello
(作者:chen-neu ,提供给 huihoo.com 发布)
使用sitemesh建立复合视图 - 1.hello <- now
使用sitemesh建立复合视图 - 2.装饰器
使用sitemesh建立复合视图 - 3.其它讨论
sitemesh是opensymphony团队开发的j2ee应用框架之一,旨在提高页面的可维护性和复用性。opensymphony的另一个广为人知的框架为webwork是用作web层的表示框架。他们都是开源的,可以在www.sf.net下找到。
应用于以下大项目的例子:http://opensource.thoughtworks.com/projects/sitemesh.html
简介: |
||||||||||
sitemesh应用Decorator模式,用filter截取request和response,把页面组件head,content,banner结合为一个完整的视图。通常我们都是用include标签在每个jsp页面中来不断的包含各种header, stylesheet, scripts and footer,现在,在sitemesh的帮助下,我们可以开心的删掉他们了。如下图,你想轻松的达到复合视图模式,那末看完本文吧。
|
||||||||||
hello sitemesh: |
||||||||||
5.
最后访问index.jsp,将生成如下页面:
而且,所有的页面也会如同index.jsp一样,被sitemesh的filter使用装饰模式修改成如上图般模样,却不用再使用include标签。
|
使用sitemesh建立复合视图 - 2.装饰器 decorator
使用sitemesh建立复合视图 - 1.hello
使用sitemesh建立复合视图 - 2.装饰器 <- now
使用sitemesh建立复合视图 - 3.其它讨论
装饰器 decorator概念 |
||||||
建立可复用的web应用程序,一个通用的方法是建立一个分层系统,如同下面一个普通的web应用:
· 持久化框架 :hibernate/jdo 可糟糕的是前端的页面逻辑很难被复用,当你在每一个页面中用数之不尽的include来复用公共的header, stylesheet, scripts,footer时,一个问题出现了-重复的代码,每个页面必须用copy来复用页面结构,而当你需要创意性的改变页面结构时,灾难就爱上了你。 sitemesh通过filter截取request和response,并给原始的页面加入一定的装饰(可能为header,footer...),然后把结果返回给客户端,并且被装饰的原始页面并不知道sitemesh的装饰,这也就达到了脱耦的目的。 据说即将新出台的Portlet规范会帮助我们标准的实现比这些更多更cool的想法,但可怜的我还不懂它到底是一个什末东东,有兴趣的人可以研究
|
||||||
让我们看看怎样配置环境 |
||||||
除了要copy到WEB-INF/lib中的sitemesh.jar, copy到WEB-INF中的sitemesh-decorator.tld,sitemesh-page.tld文件外,还有2个文件要建立到WEB-INF/:
sitemesh.xml 可以设置2种信息:Page Parsers :负责读取stream的数据到一个Page对象中以被SiteMesh解析和操作。(不太常用,默认即可) Decorator Mappers : 不同的装饰器种类,我发现2种比较有用都列在下面。一种通用的mapper,可以指定装饰器的配置文件名,另一种可打印的装饰器,可以允许你当用http://localhost/aaa/a.html?printable=true方式访问时给出原始页面以供打印(免得把header,footer等的花哨的图片也搭上) 范例:
decorators.xml :定义构成复合视图的所有页面构件的描述(主要结构页面,header,footer...),如下例:
|
||||||
最重要的是写出装饰器本身(也就是那些要复用页面,和结构页面)。 |
||||||
其实,重要的工作就是制作装饰器页面本身(也就是包含结构和规则的页面),然后把他们描述到decorators.xml中。 让我们来先看一看最简单的用法:其实最常用也最简单的用法就是我们的hello例子,面对如此众多的技术,我想只要达到功能点到为止即可,没必要去研究太深(除非您有更深的需求)。
我们在装饰器页面只用了2个标签: 然后我们在decorator.xml中加入以下描述即可:
这样,请求的所有页面都会被重新处理,并按照main.jsp的格式重新展现在你面前。
|
||||||
让我们看看更多的用法。(抄袭sitemesh文档) |
||||||
以下列着全部标签:
插入原始页面(被包装页面)的head标签中的内容(不包括head标签本身)。 插入原始页面(被包装页面)的body标签中的内容。 插入原始页面(被包装页面)的title标签中的内容,还可以添加一个缺省值。 例: /_decorator/main.jsp中 (装饰器页面): /aaa.jsp中 (原始页面): 访问/aaa.jsp的结果: 在标签处插入原始页面(被包装页面)的原有的标签的属性中的内容,还可以添加一个缺省值。 sitemesh文档中的例子很好理解: 注意, DE> writeEntireProperty="true"会在插入内容前加入一个空格。 DE>
例:可用
应用包装器到指定的页面上,一般用于被包装页面中主动应用包装器。这个标签有点不好理解,我们来看一个例子: 包装器页面 /_decorators/panel.jsp: 并且在decorators.xml中有 一个公共页面,即将被panel包装:/_public/date.jsp: ... <%=new java.util.Date()%> ... 被包装页面 /page.jsp : ..... 最后会是什末结果呢?除了/page.jsp会被默认的包装页面包装上header,footer外,page.jsp页面中还内嵌了date.jsp页面,并且此date.jsp页面还会被panel.jsp包装为一个title加body的有2段的页面,第1段是date.jsp的title,第2段是date.jsp的body内容。 另外,page:applyDecorator中包含的page:param标签所声明的属性值还可以在包装页面中用decorator:getProperty标签访问到。 |
使用sitemesh建立复合视图 - 3.其他讨论
使用sitemesh建立复合视图 - 1.hello
使用sitemesh建立复合视图 - 2.装饰器
使用sitemesh建立复合视图 - 3.其它讨论 <- now
前面的文章已经足以应用sitemesh来改善您的应用,但我发现还有一些其他的东东可能也会对大家有所帮助
可打印的界面装饰 |
|
前面说过有1种可打印的装饰器,可以允许你当用http://localhost/aaa/a.html?printable=true方式访问时,应用其他的装饰器(自己指定),给出原始页面以供打印(免得把header,footer等的花哨的图片也搭上)。 让我们来看一看怎样实现他: 1.首先在WEB-INFO/sitemesh.xml中设置: 2.在WEB-INFO/decorators.xml中定义相应的printable装饰器 3.最后编写printable装饰器/decorators/printable.jsp
这样就可以让一个原始页面通过?printable=true开关来切换不同的装饰器页面。
|
中文问题 |
由于sitemesh内部所使用的缺省字符集为iso-8859-1,直接使用会产生乱码,我们可以通过以下方法纠正之:
|
总结:使用sitemesh最通常的途径: |
1.配置好环境, 2.在WEB-INFO/decroators.xml中描述你将建立的包装器。 3.开发在decroators.xml中描述的包装器,最好存放在/_decorators目录下 4.ok ,可以看看辛勤的成果了 :) |
资源:
关于作者:
陈鹏,西安东软公司。作为一名狂热的程序员希望每一天都能成长进步,并希望与大家分享快乐和知识。
请用以下方式和他联系:email chen56@msn.com
兔八哥 (http://tb.blog.csdn.net/TrackBack.aspx?PostId=248919)
因为AppFuse中使用的默认的JSP模板为SiteMesh,默认情况下,所有的请求都会被SiteMesh所装饰,所以我要实现点击文件链接,直接下载文件时却得不到正确格式的文件,得到的是一个html文件,即使制定了下载文件的类型:如:application/msexcel或者其他的类型都不行,我分析是因为,我首先向输出流中写了些东西,后来被SiteMesh使用getWriter方法给冲掉了,所以得到的是默认的网页文件,我折腾了2天,痛不欲生,刚刚解决掉这个问题,解决方法如下:
1.将下载文件的jsp放到一个特殊的目录下,我的放在download目录,这样可以区分需要被sitemesh装饰和不需要被它装饰的文件。
2.配置sitemesh的decorators.xml:
这个配置指明download下的文件不需要被sitemesh装饰。
我的下载文件的页面代码是试验代码,稍加修改就可以正式使用,代码如下:
<%@ page import= "java.io.*,java.net.*" %><%
try{
//取得虚拟的路径
String fn = "attachment; filename=a.xls"; //必须改为UniCode编码的字符串
System.out.println(fn);
//把标题、内容写到输出流中
response.setHeader("Content-Disposition", new String(fn.getBytes("GB2312"),
"ISO-8859-1"));
createOutput( response.getOutputStream(),"c:\ltf.xls");
}catch( Exception ee ){
ee.printStackTrace();
}
%><%!
public void createOutput( OutputStream out,String realpath ) throws IOException {
int b;
BufferedInputStream m_input =
new BufferedInputStream( new FileInputStream(realpath) );
while( (b = m_input.read()) != -1 ){
out.write(b);
}
m_input.close();
out.flush();
out.close();
}
%>
<%--
// 得到文件名字和路径
String filename = request.getParameter("zipfilename");
//String jsppath = ""; getServletConfig().getServletContext().getRealPath("") +
String filepath = "c:\ltf.xls"; //jsppath.substring(0,jsppath.lastIndexOf("")) + "reports\";
System.out.println("---------------=================" + filepath);
java.io.FileInputStream fileInputStream = null;
//out.println(filepath);
// 设置响应头和下载保存的文件名
response.setHeader("Content-Disposition",
"attachment; filename=" + "a.xls");
response.setContentType("application/msexcel");
// 打开指定文件的流信息
try{
fileInputStream =
new java.io.FileInputStream(filepath);
// 写出流信息
int i;
while ((i=fileInputStream.read()) != -1) {
out.write(i);
}
fileInputStream.close();
out.close();
System.out.println("---OK---------------");
}catch(Exception ee){
ee.printStackTrace();
}
--%>
sitemesh简化布局
sitemesh一个系统,添加到Web应用中并促进模式HTML世界里的应用。
可从http://www.opensymphony.com/sitemesh/ 获得。
sitemesh仅处理html的内容,象图象,PDF文件和下载这样的媒体是被忽略的。
下面我们将用实例来介绍如何分析内容网页和装饰器如何被映射到网页。以及从sitemesh中获取
信息的一些技术。
整个事例用到login.jsp, date.jsp , 索引的index.html
配置文件decorators.xml
装饰文件:window.jsp ,simple.jsp
运用的样式表:style.css
目标是把内容与布局分离,一达到简化布局,以及重用代码的作用。
实质是使用simple.jsp,window.jsp以及提取的longin.jsp,date,jsp的实际主体来构成最终显示
给用户的页面。
布局主体是simple.jsp控制:它控制了网页的整体架构。
<%@ taglib uri="sitemesh-decorator" prefix="decorator" %>
<%@ taglib uri="sitemesh-page" prefix="page" %>
"stylesheet" href="decorators/style.css">
class="title" colspan="2"> | |
class="body" valign="top"> | "top"> This site is not legally binding in any way. All rights reserved. Elvis has left the building. |
class="footer" valign="top" colspan="2"> Title: Author: |
"decorators/snazzy.gif"> |
---|