<rt id="bn8ez"></rt>
<label id="bn8ez"></label>

  • <span id="bn8ez"></span>

    <label id="bn8ez"><meter id="bn8ez"></meter></label>

    badqiu

    XPer
    隨筆 - 46, 文章 - 3, 評(píng)論 - 195, 引用 - 0
    數(shù)據(jù)加載中……

    在jsp中實(shí)現(xiàn)"類"的繼承關(guān)系

    1.介紹
    使用過python django模板的應(yīng)該清楚,django里面有一個(gè)激動(dòng)人心的功能就是模板可以使用類的繼承關(guān)系。 即模板是可以繼承的,并且不限繼承的層次。
    1. child.html extends base.html
    2. grandchild.html extends child.html
    這樣,我們?cè)赽ase.html中定義好html布局,然后在“子類”(我們這樣稱呼吧)重定義需要父頁面內(nèi)容即可

    2.jsp繼承示例
    現(xiàn)在我們來看jsp中如何實(shí)現(xiàn)此功能(django與下面的聲明類似)。
    父頁面: base.jsp,定義布局
    Jsp代碼 
    1. <%@ taglib uri="http://www.rapid-framework.org.cn/rapid" prefix="rapid" %>  
    2. <html>  
    3.    <rapid:block name="head">base_head_content</rapid:block>  
    4. <body>  
    5.    <br />  
    6.    <rapid:block name="content">base_body_content</rapid:block>  
    7. </body>  
    8. </html>  
     
    子頁面: child.jsp
    Jsp代碼 
    1. <%@ taglib uri="http://www.rapid-framework.org.cn/rapid" prefix="rapid" %>  
    2. <% //重定義父頁面的內(nèi)容為content的內(nèi)容 %>  
    3. <rapid:override name="content">  
    4.     child_body_content  
    5. </rapid:override>  
    6.    
    7. <!-- extends from base.jsp -->  
    8. <%@ include file="base.jsp" %>  
     
    如上: 我們使用了兩個(gè)jsp tag: block,override,還有<@include >指令.
    下面描述各個(gè)功能:
    • override tag:  會(huì)將標(biāo)簽里面的內(nèi)容保存為pageContext的變量,變量名稱為name的屬性加前綴,如 __override__$name = tag內(nèi)容
    • block tag:  根據(jù)name屬性名稱,如果發(fā)現(xiàn)__override__$name變量,則顯示被重定義的內(nèi)容,否則顯示自身tag的內(nèi)容.
    • <%@include >指令: 通過該指令來實(shí)現(xiàn)繼承(extends)的功能(只能使用這個(gè)技巧),該指令必須放置在頁面的最后面 

    輸出:

    直接訪問base.jsp輸出:
    Html代碼 
    1. <html>  
    2.  base_head_content  
    3. <body>  
    4.  <br />  
    5.  base_body_content  
    6. </body>  
    7. </html>  
     訪問child.jsp輸出:
    Html代碼 
    1. <html>  
    2.  base_head_content  
    3. <body>  
    4.  <br />  
    5.  child_body_content  
    6. </body>  
    7. </html>  
     可以看到,child.jsp的的body輸出內(nèi)容被重定義了.
    現(xiàn)該tag可以實(shí)現(xiàn)jsp的無限級(jí)的繼承關(guān)系. 即 grandchild.jsp 繼承 child.jsp , child.jsp繼承 base.jsp 

    3.具體實(shí)現(xiàn)方式:
    Block Tag:
    Java代碼 
    1. public class BlockTag extends TagSupport{  
    2.    
    3.  private String name;  
    4.    
    5.  public void setName(String name) {  
    6.   this.name = name;  
    7.  }  
    8.    
    9.  @Override  
    10.  public int doStartTag() throws JspException {  
    11.   return getOverriedContent() == null ? EVAL_BODY_INCLUDE : SKIP_BODY;  
    12.  }  
    13.    
    14.  @Override  
    15.  public int doEndTag() throws JspException {  
    16.   String overriedContent = getOverriedContent();  
    17.   if(overriedContent == null) {  
    18.    return EVAL_PAGE;  
    19.   }  
    20.     
    21.   try {  
    22.    pageContext.getOut().write(overriedContent);  
    23.   } catch (IOException e) {  
    24.    throw new JspException("tag output error",e);  
    25.   }  
    26.   return EVAL_PAGE;  
    27.  }  
    28.    
    29.  private String getOverriedContent() {  
    30.   String varName = Utils.getOverrideVariableName(name);  
    31.   return (String)pageContext.getAttribute(varName);  
    32.  }  
    33. }  
     Override Tag:
    Java代碼 
    1. public class OverrideTag extends BodyTagSupport{  
    2.     
    3.  private String name;  
    4.    
    5.  public void setName(String name) {  
    6.   this.name = name;  
    7.  }  
    8.    
    9.  @Override  
    10.  public int doStartTag() throws JspException {  
    11.   return isOverrided() ? SKIP_BODY : EVAL_BODY_BUFFERED;  
    12.  }  
    13.    
    14.  @Override  
    15.  public int doEndTag() throws JspException {  
    16.   if(isOverrided()) {  
    17.    return EVAL_PAGE;  
    18.   }  
    19.   BodyContent b = getBodyContent();  
    20.   String varName = Utils.getOverrideVariableName(name);  
    21.   pageContext.setAttribute(varName, b.getString());  
    22.   return EVAL_PAGE;  
    23.  }  
    24.    
    25.  private boolean isOverrided() {  
    26.   String varName = Utils.getOverrideVariableName(name);  
    27.   return pageContext.getAttribute(varName) != null;  
    28.  }  
    29.     
    30. }  
     工具類:
    Java代碼 
    1. class Utils {  
    2.  public static String BLOCK = "__override__";  
    3.  public static String getOverrideVariableName(String name) {  
    4.   return BLOCK + name;  
    5.  }  
    6. }  
     
    可以看到,實(shí)現(xiàn)代碼不需要100行,重要是的實(shí)現(xiàn)技巧,由此,你從此可以放棄使用sitemesh. 并且如上實(shí)現(xiàn)方式具有更高性能。
    并且筆者也擴(kuò)展了freemarker模板,通過自定義指令,實(shí)現(xiàn)如上相同的功能。
     
    該內(nèi)容以后也會(huì)隨rapid-framework一起發(fā)布

    posted on 2009-12-09 18:19 badqiu 閱讀(2708) 評(píng)論(4)  編輯  收藏

    評(píng)論

    # re: 在jsp中實(shí)現(xiàn)"類"的繼承關(guān)系[未登錄]  回復(fù)  更多評(píng)論   

    挺實(shí)用的功能喔,并且很容易理解.
    2009-12-09 21:03 | alan

    # re: 在jsp中實(shí)現(xiàn)"類"的繼承關(guān)系  回復(fù)  更多評(píng)論   

    哦地方四大皆空福建卡
    2009-12-10 10:30 | 99讀書人

    # re: 在jsp中實(shí)現(xiàn)"類"的繼承關(guān)系  回復(fù)  更多評(píng)論   

    不錯(cuò),支持。
    2009-12-10 15:14 | src_tiger

    # re: 在jsp中實(shí)現(xiàn)"類"的繼承關(guān)系  回復(fù)  更多評(píng)論   

    是看見的附件是經(jīng)費(fèi)
    2009-12-12 13:30 | 夢(mèng)芭莎內(nèi)衣

    只有注冊(cè)用戶登錄后才能發(fā)表評(píng)論。


    網(wǎng)站導(dǎo)航:
     
    主站蜘蛛池模板: 亚洲人成人无码网www电影首页| 女人18毛片免费观看| 精品国产免费一区二区三区香蕉| 五月天婷婷精品免费视频| 男女作爱免费网站| 免费国产a理论片| 一二三四在线观看免费中文在线观看| 色欲aⅴ亚洲情无码AV| 苍井空亚洲精品AA片在线播放| 国产亚洲精品精品精品| 鲁死你资源站亚洲av| 2022中文字字幕久亚洲| 亚洲毛片在线观看| 久久精品国产亚洲AV高清热| 国产成人涩涩涩视频在线观看免费| 国产精品免费无遮挡无码永久视频| 最近2019中文免费字幕在线观看| 你好老叔电影观看免费| 男人进去女人爽免费视频国产| 午夜无码A级毛片免费视频| 91在线手机精品免费观看| 男女免费观看在线爽爽爽视频| 人禽杂交18禁网站免费| 午夜老司机免费视频| 国产一区二区三区免费视频| 亚洲毛片网址在线观看中文字幕| 亚洲一区二区三区国产精品| 亚洲中文字幕日产乱码高清app| 久久久综合亚洲色一区二区三区| 久久综合亚洲色一区二区三区| 亚洲国产精品乱码在线观看97| 亚洲中文字幕无码av| 男人免费视频一区二区在线观看| 51午夜精品免费视频| 久久狠狠躁免费观看2020| 精品免费人成视频app| 日本特黄a级高清免费大片| 亚洲国产一区视频| 久久精品国产亚洲av四虎| 亚洲精品国产肉丝袜久久| 亚洲A∨精品一区二区三区下载|