主頁 > 知識(shí)庫 > JSP模板應(yīng)用指南(上)

JSP模板應(yīng)用指南(上)

熱門標(biāo)簽:地圖標(biāo)注創(chuàng)業(yè)項(xiàng)目入駐 電銷外呼系統(tǒng) 排行榜 地圖標(biāo)注制作道路 山東智能云外呼管理系統(tǒng) 廣州三五防封電銷卡 長春回?fù)芡夂粝到y(tǒng)廠家 四川電信外呼系統(tǒng)靠譜嗎 珠海銷售外呼系統(tǒng)運(yùn)營商 外呼系統(tǒng)啥意思
Window 工具包提供了一種典型的布局機(jī)制,比如說在一個(gè)容器中確定部件元素的位置。在AWT 和 Swing都有布局管理器,而在VisualWorks Smalltalk中有wrapper。本文將介紹一種JSP模板機(jī)制,它允許布局被封裝和重新利用。JSP模板最小化了布局改變所造成的影響,這里我們將鼓勵(lì)大家采用封裝模塊化設(shè)計(jì)。

  盡管 Web開發(fā)工具的改進(jìn)非常迅速,但是它們?nèi)匀宦浜笥趫D形用戶界面(GUI)工具包(Swing 和 VisualWorks Smalltalk)。例如,在傳統(tǒng)的GUI工具包中提供了布局管理器,在一個(gè)窗體或另一個(gè)窗體中,允許布局運(yùn)算被封裝和重新利用。本文介紹的這種JSP模板機(jī)制,就象布局管理器一樣,可以封裝布局,所以它能夠被重新利用而不只是復(fù)制使用。

  由于在布局的發(fā)展過程中出現(xiàn)了許多的變化,而對(duì)功能的封裝是非常重要的一步,它能夠被自如修改而做到對(duì)其他應(yīng)用的影響最小。

  JSP沒有提供對(duì)封裝布局的直接支持,所以具有統(tǒng)一格式的網(wǎng)頁通常可以復(fù)制布局代碼;例如,在圖1中,顯示了一個(gè)網(wǎng)頁,它包含了標(biāo)題、頁腳、工具條以及頁面的主要內(nèi)容。


  圖1.網(wǎng)頁布局 點(diǎn)擊放大(22 KB)

  在圖1中顯示的網(wǎng)頁布局將以HTML表格標(biāo)簽來執(zhí)行:

  例1.包含內(nèi)容:

  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 命令,它允許頁面內(nèi)容改變——通過改變包含的文件——無須修改網(wǎng)頁自身。不過,由于布局是很難被編碼的,布局改變需要對(duì)網(wǎng)頁進(jìn)行修改。如果一個(gè)網(wǎng)站有多個(gè)相同格式的頁面,那么一般情況下甚至簡單布局的改變也涉及到整個(gè)頁面的修改。

  為了減少布局改變所造成的影響,我們需要一種僅僅只包含布局的機(jī)制;采用這種機(jī)制,布局和內(nèi)容都可以在不修改文件的情況下分開進(jìn)行修改。這種機(jī)制就是JSP模板。

使用模板
  模板是一種JSP文件,它包含了參數(shù)化了的內(nèi)容。這里所討論的模板使用的是一套定制化標(biāo)簽來執(zhí)行的:template:get,template:put和template:insert。template:get 標(biāo)簽訪問參數(shù)化的內(nèi)容,就象在例 2.a中的一樣,它將和圖 1一樣的格式來生成網(wǎng)頁。

  例 2.a.一個(gè)模板

  %@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 如何運(yùn)行。

  template:get 使用了一個(gè)專門的名字(在請(qǐng)求的范圍內(nèi))來對(duì)一個(gè)Java Bean進(jìn)行修改。Bean包含了URI (統(tǒng)一資源標(biāo)志符,網(wǎng)頁的一個(gè)組件,它包含在template:get中)。例如,在例 2.a的模板列表中,template:get 獲得了一個(gè)URI——header.html——從一個(gè)名為header 的Bean中(在請(qǐng)求的范圍內(nèi))。接著在template:get 中包含了header.html。

  template:put 把Bean放到請(qǐng)求的范圍內(nèi)(此范圍將在后面被template:get修改)。 模板包含在template:insert中。 例 2.b中舉例說明了put 和 insert 標(biāo)簽的用法:

  例 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 開頭標(biāo)簽指定了被包含的模板,在這個(gè)例子里,模板在例2.a中。每一個(gè)put 標(biāo)簽在請(qǐng)求范圍內(nèi)存儲(chǔ)了一個(gè)Bean,而在insert 結(jié)尾標(biāo)簽包含了模板。模板接著象上面所描述的那樣訪問Bean。

  direct 的屬性能夠?yàn)閠emplate:put指定;如果direct 設(shè)置為true, 和標(biāo)簽相關(guān)聯(lián)的內(nèi)容將不包含在template: get中。

  一個(gè)網(wǎng)站包含了多頁相同格式的頁面,這樣就可以使用一個(gè)模板,比如在例 2.a中列出了一個(gè)模板,在許多的JSP網(wǎng)頁(例2.b)中,都用到了這個(gè)模板。

  使用模板的另一個(gè)好處是可以進(jìn)行模塊化設(shè)計(jì)。例如,例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 是被包含的內(nèi)容,所以它不必在需要顯示標(biāo)頭的頁面中復(fù)制其代碼。而且,盡管header.html 是一個(gè)HTML文件,但是在文件中并沒有使用一般的起始HTML標(biāo)簽(比如html>或body>),因?yàn)檫@些標(biāo)簽都將被模板定義。由于在模板中包含了header.html,這些標(biāo)簽在header.html就可以不必再使用了。

  注意:JSP提供了兩種方式來包含內(nèi)容:靜態(tài)方式,使用include命令;動(dòng)態(tài)方式,使用include action。include命令包含了目標(biāo)頁面的引用源,這和C語言中的#include和Java中的import相似。include action 包含了在運(yùn)行時(shí)間內(nèi)目標(biāo)所產(chǎn)生的響應(yīng)。

  與JSP include action一樣,模板包含有動(dòng)態(tài)內(nèi)容。所以,盡管在例1和例2.b中的JSP網(wǎng)頁在功能上是一致的,但是前面包含的靜態(tài)內(nèi)容被后面動(dòng)態(tài)的包含了。

可選內(nèi)容
  所有的模板內(nèi)容都是可選的,模板的內(nèi)容可以很容易的在更多的網(wǎng)頁中使用。例如,在圖 2.a和圖 2.B中顯示了兩個(gè)頁面——登錄和清單——它們使用的是同一個(gè)模板。兩個(gè)頁面中都包含一個(gè)標(biāo)頭、頁腳和主要內(nèi)容。清單頁面中有一個(gè)編輯Panel (這是登陸頁面所缺乏的)用來改變清單。


  圖 2.a.一個(gè)登陸窗口 點(diǎn)擊放大(24 KB)


  圖 2.B.一個(gè)清單頁 點(diǎn)擊放大(42 KB)

  下面,你會(huì)發(fā)現(xiàn)模板將被登錄和清單頁面共用:

  %@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的內(nèi)容:

  %@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>

  與上面相對(duì)照,登錄頁面沒有專門用于編輯Panel的內(nèi)容:

  %@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的內(nèi)容,所以它沒有包括。

基于Role的內(nèi)容
  Web應(yīng)用程序常常會(huì)基于不同的用戶生成不同的內(nèi)容。 例如,相同的 JSP模板,只有當(dāng)用戶為管理員的時(shí)候才出現(xiàn)編輯Panel,下面是得出的兩個(gè)不同的頁面(如圖3.a和3.b.)


  圖 3.a. 管理員的清單頁面 點(diǎn)擊放大(27 KB)


  圖 3.b.其他用戶的清單頁面 點(diǎn)擊放大(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 標(biāo)簽僅僅在用戶的Role 與Role屬性相匹配的時(shí)候才包含內(nèi)容。讓我們來看看標(biāo)簽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);

   }

  }

標(biāo)簽:吳忠 保定 紹興 潮州 玉樹 肇慶 北海 廣元

巨人網(wǎng)絡(luò)通訊聲明:本文標(biāo)題《JSP模板應(yīng)用指南(上)》,本文關(guān)鍵詞  JSP,模板,應(yīng)用,指南,上,JSP,;如發(fā)現(xiàn)本文內(nèi)容存在版權(quán)問題,煩請(qǐng)?zhí)峁┫嚓P(guān)信息告之我們,我們將及時(shí)溝通與處理。本站內(nèi)容系統(tǒng)采集于網(wǎng)絡(luò),涉及言論、版權(quán)與本站無關(guān)。
  • 相關(guān)文章
  • 下面列出與本文章《JSP模板應(yīng)用指南(上)》相關(guān)的同類信息!
  • 本頁收集關(guān)于JSP模板應(yīng)用指南(上)的相關(guān)信息資訊供網(wǎng)民參考!
  • 推薦文章