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,界说规划
子页面: child.jsp
如上: 咱们运用了两个jsp tag: block,override,还有<@include >指令.
下面描绘各个功用:
- override tag: 会将标签里边的内容保存为pageContext的变量,变量称号为name的特点加前缀,如 __override__$name = tag内容
- block tag: 依据name特点称号,若是发现__override__$name变量,则显现被重界说的内容,不然显现本身tag的内容.
- <%@include >指令: 经过该指令来完成承继(extends)的功用(只能运用这个窍门),该指令有必要放置在页面的最后面
输出:
直接拜访base.jsp输出:
拜访child.jsp输出:
能够看到,child.jsp的的body输出内容被重界说了.
现该tag能够完成jsp的无限级的承继联系. 即 grandchild.jsp 承继 child.jsp , child.jsp承继 base.jsp
3.详细完成方法:
Block Tag:
- public class BlockTag extends TagSupport{
- private String name;
- public void setName(String name) {
- this.name = name;
- }
- @Override
- public int doStartTag() throws JspException {
- return getOverriedContent() == null ? EVAL_BODY_INCLUDE : SKIP_BODY;
- }
- @Override
- public int doEndTag() throws JspException {
- String overriedContent = getOverriedContent();
- if(overriedContent == null) {
- return EVAL_PAGE;
- }
- try {
- pageContext.getOut().write(overriedContent);
- } catch (IOException e) {
- throw new JspException("tag output error",e);
- }
- return EVAL_PAGE;
- }
- private String getOverriedContent() {
- String varName = Utils.getOverrideVariableName(name);
- return (String)pageContext.getAttribute(varName);
- }
- }
Override Tag:
- public class OverrideTag extends BodyTagSupport{
- private String name;
- public void setName(String name) {
- this.name = name;
- }
- @Override
- public int doStartTag() throws JspException {
- return isOverrided() ? SKIP_BODY : EVAL_BODY_BUFFERED;
- }
- @Override
- public int doEndTag() throws JspException {
- if(isOverrided()) {
- return EVAL_PAGE;
- }
- BodyContent b = getBodyContent();
- String varName = Utils.getOverrideVariableName(name);
- pageContext.setAttribute(varName, b.getString());
- return EVAL_PAGE;
- }
- private boolean isOverrided() {
- String varName = Utils.getOverrideVariableName(name);
- return pageContext.getAttribute(varName) != null;
- }
- }
东西类:
能够看到,完成代码不需求100行,重要是的完成窍门,由此,你从此能够抛弃运用sitemesh. 而且如上完成方法具有更高功用。
而且笔者也扩大了freemarker模板,经过自界说指令,完成如上一样的功用。
作者: 唐山