|
![]() |
名片设计 CorelDRAW Illustrator AuotoCAD Painter 其他软件 Photoshop Fireworks Flash |
|
Window 工具包提供了一种典型的布局机制,比如说在一个容器中确定部件元素的位置。在AWT 和 Swing都有布局治理器,而在VisualWorks Smalltalk中有wrapper。本文将介绍一种JSP模板机制,它答应布局被封装和重新利用。JSP模板最小化了布局改变所造成的影响,这里我们将鼓励大家采用封装模块化设计。 尽管 Web开发工具的改进异常快速,但是它们仍旧落后于图形用户界面(GUI)工具包(Swing 和 VisualWorks Smalltalk)。例如,在传统的GUI工具包中提供了布局治理器,在一个窗体或另一个窗体中,答应布局运算被封装和重新利用。本文介绍的这种JSP模板机制,就象布局治理器相同,可以封装布局,所以它能够被重新利用而不只是复制使用。 由于在布局的发展过程中出现了许多的变化,而对功能的封装是异常重要的一步,它能够被自如修改而做到对其他应用的影响最小。 JSP没有提供对封装布局的直接支持,所以具有统一格式的网页通常可以复制布局代码;例如,在图1中,显示了一个网页,它包含了标题、页脚、工具条以及页面的主要内容。 图1.网页布局 点击放大(22 KB) 在图1中显示的网页布局将以HTML表格标签来执行: 例1.包含内容: <html><head><title>JSPtemplates</title></head> <body background=\\\'graphics/background.jpg\\\'> <table> <tr valign=\\\'top\\\'><td><%@include file=\\\'sidebar.html\\\'%></td> <td><table> <tr><td><%@include file=\\\'header.html\\\'%></td></tr> <tr><td><%@include file=\\\'introduction.html\\\'%></td></tr> <tr><td><%@include file=\\\'footer.html\\\'%></td></tr> </table> </td> </tr> </table> </body></html> 在上面的例子中,包括了JSP include 命令,它答应页面内容改变――通过改变包含的文件――无须修改网页自身。不过,由于布局是很难被编码的,布局改变需要对网页进行修改。假如一个网站有多个一样格式的页面,那么一般情况下甚至简朴布局的改变也涉及到整个页面的修改。 为了减少布局改变所造成的影响,我们需要一种仅仅只包含布局的机制;采用这种机制,布局和内容都可以在不修改文件的情况下分开进行修改。这种机制就是JSP模板。 使用模板 模板是一种JSP文件,它包含了参数化了的内容。这里所讨论的模板使用的是一套定制化标签来执行的:template:get,template:put和template:insert。template:get 标签访问参数化的内容,就象在例 2.a中的相同,它将和图 1相同的格式来生成网页。 例 2.a.一个模板 <%@taglib uri=\\\'/WEB-INF/tlds/template.tld\\\' prefix=\\\'template\\\' %> <html><head><title><template:get name=\\\'title\\\'/></title></head> <body background=\\\'graphics/background.jpg\\\'> <table> <tr valign=\\\'top\\\'><td><template:get name=\\\'sidebar\\\'/></td> <td><table> <tr><td><template:get name=\\\'header\\\'/></td></tr> <tr><td><template:get name=\\\'content\\\'/></td></tr> <tr><td><template:get name=\\\'footer\\\'/></td></tr> </table> </td> </tr> </table> </body></html> 例 2.a几乎与例1完全相同,不过在例2.a中我们使用了template:get 取代了例1中的include 命令.让我们来分析一下template:get 如何运行。 template:get 使用了一个专门的名字(在哀求的范围内)来对一个Java Bean进行修改。Bean包含了URI (统一资源标志符,网页的一个组件,它包含在template:get中)。例如,在例 2.a的模板列表中,template:get 获得了一个URI――header.html――从一个名为header 的Bean中(在哀求的范围内)。接着在template:get 中包含了header.html。 template:put 把Bean放到哀求的范围内(此范围将在后面被template:get修改)。 模板包含在template:insert中。 例 2.b中举例说明了put 和 insert 标签的用法: 例 2.b. 从例2.a中使用模板 <%@taglib uri=\\\'/WEB-INF/tlds/template.tld\\\' prefix=\\\'template\\\' %> <template:inserttemplate=\\\'/articleTemplate.jsp\\\'> <template:put name=\\\'title\\\' content=\\\'Templates\\\' direct=\\\'true\\\'/> <template:put name=\\\'header\\\' content=\\\'/header.html\\\' /> <template:put name=\\\'sidebar\\\' content=\\\'/sidebar.jsp\\\' /> <template:put name=\\\'content\\\' content=\\\'/introduction.html\\\'/> <template:put name=\\\'footer\\\' content=\\\'/footer.html\\\' /> </template: insert> 在insert 开头标签指定了被包含的模板,在这个例子里,模板在例2.a中。每一个put 标签在哀求范围内存储了一个Bean,而在insert 结尾标签包含了模板。模板接着象上面所描述的那样访问Bean。 direct 的属性能够为template:put指定;假如direct 设置为true, 和标签相关联的内容将不包含在template: get中。 一个网站包含了多页一样格式的页面,这样就可以使用一个模板,比如在例 2.a中列出了一个模板,在许多的JSP网页(例2.b)中,都用到了这个模板。 使用模板的另一个好处是可以进行模块化设计。例如,例2.b中列出的JSP 文件中包含了header.html,让我们再来看下面的例2.c。 例2.c. header.html <table> <tr> <td><img src=\\\'graphics/java.jpg\\\'/></td> <td><img src=\\\'graphics/templates.jpg\\\'/></td> </tr> </table><hr> 由于header.html 是被包含的内容,所以它不必在需要显示标头的页面中复制其代码。而且,尽管header.html 是一个HTML文件,但是在文件中并没有使用一般的起始HTML标签(比如<html>或<body>),因为这些标签都将被模板定义。由于在模板中包含了header.html,这些标签在header.html就可以不必再使用了。 注重:JSP提供了两种方法来包含内容:静态方法,使用include命令;动态方法,使用include action。include命令包含了目标页面的引用源,这和C语言中的#include和Java中的import相似。include action 包含了在运行时间内目标所产生的响应。 与JSP include action相同,模板包含有动态内容。所以,尽管在例1和例2.b中的JSP网页在功能上是一致的,但是前面包含的静态内容被后面动态的包含了。 可选内容 所有的模板内容都是可选的,模板的内容可以很轻易的在更多的网页中使用。例如,在图 2.a和图 2.B中显示了两个页面――登录和清单――它们使用的是同一个模板。两个页面中都包含一个标头、页脚和主要内容。清单页面中有一个编辑Panel (这是登陆页面所缺乏的)用来改变清单。 图 2.a.一个登陆窗口 点击放大(24 KB) 图 2.B.一个清单页 点击放大(42 KB) 下面,你会发现模板将被登录和清单页面共用: <%@taglib uri=\\\'template.tld\\\' prefix=\\\'template\\\' %> …… <table width=\\\'670\\\'> <tr><td width=\\\'60\\\'></td> <td><template:get name=\\\'header\\\'/></td></tr> <tr><td width=\\\'60\\\'></td> <td><template:get name=\\\'main-content\\\'/></td></tr> <tr><td width=\\\'60\\\'></td> <td><template:get name=\\\'editPanel\\\'/></td></tr> <tr><td width=\\\'60\\\'></td> <td><template:get name=\\\'footer\\\'/></td></tr> </table> …… 清单页面使用了上面的模板以及专门用于编辑Panel的内容: <%@taglib uri=\\\'template.tld\\\' prefix=\\\'template\\\' %> <%@taglib uri=\\\'security.tld\\\' prefix=\\\'security\\\' %> <template:inserttemplate=\\\'/template.jsp\\\'> …… <template:put name=\\\'editPanel\\\' content=\\\'/editPanelContent.jsp\\\'/> …… </template:insert> 与上面相对照,登录页面没有专门用于编辑Panel的内容: <%@taglib uri=\\\'template.tld\\\' prefix=\\\'template\\\' %> <template:inserttemplate=\\\'/template.jsp\\\'> <template:put name=\\\'title\\\' content=\\\'Login\\\' direct=\\\'true\\\'/> <template:put name=\\\'header\\\' content=\\\'/header.jsp\\\'/> <template:put name=\\\'main-content\\\' content=\\\'/login.jsp\\\'/> <template:put name=\\\'footer\\\' content=\\\'/footer.jsp\\\'/> </template:insert> 由于登录页面中没有专门用于编辑Panel的内容,所以它没有包括。 基于Role的内容 Web应用程序经常会基于不同的用户生成不同的内容。 例如,一样的 JSP模板,只有当用户为治理员的时候才出现编辑Panel,下面是得出的两个不同的页面(如图3.a和3.b.) 图 3.a. 治理员的清单页面 点击放大(27 KB) 图 3.b.其他用户的清单页面 点击放大(21 KB) 在图3.a和3.b中的模板使用了template:get的 role 属性: <%@taglib uri=\\\'template.tld\\\' prefix=\\\'template\\\' %> ...... <table> ...... <td><template:get name=\\\'editPanel\\\' role=\\\'curator\\\'/></td></tr> ...... </table> ...... get 标签仅仅在用户的Role 与Role属性相匹配的时候才包含内容。让我们来看看标签handler是如何使用Role属性的: public class GettagextendstagSupport { private String name = null, role = null; ...... public void setRole(String role) { this.role = role; } ...... public int doStartTag() throws JspException { ...... if(param != null) { if(roleIsValid()) { // include or print content ...... } } ...... } private boolean roleIsValid() { return role == null || // valid if role isn\\\'t set ((javax.Servlet.http.HttpServletRequest) pageContext.getRequest()).isUserInRole(role); } } 返回类别: 教程 上一教程: 如何将做好的JAVA程序生成可执行文件 下一教程: 八、设置HTTP应答头 您可以阅读与"JSP模板应用指南(上)"相关的教程: · JSP模板应用指南(下) · 用JSP/ASP创建WAP应用 · 用缓冲技术提高JSP应用的性能和稳定性 · 应用JDOM处理数据库到XML转变的JSP实现 · 教您配置Web应用环境实现JSP留言簿开发 |
![]() ![]() |
快精灵印艺坊 版权所有 |
首页![]() ![]() ![]() ![]() ![]() ![]() ![]() |