View Javadoc
1   /**
2    * Copyright By Grandsoft Company Limited.  
3    * 2014年4月22日 下午7:18:44
4    */
5   package gboat2.base.view.components;
6   
7   import gboat2.base.view.GboatViewUtil;
8   
9   import java.io.Writer;
10  
11  import javax.servlet.http.HttpServletRequest;
12  
13  import org.apache.struts2.components.Component;
14  import org.apache.struts2.views.annotations.StrutsTag;
15  import org.apache.struts2.views.annotations.StrutsTagAttribute;
16  
17  import com.opensymphony.xwork2.util.ValueStack;
18  
19  /**
20   * 定义一个代码块,用于在子页面中进行重写
21   * <pre>
22   * <b>父页面:(demo-parent.jsp)</b>
23   * <code>
24   * &lt;%@ taglib prefix="g2" uri="/g2-tags"%&gt;
25   * &lt;g2:page comment="这是父页面:demo-parent.jsp" title="测试页面-父页面"&gt;
26   *     &lt;p&gt;没有被包含在 block 标签中的代码在子页面中将无法被覆盖&lt;/p&gt;
27   *     &lt;g2:block id="block_1"&gt;&lt;p&gt;这个是父页面中的代码块1,原样输出&lt;/p&gt;&lt;/g2:block&gt;
28   *     &lt;g2:block id="block_2"&gt;&lt;div&gt;这个代码块在子页面中进行重写……&lt;/div&gt;&lt;/g2:block&gt;
29   * &lt;/g2:page&gt;
30   * </code>
31   * <b>子页面(demo.jsp)</b>
32   * <code>
33   * &lt;%@ taglib prefix="g2" uri="/g2-tags"%&gt;
34   * &lt;g2:page comment="这个是子页面:demo.jsp" title="测试页面-子页面" extend="demo-parent.jsp"&gt;
35   *     &lt;g2:overlay id="block_2"&gt;
36   *         &lt;g2:inheritBlock/&gt;
37   *         &lt;div&gt;上面的 inheritBlock 标签是为了包含父页面中的代码,这一行是新增的,在下面再包含一次父页面中的代码,嘿嘿……&lt;/div&gt; 
38   *         &lt;g2:inheritBlock/&gt;&lt;br&gt;
39   * &lt;/g2:page&gt;
40   * </code>
41   * <b>访问 demo.jsp 输出:</b>
42   * <code>
43   * …… ……
44   * &lt;p&gt;没有被包含在 block 标签中的代码在子页面中将无法被覆盖&lt;/p&gt;
45   * &lt;p&gt;这个是父页面中的代码块1,原样输出&lt;/p&gt;
46   * &lt;div&gt;这个代码块在子页面中进行重写……&lt;/div&gt;
47   * &lt;div&gt;上面的 inheritBlock 标签是为了包含父页面中的代码,这一行是新增的,在下面再包含一次父页面中的代码,嘿嘿……&lt;/div&gt; 
48   * &lt;div&gt;这个代码块在子页面中进行重写……&lt;/div&gt;
49   * …… ……
50   * </code>
51   * 可以看到,demo.jsp 中 block_2 的输出内容被 &lt;g2:overlay/&gt; 重定义了,而 block_1 部分还是 demo-parent.jsp 的内容.
52   * </pre>
53   * @author <a href="mailto:[email protected]">何明旺</a>
54   * @since 3.0
55   * @date 2014年4月22日
56   */
57  @StrutsTag(
58          name="block",
59          tldBodyContent="JSP",
60          tldTagClass="gboat2.base.view.jsp.BlockTag",
61          description="定义一个代码块,用于在子页面中进行重写")
62  public class Block extends Component {
63  
64      protected HttpServletRequest request;
65      
66      protected String id;
67  
68      public Block(ValueStack stack, HttpServletRequest request) {
69          super(stack);
70          this.request = request;
71      }
72  
73      @Override
74      public boolean start(Writer write) {
75          // 没有被子页面覆盖时,需要缓冲 body
76          return (getOverriedContent() == null);
77      }
78  
79      @Override
80      public boolean end(Writer writer, String body) {
81          Object overriedContent = getOverriedContent();
82          if(overriedContent != null) {
83              body = overriedContent.toString();
84          }
85          return super.end(writer, body );
86      }
87  
88      @StrutsTagAttribute(description="代码块的唯一标识")
89      public void setId(String id) {
90          this.id = id;
91      }
92      
93      /**
94       * 获取子页面中覆盖后的代码
95       * @return 
96       */
97      protected Object getOverriedContent() {
98          String varName = GboatViewUtil.getOverrideVariableName(id);
99          return this.request.getAttribute(varName);
100     }
101 }