Home >Database >Mysql Tutorial >JJSP模板应用指南(上)_MySQL

JJSP模板应用指南(上)_MySQL

WBOYWBOYWBOYWBOYWBOYWBOYWBOYWBOYWBOYWBOYWBOYWBOYWB
WBOYWBOYWBOYWBOYWBOYWBOYWBOYWBOYWBOYWBOYWBOYWBOYWBOriginal
2016-06-01 14:07:253356browse



使用JSP模板来封装网页布局

  Window 工具包提供了一种典型的布局机制,比如说在一个容器中确定部件元素的位置。在AWT 和 Swing都有布局管理器,而在VisualWorks Smalltalk中有wrapper。本文将介绍一种JSP模板机制,它允许布局被封装和重新利用。JSP模板最小化了布局改变所造成的影响,这里我们将鼓励大家采用封装模块化设计。

  尽管 Web开发工具的改进非常迅速,但是它们仍然落后于图形用户界面(GUI)工具包(Swing 和 VisualWorks Smalltalk)。例如,在传统的GUI工具包中提供了布局管理器,在一个窗体或另一个窗体中,允许布局运算被封装和重新利用。本文介绍的这种JSP模板机制,就象布局管理器一样,可以封装布局,所以它能够被重新利用而不只是复制使用。

  由于在布局的发展过程中出现了许多的变化,而对功能的封装是非常重要的一步,它能够被自如修改而做到对其他应用的影响最小。


  JSP没有提供对封装布局的直接支持,所以具有统一格式的网页通常可以复制布局代码;例如,在图1中,显示了一个网页,它包含了标题、页脚、工具条以及页面的主要内容。

JJSP模板应用指南(上)
  图1.网页布局 点击放大(22 KB)

  在图1中显示的网页布局将以HTML表格标签来执行:

  例1.包含内容:

  

JSPtemplates

  

  

  

    

  

  


      

      

      

      


    


  

  在上面的例子中,包括了JSP include 命令,它允许页面内容改变――通过改变包含的文件――无须修改网页自身。不过,由于布局是很难被编码的,布局改变需要对网页进行修改。如果一个网站有多个相同格式的页面,那么一般情况下甚至简单布局的改变也涉及到整个页面的修改。

  为了减少布局改变所造成的影响,我们需要一种仅仅只包含布局的机制;采用这种机制,布局和内容都可以在不修改文件的情况下分开进行修改。这种机制就是JSP模板。

使用模板
  模板是一种JSP文件,它包含了参数化了的内容。这里所讨论的模板使用的是一套定制化标签来执行的:template:get,template:put和template:insert。template:get 标签访问参数化的内容,就象在例 2.a中的一样,它将和图 1一样的格式来生成网页。

  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

  

  

    

    

  

  
JJSP模板应用指南(上) JJSP模板应用指南(上)



  由于header.html 是被包含的内容,所以它不必在需要显示标头的页面中复制其代码。而且,尽管header.html 是一个HTML文件,但是在文件中并没有使用一般的起始HTML标签(比如或),因为这些标签都将被模板定义。由于在模板中包含了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 (这是登陆页面所缺乏的)用来改变清单。

JJSP模板应用指南(上)
  图 2.a.一个登陆窗口 点击放大(24 KB)

JJSP模板应用指南(上)
  图 2.B.一个清单页 点击放大(42 KB)

  下面,你会发现模板将被登录和清单页面共用:

  

  ……

  

  

    

  

    

  

    

  

  

  


  ……

  清单页面使用了上面的模板以及专门用于编辑Panel的内容:

  

  

  

   ……

  
            content='/editPanelContent.jsp'/>

   ……

  

  与上面相对照,登录页面没有专门用于编辑Panel的内容:

  

  

  

  

  
           content='/login.jsp'/>

  

  

  由于登录页面中没有专门用于编辑Panel的内容,所以它没有包括。

基于Role的内容
  Web应用程序常常会基于不同的用户生成不同的内容。 例如,相同的 JSP模板,只有当用户为管理员的时候才出现编辑Panel,下面是得出的两个不同的页面(如图3.a和3.b.)

JJSP模板应用指南(上)
  图 3.a. 管理员的清单页面 点击放大(27 KB)

JJSP模板应用指南(上)
  图 3.b.其他用户的清单页面 点击放大(21 KB)

  在图3.a和3.b中的模板使用了template:get的 role 属性:

  

  ......

  

   ......

  

   ......

  


  ......

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

   }

  }

Statement:
The content of this article is voluntarily contributed by netizens, and the copyright belongs to the original author. This site does not assume corresponding legal responsibility. If you find any content suspected of plagiarism or infringement, please contact admin@php.cn