JSP模板应用指南(上)

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);

   }

  }

(0)

相关推荐

  • JSP模板应用指南(上)

    Window 工具包提供了一种典型的布局机制,比如说在一个容器中确定部件元素的位置.在AWT 和 Swing都有布局管理器,而在VisualWorks Smalltalk中有wrapper.本文将介绍一种JSP模板机制,它允许布局被封装和重新利用.JSP模板最小化了布局改变所造成的影响,这里我们将鼓励大家采用封装模块化设计. 尽管 Web开发工具的改进非常迅速,但是它们仍然落后于图形用户界面(GUI)工具包(Swing 和 VisualWorks Smalltalk).例如,在传统的GUI工具包

  • JSP模板应用指南(下)

    执行模板 这里所讨论的模板将在三种定制标签下执行: Template: insert Template: put Template: get insert 标签中包含一个模板,但是在包含之前,put 标签存储有一些信息--name, URI和Boolean 值(用来指定将内容是包含还是直接显示)--关于模板所包含的内容.在template:get中包含(或显示)了指定的内容,随后将访问这些信息. template:put 把Bean 存储在请求区域(但并不直接存储),因为如果两个模板使用了相同的

  • servlet+JSP+mysql实现文件上传的方法

    本文实例讲述了servlet+JSP+mysql实现文件上传的方法.分享给大家供大家参考,具体如下: 一.文件上传的基本操作: 1. 表单属性enctype的设置 multipart/form-data和application/x-www-form-urlencoded的区别 FORM元素的enctype属性指定了表单数据向服务器提交时所采用的编码类型,默认的缺省值是"application/x-www-form-urlencoded". 然而,在向服务器发送大量的文本.包含非ASCI

  • JSP中图片的上传与显示方法实例详解

    本文实例讲述了JSP中图片的上传与显示方法.分享给大家供大家参考.具体如下: 1.引言 数据库应用程序,特别是基于WEB的数据库应用程序,常会涉及到图片信息的存储和显示.通常我们使用的方法是将所要显示的图片存在特定的目录下,在数据库中保存相应的图片的名称,在JSP中建立相应的数据源,利用数据库访问技术处理图片信息.但是,如果我们想动态的显示图片,上述方法就不能满足需要了.我们必须把图片存入数据库,然后通过编程动态地显示我们需要的图片.实际操作中,可以利用JSP的编程模式来实现图片的数据库存储和显

  • Jsp+Servlet实现文件上传下载 删除上传文件(三)

    接着上一篇讲:Jsp+Servlet实现文件上传下载(二)--文件列表展示 本章来实现一下删除已上传文件,同时优化了一下第一章中的代码. 废话少说,上代码得意 1.调整列表页面list.jsp <%@ page contentType="text/html;charset=UTF-8" language="java" %> <%@ taglib prefix="c" uri="http://java.sun.com/j

  • Jsp+Servlet实现文件上传下载 文件列表展示(二)

    接着上一篇讲: Jsp+Servlet实现文件上传下载(一)--文件上传 本章来实现一下上传文件列表展示,同时优化了一下第一章中的代码. 废话少说,上代码 mysql创建附件表 DROP TABLE tbl_accessory; CREATE TABLE tbl_accessory ( id INT AUTO_INCREMENT PRIMARY KEY, file_name VARCHAR(500), file_size DOUBLE(10,2), file_ext_name VARCHAR(1

  • JSP+Servlet实现文件上传到服务器功能

    本文实例为大家分享了JSP+Servlet实现文件上传到服务器功能的具体代码,供大家参考,具体内容如下 项目目录结构大致如下: 正如我在上图红线画的三个东西:Dao.service.servlet 这三层是主要的结构,类似 MVC 架构,Dao是模型实体类(逻辑层),service是服务层,servlet是视图层,三者协作共同完成项目. 这里的User是由user表来定义的一个类,再封装增删改查等操作,实现从数据库查询与插入,修改与删除等操作,并实现了分页操作,也实现了将图片放到服务器上运行的效

  • jsp+servlet实现文件上传与下载功能

    本文实例为大家分享了jsp servlet实现文件上传与下载的具体代码,供大家参考,具体内容如下 上传: 需要导入两个包:commons-fileupload-1.2.1.jar,commons-io-1.4.jar import java.io.File; import java.io.IOException; import java.util.List; import javax.servlet.ServletException; import javax.servlet.http.Http

  • jsp+servlet简单实现上传文件功能(保存目录改进)

    1.jsp前端 <%-- Created by IntelliJ IDEA. User: Lenovo Date: 2020/6/19 Time: 22:53 Learn from https://www.bilibili.com/video/BV18z411i7gh?t=23&p=192 To change this template use File | Settings | File Templates. --%> <%@ page contentType="te

  • Java编程之如何通过JSP实现头像自定义上传

    目录 开发概述 开发环境 开发过程 1.JSP前台页面 样式图: JS操作 2.数据库的设计 数据库表: 实体类:UsersInfo.java 3.数据库操作 UsersMapper UsersMapper.xml 4.Servlet 5.工具类 DownloadImage:下载指定路径下的文件到本地指定目录 TimeRandom:生成年月日时分秒+8位随机数 6.最终效果展示 总结 开发概述 本次项目意在实现一种可以在本地选择图片,然后将其上传至服务器指定文件目录下,并可以通过服务器自动生成的

随机推荐