`
badqiu
  • 浏览: 674492 次
  • 性别: 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的技术上实现批量删除

    在上面的代码中,小动物类继承自动物类,小狗类继承自小动物类。所以,输出结果是我的小狗! 6. 访问修饰符 在C#中,访问修饰符用于控制成员的访问权限。protected访问修饰符表示成员可以被同一类或派生类访问,...

    在jsp中实现验证码(用Myeclipse6.5开发)

    **在JSP中实现验证码详解** 验证码是一种常用的安全机制,用于防止自动机器人或者恶意脚本进行非法操作,如批量注册、频繁提交等。在Web开发中,尤其是在Java Web环境中,我们常常利用Java Servlet和JSP(Java...

    jsp页面调用applet实现人民币的大小写转换.docx

    该实现方法通过在JSP页面中嵌入一个Applet,使用JavaScript与Applet进行交互,实现实时的人民币大小写转换。 一、JSP页面调用Applet的实现 在JSP页面中,使用 `;charset=gb2312" %&gt;` 指定页面的字符编码为GB2312,...

    jsp 原理 jsp教程

    3. **转发与重定向**:在JSP中,`&lt;jsp:forward&gt;`和`response.sendRedirect()`方法可以实现请求的转发和重定向,这在Servlet中同样可行。 ### 学习资源 为了深入理解JSP的原理,你可以通过以下资料进行学习: - **...

    在jsp中使用自定义taglib

    在JavaServer Pages (JSP) 中,自定义Taglib是一种扩展JSP功能的方式,它允许开发者创建可重用的自定义标签,以提高代码的可读性和可维护性。自定义Taglib通常由一系列标签(Tag)组成,这些标签对应于特定的Java类...

    JSP中(jsp+servlet)实现的文件上传

    本教程将详细讲解如何在JSP(Java Server Pages)环境中,结合Servlet技术,实现一个简单的文件上传功能,特别是针对图片格式(如gif和jpg),同时阻止危险文件类型(如exe和bat)的上传。 首先,我们需要理解JSP和...

    JSP 利用标签实现分页技术

    1. **创建Tag类**:在Java中创建一个继承自`javax.servlet.jsp.tagext.TagSupport`的类,这个类将包含分页所需的所有逻辑。例如,我们可以定义属性如当前页数、每页显示的条目数、总记录数等。同时,提供方法来计算...

    JSP自定义标签实现数据字典

    自定义标签是由Java类实现的,这些类通常继承自`javax.servlet.jsp.tagext.TagSupport`或`javax.servlet.jsp.tagext.SimpleTagSupport`。这些类提供了标签生命周期的方法,如`doStartTag()`和`doEndTag()`,开发者...

    struts2实现在jsp页面对员工的增删改查操作

    在这个实例中,“struts2实现在jsp页面对员工的增删改查操作”意味着我们将探讨如何使用Struts2框架来处理员工管理的基本功能,包括添加、删除、更新和查询员工信息,并在JSP页面上展示这些操作。 首先,我们需要...

    JSP参数接收工具类.rar

    在这个"JSP参数接收工具类.rar"压缩包中,包含了两个重要的文件:"JSP参数接收工具类(ParamUtils.txt)"和"类加载工具.txt"。这些文件很可能是为了帮助开发者更方便地管理和处理JSP页面传入的请求参数,以及理解类...

    springboot+JPA+JSP实现登录功能

    在本项目中,"springboot+JPA+JSP实现登录功能"是一个基于Spring Boot框架,结合Java Persistence API (JPA) 和JavaServer Pages (JSP) 创建的Web应用程序,用于实现用户登录功能。以下是对这个项目的详细知识解析:...

    jsp(Websocket) 实现web实时通讯

    在JSP中,我们可以创建一个隐藏的WebSocket连接元素,通过JavaScript控制其打开和关闭,并处理接收到的消息。 在实现web实时通讯时,首先需要在服务器端创建WebSocket服务端点。例如,可以创建一个名为`...

    jsp 自定义标签实例

    这个类需要继承`javax.servlet.jsp.tagext.TagSupport`或实现`javax.servlet.jsp.tagext.Tag`接口。在`doStartTag()`和`doEndTag()`方法中编写处理逻辑。例如,你可能在`doStartTag()`中初始化变量,然后在`doEndTag...

    jsp面试题及答案

    * page:处理JSP网页,是Object类的一个实例,指的是JSP实现类的实例。 * exception:处理JSP文件执行时发生的错误和异常。 6.JSP乱码解决方案 JSP乱码解决方案有多种,例如在JSP页面显示乱码、表单提交中文时出现...

    IDEA下SpringBoot+JSP+MySQL集成Demo实现简单登陆注册

    在本教程中,我们将深入探讨如何在IntelliJ IDEA(IDEA)环境下使用Spring Boot、JSP和MySQL数据库创建一个简单的登录注册应用。这个集成Demo是后端开发的基础,可以帮助初学者理解这些技术如何协同工作。 首先,让...

    基于JSP的简单学生信息管理系统

    在本系统中,Servlet主要负责处理由JSP页面传递过来的请求,执行业务逻辑,如数据库操作,然后返回响应数据给JSP。Servlet通过继承HttpServlet类并重写doGet()和doPost()方法来处理HTTP请求。 数据库管理是系统的...

    jsp 登陆页面验证码的实现

    - 首先,创建一个名为`RandomImageServlet`的Servlet类,该类继承自`javax.servlet.http.HttpServlet`。 - 在`doGet`方法中,我们将生成随机字符串并将其转换为图像。可以使用Java的`java.util.Random`类生成随机...

    jsp java自定义标签 实现分页 当前位置标签

    3. 处理分页逻辑:在标签实现类中,你需要实现计算总页数、当前页、上一页、下一页等功能。这通常涉及到数据库查询,获取总记录数,并根据每页显示的记录数计算总页数。 4. 输出HTML:在`doEndTag()`方法中,根据...

    自定义Action继承ActionSupport实现简单登录

    在学习Struts2的过程中,理解Action类的作用和`ActionSupport`提供的便利是非常重要的,这有助于我们更好地设计和实现Web应用的控制层。通过不断的实践和学习,你将能够熟练地运用Struts2进行复杂的Web开发。

Global site tag (gtag.js) - Google Analytics