您的位置:首页 > Web前端 > JavaScript

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"%>
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签:  JavaJsp Template