JSP_EXTENDS

BlockTag:

import java.io.IOException;

import javax.servlet.jsp.JspException;
import javax.servlet.jsp.tagext.TagSupport;
public class BlockTag extends TagSupport{

    private static final long serialVersionUID = -8246166191638588615L;

    private String name;

    public void setName(String name) {
        this.name = name;
    }

    /**
     * @return EVAL_BODY_INCLUDE or EVAL_BODY_BUFFERED or SKIP_BODY
     */
    @Override
    public int doStartTag() throws JspException {
        return getOverriedContent() == null ? EVAL_BODY_INCLUDE : SKIP_BODY;
    }

    /**
     * @return EVAL_PAGE or SKIP_PAGE
     */
    @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("write overridedContent occer IOException,block name:"+name,e);
        }
        return EVAL_PAGE;
    }

    private String getOverriedContent() {
        String varName = Utils.getOverrideVariableName(name);
        return (String)pageContext.getRequest().getAttribute(varName);
    }
}
OverrideTag:

import javax.servlet.jsp.JspException;
import javax.servlet.jsp.tagext.BodyContent;
import javax.servlet.jsp.tagext.BodyTagSupport;

public class OverrideTag extends BodyTagSupport {
    private static final long serialVersionUID = -8379959647039117369L;

    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();
        // System.out.println("Override.content:"+b.getString());
        String varName = Utils.getOverrideVariableName(name);

        pageContext.getRequest().setAttribute(varName, b.getString());
        return EVAL_PAGE;
    }

    private boolean isOverrided() {
        String varName = Utils.getOverrideVariableName(name);
        return pageContext.getRequest().getAttribute(varName) != null;
    }

}
Utils:

class Utils {

    public static String BLOCK = "__jsp_override__";

    static String getOverrideVariableName(String name) {
        return BLOCK + name;
    }

}
jsp_layout.tld:

<?xml version="1.0" encoding="UTF-8" ?>
<taglib xmlns="http://java.sun.com/xml/ns/j2ee" xmlns:xsi="http://www.w3g.org/2001/XMLSchema-instance"
    xsi:schemaLocation="http://java.sun.com/xml/ns/j2ee web-jsptaglibrary_2_0.xsd"
    version="2.0">
    <tlib-version>1.2</tlib-version>
    <jsp-version>1.2</jsp-version>
    <short-name>Taglib</short-name>
    <uri>jsp_layout.tld</uri>
    <description>jsp模板继承</description>
    <tag>
        <name>block</name><!--tag的名字 -->
        <tag-class>org.study.web.tags.BlockTag</tag-class><!--其中对应的java类 -->
        <body-content>jsp</body-content>
        <!-- JSP,empty,scriptless,tagdependent JSP:接受所有JSP语法,如定制的或内部的tag、scripts、静态HTML、脚本元素、 
            JSP指令和动作 empty:空标记,即起始标记和结束标记之间没有内容 scriptless:接受文本、EL和JSP动作。如<%=request.getProtocol()%>使用 
            <body-content> scriptless </body-content>则报错 tagdependent:标签体内容直接被写入BodyContent,由自定义标签类来进行处理,而不被JSP容器解释 -->
        <attribute><!--tag的参数 -->
            <name>name</name><!--参数名 -->
            <required>true</required><!-- 是否是必填选项 -->
            <rtexprvalue>true</rtexprvalue><!--是否可以动态赋值 -->
            <type>java.lang.String</type><!--参数类型 -->
        </attribute>
        <!-- 支持动态属性(必须实现DynamicAttributes接口) <dynamic-attributes>true</dynamic-attributes> -->
    </tag>
    <tag>
        <name>override</name>
        <tag-class>org.study.web.tags.OverrideTag</tag-class>
        <body-content>jsp</body-content>
        <attribute>
            <name>name</name>
            <required>true</required>
            <rtexprvalue>true</rtexprvalue>
            <type>java.lang.String</type>
        </attribute>
    </tag>
</taglib>
layout.jsp:


<%@ page language="java" import="java.util.*" pageEncoding="utf-8"%>
<%
    String path = request.getContextPath();
    String basePath = request.getScheme() + "://" + request.getServerName() + ":" + request.getServerPort()
            + path + "/";
%>
<%@ taglib uri="http://java.sun.com/jsp/jstl/core" prefix="c"%>
<%@ taglib uri="jsp_layout.tld" prefix="rapid"%>
<!DOCTYPE html>
<html lang="zh-CN">
<head>
<base href="<%=basePath%>">
<rapid:block name="head">
    <meta charset="utf-8">
    <meta http-equiv="X-UA-Compatible" content="IE=edge">
    <meta name="viewport" content="width=device-width, initial-scale=1">
    <!-- 上述3个meta标签*必须*放在最前面,任何其他内容都*必须*跟随其后! -->
    <meta name="description" content="">
    <meta name="author" content="">
    <link rel="icon" href="../../favicon.ico">
    <title>Starter Template for Bootstrap</title>
    <!-- Bootstrap core CSS -->
    <link href="frameworks/bootstrap3/css/bootstrap.min.css"
        rel="stylesheet">
    <!-- Custom styles for this template -->
    <link href="custom/css/plugin/starter-template.css" rel="stylesheet">
    <!-- Just for debugging purposes. Don't actually copy these 2 lines! -->
    <!--[if lt IE 9]><script src="frameworks/bootstrap/js/ie8-responsive-file-warning.js"></script><![endif]-->
    <script src="frameworks/bootstrap3/js/ie-emulation-modes-warning.js"></script>
    <!-- HTML5 shim and Respond.js for IE8 support of HTML5 elements and media queries -->
    <!--[if lt IE 9]>
      <script src="frameworks/bootstrap3/js/html5shiv.min.js"></script>
      <script src="frameworks/bootstrap3/js/respond.min.js"></script>
    <![endif]-->
</rapid:block>
</head>
<body>
    <nav class="navbar navbar-inverse navbar-fixed-top">
        <div class="container">
            <div class="navbar-header">
                <button type="button" class="navbar-toggle collapsed"
                    data-toggle="collapse" data-target="#navbar" aria-expanded="false"
                    aria-controls="navbar">
                    <span class="sr-only">Toggle navigation</span> <span
                        class="icon-bar"></span> <span class="icon-bar"></span> <span
                        class="icon-bar"></span>
                </button>
                <a class="navbar-brand" href="#">Bootstrap theme</a>
            </div>
            <div id="navbar" class="navbar-collapse collapse">
                <ul class="nav navbar-nav">
                    <li class="active"><a href="#">Home</a></li>
                    <li><a href="#about">About</a></li>
                    <li><a href="#contact">Contact</a></li>
                    <li class="dropdown"><a href="#" class="dropdown-toggle"
                        data-toggle="dropdown" role="button" aria-haspopup="true"
                        aria-expanded="false">Dropdown <span class="caret"></span></a>
                        <ul class="dropdown-menu">
                            <li><a href="#">Action</a></li>
                            <li><a href="#">Another action</a></li>
                            <li><a href="#">Something else here</a></li>
                            <li role="separator" class="divider"></li>
                            <li class="dropdown-header">Nav header</li>
                            <li><a href="#">Separated link</a></li>
                            <li><a href="#">One more separated link</a></li>
                        </ul></li>
                </ul>
            </div>
            <!--/.nav-collapse -->
        </div>
    </nav>
    <div class="container">
        <rapid:block name="body">
            <div class="starter-template">
                <h1>Bootstrap starter template</h1>
                <p class="lead">
                    Use this document as a way to quickly start any new project.<br>
                    All you get is this text and a mostly barebones HTML document.
                </p>
            </div>
        </rapid:block>
    </div>
    <!-- /.container -->
    <rapid:block name="script">
        <!-- Bootstrap core JavaScript
    ================================================== -->
        <!-- Placed at the end of the document so the pages load faster -->
        <script src="frameworks/bootstrap3/js/jquery.min.js"></script>
        <script src="frameworks/bootstrap3/js/bootstrap.min.js"></script>
        <!-- IE10 viewport hack for Surface/desktop Windows 8 bug -->
        <script src="frameworks/bootstrap3/js/ie10-viewport-bug-workaround.js"></script>
    </rapid:block>
</body>
</html>
home.jsp:


<%@ taglib uri="jsp_layout.tld" prefix="rapid"%>
<rapid:override name="body">
    Youth is not a time of life, it is a state of mind.青春不是生命的一瞬,而是一种自然的心境。
</rapid:override>
<%@ include file="../layout/layout.jsp"%>
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值