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,定义布局
<%@ taglib uri="http://www.rapid-framework.org.cn/rapid" prefix="rapid" %>
<html>
<rapid:block name="head">base_head_content</rapid:block>
<body>
<br />
<rapid:block name="content">base_body_content</rapid:block>
</body>
</html>
子页面: child.jsp
<%@ taglib uri="http://www.rapid-framework.org.cn/rapid" prefix="rapid" %>
<% //重定义父页面的内容为content的内容 %>
<rapid:override name="content">
child_body_content
</rapid:override>
<!-- extends from base.jsp -->
<%@ include file="base.jsp" %>
如上: 我们使用了两个jsp tag: block,override,还有<@include >指令.
下面描述各个功能:
- override tag: 会将标签里面的内容保存为pageContext的变量,变量名称为name的属性加前缀,如 __override__$name = tag内容
- block tag: 根据name属性名称,如果发现__override__$name变量,则显示被重定义的内容,否则显示自身tag的内容.
- <%@include >指令: 通过该指令来实现继承(extends)的功能(只能使用这个技巧),该指令必须放置在页面的最后面
输出:
直接访问base.jsp输出:
<html>
base_head_content
<body>
<br />
base_body_content
</body>
</html>
访问child.jsp输出:
<html>
base_head_content
<body>
<br />
child_body_content
</body>
</html>
可以看到,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;
}
}
工具类:
class Utils {
public static String BLOCK = "__override__";
public static String getOverrideVariableName(String name) {
return BLOCK + name;
}
}
可以看到,实现代码不需要100行,重要是的实现技巧,由此,你从此可以放弃使用sitemesh. 并且如上实现方式具有更高性能。
并且笔者也扩展了freemarker模板,通过自定义指令,实现如上相同的功能。
该内容以后也会随rapid-framework一起发布
分享到:
相关推荐
1 什么是Tag 一个tag就是一个普通的java类,它...换句话说,你只需把实现了业务逻辑的类继承TagSupport或者BodyTagSupport,再做一些特别的工作,你的类就是一个Tag。并且它自己负责和jsp页面的交互,不用你多操心。
Servlet接口及其实现类 Java Servlet Jsp XML HTML Servlet接口及其实现类 Servlet接口及其实现类 Servlet接口 GenericServlet类 HttpServlet类 实现Servlet接口 继承GenericServlet类 Servlet接口及其实现类 方法...
由浅到深详细讲解JSP自定义标签 一、基本概念 1、标签(Tag) 标签是一种XML元素,通过标签...标签处理类是一个Java类,这个类继承了TagSupport或者扩展了SimpleTag接口,通过这个类可以实现自定义JSP标签的具体功能。
系统架构是现在主流的SSH架构模式,使用了Spring的...由IOC容器DAO的代理实例注入到业务组件中,业务组件通过DAO的委托接口调用DAO对象,使得上层组件不直接依赖于DAO的实现类,使得持久层更换或修改不影响上层组件。
本系统包含250多个JavaBean类,整个系统全面实现MVC(模型 视图 控制)三层架构, 大量的应用到了类的反射机制涉及网络编程行业最高精尖技术STRUTS+HIBERNATER,最有说 服力的证实了多层建构框架模式的绝优越性。...
JSP 中Servlet的自己实现 一 步骤 1、继承HttpServlet 2、重写doGet()或者doPost()方法 3、在web.xml中注册Servlet 二 HttpServlet类继承图 三 实例 1、创建MyFirstServletDemo web project. 2、编辑...
写一个自定义标签要继承什么类 SimpleTagSupport,一般调用doTag方法 或者实现SimpleTag接口 5.Jsp如何处理json 在 jsp 中处理 JSON,通常需要配套使用 JQuery 控件,并且导入一些 Common jar 包。 使用 ...
jsp和java联合实现了自定义标签的功能,主要技术继承了TagSupport类和编写对应bodytag.tld配置文件 实现了分页功能 当前功能点所在位置 循环遍历数据
在整个后台管理系统中,商品管理是一个重要的管理模块,是整个平台的核心管理模块,具有很强的商品控制和管理功能,一定要熟练操作。 1.商品维护 点击“商品维护”,会进入“商品列表”页面,该页面分搜索栏和列表...
本系统包含250多个JavaBean类,整个系统全面实现MVC(模型 视图 控制)三层架构, 大量的应用到了类的反射机制涉及网络编程行业最高精尖技术STRUTS+HIBERNATER,最有说 服力的证实了多层建构框架模式的绝优越性。...
13.8.12 统计调查结果实现类SetSurveyChildCountImpl.java 13.9 编写网上调查系统的控制器类 13.9.1 登录控制器类LoginAction.java 13.9.2 注册控制器类RegeditAction.java 13.9.3 设定调查题目控制器类SurveyAction...
JSP自定义标签过程中会出现许多的问题,尤其是没有相应课题的专门书籍的时候.我在通过继承BodyTagSupport类来做标签的时候。出现了许多问题,我把这些问题归纳起来,希望能帮助到某些人。
这里在实现自定义标签时,继承的2个类分别是org.apache.struts2.views.jsp.ComponentTagSupport和org.apache.struts2.components.Component,ComponentTagSupport实际上是对BodyTagSupport的一次封装,看一下...
系统包含250多个JavaBean类,整个系统全面实现MVC(模型 视图 控制)三层架构, 大量的应用到了类的反射机制涉及网络编程行业最高精尖技术STRUTS+HIBERNATER,最有说 服力的证实了多层建构框架模式的绝优越性。数据...
98、Hibernate中怎样实现类之间的关系?(如:一对多、多对多的关系) 22 99、说下Hibernate的缓存机制 22 100、Hibernate的查询方式 23 101、如何优化Hibernate? 23 102、Struts工作机制?为什么要使用Struts? 23 ...
在系统分析和设计阶段,系统开发工作主要是集中在逻辑、功能和技术设计上,系统实施阶段要继承此前面各个阶段的工作成果,将技术设计转化为物理实现,因此系统实施的成果是系统分析和设计阶段的结晶。 4.1会员注册与...
控制层:使用JDBC直连的方法,对数据表的基本操作创建接口放在DAO包中,并创建它的实现方法,再用biz类继承DAO的接口并调用DAO的对象实现业务层的操作。 视图层:使用JSP,JSTL,EL,JavaScript的技术,使页面完全的...
在系统分析和设计阶段,系统开发工作主要是集中在逻辑、功能和技术设计上,系统实施阶段要继承此前面各个阶段的工作成果,将技术设计转化为物理实现,因此系统实施的成果是系统分析和设计阶段的结晶。 4.1会员注册与...
字符流和字节流的区别,使用场景,相关类 线程安全的概念,实现线程安全的几种方法 抽象类和接口的区别,使用场景 hash算法的实现原理,hashcode的实现原理 error和exception的区别,RuntimeException和非...
98、Hibernate中怎样实现类之间的关系?(如:一对多、多对多的关系) 22 99、说下Hibernate的缓存机制 22 100、Hibernate的查询方式 23 101、如何优化Hibernate? 23 102、Struts工作机制?为什么要使用Struts? 23 ...