badqiu

          XPer
          隨筆 - 46, 文章 - 3, 評論 - 195, 引用 - 0
          數據加載中……

          在jsp中實現"類"的繼承關系

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

          2.jsp繼承示例
          現在我們來看jsp中如何實現此功能(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. <% //重定義父頁面的內容為content的內容 %>  
          3. <rapid:override name="content">  
          4.     child_body_content  
          5. </rapid:override>  
          6.    
          7. <!-- extends from base.jsp -->  
          8. <%@ include file="base.jsp" %>  
           
          如上: 我們使用了兩個jsp tag: block,override,還有<@include >指令.
          下面描述各個功能:
          • override tag:  會將標簽里面的內容保存為pageContext的變量,變量名稱為name的屬性加前綴,如 __override__$name = tag內容
          • block tag:  根據name屬性名稱,如果發現__override__$name變量,則顯示被重定義的內容,否則顯示自身tag的內容.
          • <%@include >指令: 通過該指令來實現繼承(extends)的功能(只能使用這個技巧),該指令必須放置在頁面的最后面 

          輸出:

          直接訪問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輸出內容被重定義了.
          現該tag可以實現jsp的無限級的繼承關系. 即 grandchild.jsp 繼承 child.jsp , child.jsp繼承 base.jsp 

          3.具體實現方式:
          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. }  
           
          可以看到,實現代碼不需要100行,重要是的實現技巧,由此,你從此可以放棄使用sitemesh. 并且如上實現方式具有更高性能。
          并且筆者也擴展了freemarker模板,通過自定義指令,實現如上相同的功能。
           
          該內容以后也會隨rapid-framework一起發布

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

          評論

          # re: 在jsp中實現"類"的繼承關系[未登錄]  回復  更多評論   

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

          # re: 在jsp中實現"類"的繼承關系  回復  更多評論   

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

          # re: 在jsp中實現"類"的繼承關系  回復  更多評論   

          不錯,支持。
          2009-12-10 15:14 | src_tiger

          # re: 在jsp中實現"類"的繼承關系  回復  更多評論   

          是看見的附件是經費
          2009-12-12 13:30 | 夢芭莎內衣

          只有注冊用戶登錄后才能發表評論。


          網站導航:
           
          主站蜘蛛池模板: 贡山| 吕梁市| 涟源市| 邵阳县| 天镇县| 望奎县| 东方市| 阳山县| 肇庆市| 台江县| 饶平县| 鹤壁市| 包头市| 阿瓦提县| 福贡县| 舞钢市| 五原县| 长葛市| 巴林右旗| 平昌县| 平泉县| 开平市| 家居| 海阳市| 崇信县| 平和县| 临潭县| 定兴县| 胶南市| 海阳市| 柳江县| 施甸县| 吉隆县| 内江市| 孟村| 华坪县| 宜川县| 西充县| 都昌县| 建湖县| 罗城|