收藏 分享(赏)

JSP中实现类的继承.doc

上传人:gnk289057 文档编号:8955336 上传时间:2019-07-18 格式:DOC 页数:8 大小:99KB
下载 相关 举报
JSP中实现类的继承.doc_第1页
第1页 / 共8页
JSP中实现类的继承.doc_第2页
第2页 / 共8页
JSP中实现类的继承.doc_第3页
第3页 / 共8页
JSP中实现类的继承.doc_第4页
第4页 / 共8页
JSP中实现类的继承.doc_第5页
第5页 / 共8页
点击查看更多>>
资源描述

1、JSP 中实现“类“ 的继承核心提示:1. 介绍 使用过 python django 模板的应该清楚,django 里面有一个激动人心的功能就是模板可以使用类的继承关系。 即模板是可以继承的,并且不限继承的层次。 如 1. child.html extends base.html 2.grandchild.html extends child.html 这样,我们在base.html 中1.介绍使用过 python django 模板的应该清楚,django 里面有一个激动人心的功能就是模板可以使用类的继承关系。 即模板是可以继承的,并且不限继承的层次。如1. child.html exten

2、ds base.html2. grandchild.html extends child.html这样,我们在 base.html 中定义好 html 布局,然后在“子类”(我们这样称呼吧)重定义需要父页面内容即可2.jsp 继承示例现在我们来看 jsp 中如何实现此功能(django 与下面的声明类似 )。父页面: base.jsp,定义布局Jsp 代码 1. 2. 3. base_head_content 4. 5. 6. base_body_content 7. 8. 子页面: child.jspJsp 代码 1. 2. 3. 4. child_body_content 5. 6. 7.

3、 8. 如上: 我们使用了两个 jsp tag: block,override,还有指令.下面描述各个功能: override tag: 会将标签里面的内容保存为 pageContext 的变量,变量名称为 name 的属性加前缀,如 _override_$name = tag 内容 block tag: 根据 name 属性名称,如果发现_override_$name 变量,则显示被重定义的内容,否则显示自身 tag 的内容. 指令: 通过该指令来实现继承(extends)的功能(只能使用这个技巧),该指令必须放置在页面的最后面 输出:直接访问 base.jsp 输出:Html 代码 1.

4、2. base_head_content 3. 4. 5. base_body_content 6. 7. 访问 child.jsp 输出:Html 代码 1. 2. base_head_content 3. 4. 5. child_body_content 6. 7. 可以看到,child.jsp 的的 body 输出内容被重定义了.现该 tag 可以实现 jsp 的无限级的继承关系. 即 grandchild.jsp 继承 child.jsp , child.jsp 继承 base.jsp 3.具体实现方式:Block Tag:Java 代码 1.public class BlockTag

5、 extends TagSupport 2. 3. private String name; 4. 5. public void setName(String name) 6. this.name = name; 7. 8. 9. Override 10. public int doStartTag() throws JspException 11. return getOverriedContent() = null ? EVAL_BODY_INCLUDE : SKIP_BODY; 12. 13. 14. Override 15. public int doEndTag() throws J

6、spException 16. String overriedContent = getOverriedContent(); 17. if(overriedContent = null) 18. return EVAL_PAGE; 19. 20. 21. try 22. pageContext.getOut().write(overriedContent); 23. catch (IOException e) 24. throw new JspException(“tag output error“,e); 25. 26. return EVAL_PAGE; 27. 28. 29. priva

7、te String getOverriedContent() 30. String varName = Utils.getOverrideVariableName(name); 31. return (String)pageContext.getAttribute(varName); 32. 33. Override Tag:Java 代码 1.public class OverrideTag extends BodyTagSupport 2. 3. private String name; 4. 5. public void setName(String name) 6. this.name

8、 = name; 7. 8. 9. Override 10. public int doStartTag() throws JspException 11. return isOverrided() ? SKIP_BODY : EVAL_BODY_BUFFERED; 12. 13. 14. Override 15. public int doEndTag() throws JspException 16. if(isOverrided() 17. return EVAL_PAGE; 18. 19. BodyContent b = getBodyContent(); 20. String var

9、Name = Utils.getOverrideVariableName(name); 21. pageContext.setAttribute(varName, b.getString(); 22. return EVAL_PAGE; 23. 24. 25. private boolean isOverrided() 26. String varName = Utils.getOverrideVariableName(name); 27. return pageContext.getAttribute(varName) != null; 28. 29. 30. 工具类:Java 代码 1.c

10、lass Utils 2. public static String BLOCK = “_override_“; 3. public static String getOverrideVariableName(String name) 4. return BLOCK + name; 5. 6. 可以看到,实现代码不需要 100 行,重要是的实现技巧,由此,你从此可以放弃使用sitemesh. 并且如上实现方式具有更高性能。并且笔者也扩展了 freemarker 模板,通过自定义指令,实现如上相同的功能。JSTL 自定义标签过程博客分类: webJSPJavaMyeclipseServletWe

11、b要定义自己的标签,首先写个 java 类,extends TagSupport 或者 implements Tag ,然后在类体里实现自己想要的方法,或者覆盖父类的方法。 我定义的 MyTag 代码如下: Java 代码 1. package com.xll.util; 2. 3. import java.io.IOException; 4. 5. import javax.servlet.jsp.JspException; 6. import javax.servlet.jsp.JspWriter; 7. import javax.servlet.jsp.tagext.TagSupport

12、; 8. 9. public class MyTag extends TagSupport 10. private String msg; 11. 12. public void setMsg(String msg) 13. this.msg = msg; 14. 15. 16. 17. public MyTag() 18. System.out.println(“MyTag 构造方法:一个 myTag 类的对象被构建了“); 19. 20. 21. public int doStartTag() 22. JspWriter out = this.pageContext.getOut(); 2

13、3. 24. try 25. out.print(msg); 26. catch (IOException e) 27. e.printStackTrace(); 28. 29. 30. System.out.println(“对象正在处理开始标记.“); 31. return EVAL_BODY_INCLUDE; 32. 33. public int doAfterBody() throws JspException 34. System.out.println(“处理标签体(after body)“ ); 35. return SKIP_BODY; 36. 37. public int d

14、oEndTag() throws JspException 38. System.out.println(“对象正在处理结束标记.“); 39. return EVAL_PAGE; 40. 41. 然后用 MyEclipse 在 WEB-INF 下创建一个 tld 文件,代码如下: Java 代码 1. 2. 4. 5. 1.0 6. 1.2 7. my 8. xll 9. 10. 11. my 12. com.xll.util.MyTag 13. empty 14. 15. msg 16. true 17. true 18. 19. 20. 21. 这样的步骤已经可以在你的 JSP 页面中使

15、用自定义的标签了,使用方法如下: 在 JSP 页面中, Java 代码 1. 2. 然后, Java 代码 1. 2. 3. 4. body-contentbody-content 的值有下面 4 种:tagdependent:标签体内容直接被写入 BodyContent,由自定义标签类来进行处理,而不被 JSP 容器解释,如下:select name,age from usersJSP:接受所有 JSP 语法,如定制的或内部的 tag、scripts、静态 HTML、脚本元素、JSP 指令和动作。如:/ 具体可参考后面附源码。empty:空标记,即起始标记和结束标记之间没有内容。下面几种写法都是有效的,scriptless:接受文本、EL 和 JSP 动作。如上述使用 scriptless 则报错,具体可参考后面附源码。

展开阅读全文
相关资源
猜你喜欢
相关搜索

当前位置:首页 > 企业管理 > 管理学资料

本站链接:文库   一言   我酷   合作


客服QQ:2549714901微博号:道客多多官方知乎号:道客多多

经营许可证编号: 粤ICP备2021046453号世界地图

道客多多©版权所有2020-2025营业执照举报