JSP页面的继承(extends)

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.   
  3.    "head">base_head_content  
  4.   
  5.    
      
  6.    "content">base_body_content  
  7.   
  8.   
 
子页面: child.jsp
Jsp代码  保藏代码
  1. <%@ taglib uri="http://www.rapid-framework.org.cn/rapid" prefix="rapid" %>  
  2. <% //重界说父页面的内容为content的内容 %>  
  3. "content">  
  4.     child_body_content  
  5.   
  6.    
  7.   
  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模板,经过自界说指令,完成如上一样的功用。
 
作者: 唐山
posted @ 2013-01-03 00:20  chinadiy197601  阅读(2104)  评论(0编辑  收藏  举报