亚洲香蕉成人av网站在线观看_欧美精品成人91久久久久久久_久久久久久久久久久亚洲_热久久视久久精品18亚洲精品_国产精自产拍久久久久久_亚洲色图国产精品_91精品国产网站_中文字幕欧美日韩精品_国产精品久久久久久亚洲调教_国产精品久久一区_性夜试看影院91社区_97在线观看视频国产_68精品久久久久久欧美_欧美精品在线观看_国产精品一区二区久久精品_欧美老女人bb

首頁 > 編程 > JSP > 正文

JSP模板應用指南(上)

2024-09-05 00:19:27
字體:
來源:轉載
供稿:網友
菜鳥學堂:

使用jsp模板來封裝網頁布局

  window 工具包提供了一種典型的布局機制,比如說在一個容器中確定部件元素的位置。在awt 和 swing都有布局管理器,而在visualworks smalltalk中有wrapper。本文將介紹一種jsp模板機制,它允許布局被封裝和重新利用。jsp模板最小化了布局改變所造成的影響,這里我們將鼓勵大家采用封裝模塊化設計。

  盡管 工具的改進非常迅速,但是它們仍然落后于圖形用戶界面(gui)工具包(swing 和 visualworks smalltalk)。例如,在傳統的gui工具包中提供了布局管理器,在一個窗體或另一個窗體中,允許布局運算被封裝和重新利用。本文介紹的這種jsp模板機制,就象布局管理器一樣,可以封裝布局,所以它能夠被重新利用而不只是復制使用。

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

  jsp沒有提供對封裝布局的直接支持,所以具有統一格式的網頁通??梢詮椭撇季执a;例如,在圖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='http://www.pushad.com/info/graphics/java.jpg'/></td>

     <td><img src='http://www.pushad.com/info/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);

   }

  }

發表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發表
亚洲香蕉成人av网站在线观看_欧美精品成人91久久久久久久_久久久久久久久久久亚洲_热久久视久久精品18亚洲精品_国产精自产拍久久久久久_亚洲色图国产精品_91精品国产网站_中文字幕欧美日韩精品_国产精品久久久久久亚洲调教_国产精品久久一区_性夜试看影院91社区_97在线观看视频国产_68精品久久久久久欧美_欧美精品在线观看_国产精品一区二区久久精品_欧美老女人bb
亚洲欧美精品伊人久久| 久久久久久久久综合| 在线播放日韩专区| 日韩人体视频一二区| 成人免费观看49www在线观看| 亚洲精品丝袜日韩| 亚洲视频一区二区| 国产精品高潮呻吟久久av野狼| 久久视频这里只有精品| 亚洲人成电影在线| 亚洲乱码国产乱码精品精| 欧美成人精品在线观看| 久久精品久久久久电影| 久久97精品久久久久久久不卡| 日韩av电影在线免费播放| 久久久久久久久久久国产| 久久成年人视频| 91久久精品国产91久久| 激情av一区二区| 亚洲欧洲一区二区三区久久| 欧美国产高跟鞋裸体秀xxxhd| 国产裸体写真av一区二区| 亚洲精品一区久久久久久| 亚洲欧洲日韩国产| 一区二区三区视频在线| 久久久久久久影视| 伊人久久综合97精品| 欧美日本中文字幕| 色噜噜狠狠狠综合曰曰曰88av| 亚洲欧美福利视频| 国产一区二区精品丝袜| 亚洲综合中文字幕在线| 久久九九有精品国产23| 韩剧1988在线观看免费完整版| 精品久久久久久久久久久久久久| 欧美精品www| 激情av一区二区| 黑人巨大精品欧美一区二区三区| 国外成人在线播放| 国产成人精品亚洲精品| 亚洲自拍偷拍在线| 91免费在线视频网站| 亚洲欧美精品一区| 中文字幕国产精品久久| 久久精品视频免费播放| 国语自产在线不卡| 欧洲亚洲在线视频| 7m第一福利500精品视频| 亚洲在线一区二区| 韩国欧美亚洲国产| 日韩av最新在线| 最好看的2019年中文视频| 亚洲理论在线a中文字幕| 久久久久久一区二区三区| 亚洲福利视频免费观看| 国产99视频在线观看| 国产色婷婷国产综合在线理论片a| 欧美精品在线免费播放| 91久久国产精品91久久性色| 中文欧美日本在线资源| 国产精品久久久久aaaa九色| 欧美精品激情在线观看| 久久亚洲春色中文字幕| 欧美日韩精品在线视频| 91国产精品视频在线| 亚洲性av网站| 国产福利视频一区二区| 国内偷自视频区视频综合| 欧美极度另类性三渗透| 亚洲欧美国产制服动漫| 国产国语刺激对白av不卡| 伊人久久久久久久久久久久久| 国产精品爽爽爽爽爽爽在线观看| 国产一区二区在线免费视频| 久久99精品国产99久久6尤物| 欧美xxxx做受欧美| 人九九综合九九宗合| 欧美丰满少妇xxxx| 88国产精品欧美一区二区三区| 亚洲理论在线a中文字幕| 日韩欧美国产激情| 国产精品一区电影| 日韩av综合中文字幕| 国产精品一区二区久久久久| 日韩欧美在线字幕| 亚洲精品国产精品久久清纯直播| 97av在线播放| 亚洲国产欧美一区二区三区同亚洲| 在线日韩欧美视频| 久久精品色欧美aⅴ一区二区| 国产精品视频公开费视频| 欧美日韩一二三四五区| 欧美电影免费观看高清| 午夜精品一区二区三区在线播放| 日韩精品极品在线观看| 91久久精品一区| 精品欧美国产一区二区三区| 在线免费看av不卡| 精品久久久久久久久久国产| 亚洲成人激情视频| 久久成人18免费网站| 国产精品日韩在线播放| 亚洲男人天堂2024| 欧美重口另类videos人妖| 国产精品视频一区二区三区四| 97视频在线免费观看| 久久久噜噜噜久久中文字免| 欧美乱大交xxxxx另类电影| 欧美性猛交xxxx富婆弯腰| 国产性猛交xxxx免费看久久| 国产精品视频在线播放| 日韩成人黄色av| 国产成人中文字幕| 伊人久久精品视频| 韩国美女主播一区| 国产精品99久久99久久久二8| 神马国产精品影院av| 国产一区二区在线免费视频| 在线精品高清中文字幕| 亚洲成人网在线观看| 狠狠做深爱婷婷久久综合一区| 欧美日韩国产一中文字不卡| 欧美在线国产精品| 91久久精品一区| 亚洲石原莉奈一区二区在线观看| 成人a免费视频| 超碰91人人草人人干| 亚洲国产精品嫩草影院久久| 蜜月aⅴ免费一区二区三区| 国产精品老女人精品视频| 日韩在线视频免费观看| 欧美与欧洲交xxxx免费观看| 久久黄色av网站| 日韩av在线高清| 亚洲国产又黄又爽女人高潮的| 欧美最猛性xxxxx亚洲精品| 2019日本中文字幕| 97人洗澡人人免费公开视频碰碰碰| 日韩激情av在线免费观看| 日韩av在线播放资源| 精品日本高清在线播放| 欧美区在线播放| 久久久久国产视频| 亚洲在线观看视频网站| 日韩经典中文字幕| 91免费高清视频| 亚洲理论片在线观看| 国产一区二区丝袜| 中日韩美女免费视频网站在线观看| 亚洲乱码国产乱码精品精天堂| 欧美日韩国产一中文字不卡| 久久久久成人网| 欧美男插女视频| 精品国产一区二区三区在线观看| 久久精品视频免费播放| 欧美日韩亚洲国产一区| 77777亚洲午夜久久多人| 国产欧美一区二区三区视频| 欧美夫妻性生活xx| 青青草99啪国产免费| 亚洲大尺度美女在线| 日韩专区中文字幕| 日韩欧美极品在线观看| 中文字幕日韩欧美在线|