JSP_EXTENDS
2015-12-31 17:01
567 查看
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"%>
相关文章推荐
- myTemplate模板引擎
- 动态ItemTemplate的实现(译) - item,template
- 使Ext的Template可以解析二层的json数据的方法
- c++中template对字符串的处理方法
- python的Template使用指南
- go语言template用法实例
- Blade模板命令集
- C++ Template中防止使用不完整类型
- 在 vSphere Client 中从模板部署虚拟机
- __declspec(selectany)
- 关于Camel In Action 的理解
- Template Method 模式
- 原 初学angularJS笔记之Directive
- 初学算法-基于最小堆的优先级队列C++实现
- 如何使用模板类基类中的结构体?
- jmsTemplate 使用。
- 模板继承【粗翻译】
- 关于模板的思考
- Beautiful template (for pages)
- CPP-Templates