JSP模板應用指南(上)_JSP編程

來源:互聯網
上載者:User
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);

   }

  }

相關文章

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.