<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布局,然后在“子類”(我們這樣稱呼吧)重定義需要父頁(yè)面內(nèi)容即可

    2.jsp繼承示例
    現(xiàn)在我們來看jsp中如何實(shí)現(xiàn)此功能(django與下面的聲明類似)。
    父頁(yè)面: 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>  
     
    子頁(yè)面: child.jsp
    Jsp代碼 
    1. <%@ taglib uri="http://www.rapid-framework.org.cn/rapid" prefix="rapid" %>  
    2. <% //重定義父頁(yè)面的內(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è)技巧),該指令必須放置在頁(yè)面的最后面 

    輸出:

    直接訪問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)航:
     
    主站蜘蛛池模板: 久久久青草青青亚洲国产免观 | 精品免费视在线观看| 亚洲中文字幕无码亚洲成A人片| 亚洲αv在线精品糸列| 一本色道久久综合亚洲精品高清| 日韩精品免费电影| 在线观看AV片永久免费| 91福利免费体验区观看区| a级午夜毛片免费一区二区| sss在线观看免费高清| 色屁屁www影院免费观看视频| 亚洲精品又粗又大又爽A片| 亚洲偷自精品三十六区| 亚洲第一区视频在线观看| 亚洲国产女人aaa毛片在线 | 亚洲五月综合网色九月色| 亚洲最大的视频网站| 久久久无码精品亚洲日韩按摩| 少妇中文字幕乱码亚洲影视| 亚洲成AV人片在线播放无码| 亚洲AV中文无码字幕色三| 久久久久久久综合日本亚洲| 亚洲AV永久纯肉无码精品动漫| 亚洲国产精品VA在线观看麻豆| 亚洲AV无码久久精品蜜桃| 亚洲av日韩av天堂影片精品| 久久久久亚洲AV成人无码网站| 亚洲AV无码乱码在线观看裸奔| 亚洲免费视频在线观看| 亚洲永久中文字幕在线| 亚洲伊人久久大香线蕉苏妲己| 18gay台湾男同亚洲男同| 亚洲精品456在线播放| 亚洲人成综合在线播放| 中国亚洲呦女专区| 亚洲国产精品18久久久久久| 国产成人人综合亚洲欧美丁香花| 中文字幕永久免费| 999国内精品永久免费视频| 一本久久综合亚洲鲁鲁五月天 | 一本无码人妻在中文字幕免费|