`
badqiu
  • 浏览: 670222 次
  • 性别: Icon_minigender_1
  • 来自: 珠海
社区版块
存档分类
最新评论

在jsp中实现"类"的继承关系

阅读更多

 

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一起发布


 

5
2
分享到:
评论
1 楼 fnet 2014-08-22  

相关推荐

    在jsp中使用自定义taglib

    1 什么是Tag 一个tag就是一个普通的java类,它...换句话说,你只需把实现了业务逻辑的类继承TagSupport或者BodyTagSupport,再做一些特别的工作,你的类就是一个Tag。并且它自己负责和jsp页面的交互,不用你多操心。

    JavaWeb开发技术-Servlet接口及其实现类.pptx

    Servlet接口及其实现类 Java Servlet Jsp XML HTML Servlet接口及其实现类 Servlet接口及其实现类 Servlet接口 GenericServlet类 HttpServlet类 实现Servlet接口 继承GenericServlet类 Servlet接口及其实现类 方法...

    由浅到深详细讲解JSP自定义标签

    由浅到深详细讲解JSP自定义标签 一、基本概念 1、标签(Tag) 标签是一种XML元素,通过标签...标签处理类是一个Java类,这个类继承了TagSupport或者扩展了SimpleTag接口,通过这个类可以实现自定义JSP标签的具体功能。

    jsp论坛管理系统+sqlserver

    系统架构是现在主流的SSH架构模式,使用了Spring的...由IOC容器DAO的代理实例注入到业务组件中,业务组件通过DAO的委托接口调用DAO对象,使得上层组件不直接依赖于DAO的实现类,使得持久层更换或修改不影响上层组件。

    商城之家JSP商城基于jsp+mysql开发

    本系统包含250多个JavaBean类,整个系统全面实现MVC(模型 视图 控制)三层架构, 大量的应用到了类的反射机制涉及网络编程行业最高精尖技术STRUTS+HIBERNATER,最有说 服力的证实了多层建构框架模式的绝优越性。...

    JSP 中Servlet的自己实现

    JSP 中Servlet的自己实现 一 步骤 1、继承HttpServlet 2、重写doGet()或者doPost()方法 3、在web.xml中注册Servlet  二 HttpServlet类继承图 三 实例 1、创建MyFirstServletDemo web project.  2、编辑...

    JSP和Servlet面试题

    写一个自定义标签要继承什么类 SimpleTagSupport,一般调用doTag方法 或者实现SimpleTag接口 5.Jsp如何处理json 在 jsp 中处理 JSON,通常需要配套使用 JQuery 控件,并且导入一些 Common jar 包。 使用 ...

    jsp java自定义标签 分页 当前位置 循环遍历数据

    jsp和java联合实现了自定义标签的功能,主要技术继承了TagSupport类和编写对应bodytag.tld配置文件 实现了分页功能 当前功能点所在位置 循环遍历数据

    JSP企富商贸网开发

    在整个后台管理系统中,商品管理是一个重要的管理模块,是整个平台的核心管理模块,具有很强的商品控制和管理功能,一定要熟练操作。 1.商品维护 点击“商品维护”,会进入“商品列表”页面,该页面分搜索栏和列表...

    JSP商城之家商城企业版

    本系统包含250多个JavaBean类,整个系统全面实现MVC(模型 视图 控制)三层架构, 大量的应用到了类的反射机制涉及网络编程行业最高精尖技术STRUTS+HIBERNATER,最有说 服力的证实了多层建构框架模式的绝优越性。...

    搞定J2EE:STRUTS+SPRING+HIBERNATE整合详解与典型案例 (2)

    13.8.12 统计调查结果实现类SetSurveyChildCountImpl.java 13.9 编写网上调查系统的控制器类 13.9.1 登录控制器类LoginAction.java 13.9.2 注册控制器类RegeditAction.java 13.9.3 设定调查题目控制器类SurveyAction...

    jsp自定义标签中的困扰

    JSP自定义标签过程中会出现许多的问题,尤其是没有相应课题的专门书籍的时候.我在通过继承BodyTagSupport类来做标签的时候。出现了许多问题,我把这些问题归纳起来,希望能帮助到某些人。

    struts2自定义标签案例详解

    这里在实现自定义标签时,继承的2个类分别是org.apache.struts2.views.jsp.ComponentTagSupport和org.apache.struts2.components.Component,ComponentTagSupport实际上是对BodyTagSupport的一次封装,看一下...

    商城之家jsp网店系统

    系统包含250多个JavaBean类,整个系统全面实现MVC(模型 视图 控制)三层架构, 大量的应用到了类的反射机制涉及网络编程行业最高精尖技术STRUTS+HIBERNATER,最有说 服力的证实了多层建构框架模式的绝优越性。数据...

    java面试宝典

    98、Hibernate中怎样实现类之间的关系?(如:一对多、多对多的关系) 22 99、说下Hibernate的缓存机制 22 100、Hibernate的查询方式 23 101、如何优化Hibernate? 23 102、Struts工作机制?为什么要使用Struts? 23 ...

    毕业设计-基于JSP的模特管理系统mysql-设计与实现(源码+论文+视频).zip

    在系统分析和设计阶段,系统开发工作主要是集中在逻辑、功能和技术设计上,系统实施阶段要继承此前面各个阶段的工作成果,将技术设计转化为物理实现,因此系统实施的成果是系统分析和设计阶段的结晶。 4.1会员注册与...

    jsp酒店管理系统+sqlserver2005

    控制层:使用JDBC直连的方法,对数据表的基本操作创建接口放在DAO包中,并创建它的实现方法,再用biz类继承DAO的接口并调用DAO的对象实现业务层的操作。 视图层:使用JSP,JSTL,EL,JavaScript的技术,使页面完全的...

    毕业设计-基于JSP的狼牙山中心小学校园网-设计与实现(源码+论文+视频).zip

    在系统分析和设计阶段,系统开发工作主要是集中在逻辑、功能和技术设计上,系统实施阶段要继承此前面各个阶段的工作成果,将技术设计转化为物理实现,因此系统实施的成果是系统分析和设计阶段的结晶。 4.1会员注册与...

    Jsp面试题目和答案

    字符流和字节流的区别,使用场景,相关类 线程安全的概念,实现线程安全的几种方法 抽象类和接口的区别,使用场景 hash算法的实现原理,hashcode的实现原理 error和exception的区别,RuntimeException和非...

    千方百计笔试题大全

    98、Hibernate中怎样实现类之间的关系?(如:一对多、多对多的关系) 22 99、说下Hibernate的缓存机制 22 100、Hibernate的查询方式 23 101、如何优化Hibernate? 23 102、Struts工作机制?为什么要使用Struts? 23 ...

Global site tag (gtag.js) - Google Analytics