JSP_EXTENDS

来源:互联网 发布:unity3d室内场景建模 编辑:程序博客网 时间:2024/05/22 06:57
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"%>
1 0
原创粉丝点击
热门问题 老师的惩罚 人脸识别 我在镇武司摸鱼那些年 重生之率土为王 我在大康的咸鱼生活 盘龙之生命进化 天生仙种 凡人之先天五行 春回大明朝 姑娘不必设防,我是瞎子 英雄联盟画面卡顿怎么办 长残了怎么办原来很帅 被吓到了怎么办没精神 宝宝吓着怎么办最有效 4个月婴儿易惊吓怎么办 心里有问题的人怎么办 减肥的时候想吃东西怎么办 大联盟ping很高怎么办 酷派手机弹广告怎么办 孕早期肚子紧绷怎么办 怀孕2个月同房了怎么办 怀孕前三月同房了怎么办 人流前三天同房了怎么办 人流后三天同房了怎么办 吃避孕药后月经量少怎么办 排卵日同房不想怀孕怎么办 排卵日同房没有怀孕怎么办 想怀孕想生儿子怎么办 到期大姨妈不来怎么办 怕怀孕月经不来怎么办 宫颈环扎后宫缩怎么办 来例假刺激外阴高潮了怎么办 客人消费完说没钱怎么办? 孕13周血糖偏高怎么办 餐后血糖高14点怎么办 餐后血糖20多怎么办 空腹血糖6.6饭后9.2怎么办 键盘shift键失效了怎么办 灵异附身夫妻不合怎么办 鞋子买大了半码怎么办 鞋子买小了半码怎么办 黑布鞋鞋面白了怎么办 黑布鞋不黑了怎么办 黑布鞋退白了怎么办 老北京布鞋款式太少怎么办 老人输液抽搐后昏迷怎么办 头七家里有狗怎么办 股票退市股民的钱怎么办 美国股票退市股民怎么办 百度云字幕和视频不同步怎么办 百度云加载字幕有延迟怎么办