做了个简单的实验:写一个tag,将tag body中的内容打印成一个三角形

代码很简单就不赘述了,直接贴在下面,值得注意的是这个图(摘自李兴华JAVA开发实战经典)

在做的过程中遇到了如下问题:

1. getBodyContent()返回null

  原因:doStartTag()应该返回EVAL_BODY_BUFFERED而不是EVAL_BODY_INCLUDE,否则bodyContent在doAfterBody()中是不可见的

2. pageContext.getOut().println()无法向页面输出内容

  原因:bodyContent本身就是一个JspWriter,应该使用BodyTagSupport.getPreviousOut().println()进行输出

  关于这个问题,参考此页面 http://www.coderanch.com/t/175316/java-Web-Component-SCWCD/certification/BodyTag-getPreviousOut-getPageContext-getOut

  

代码如下,这个Tag有一个可选参数:size,表示三角形的大小

FunnyTriangleTag.java

public class FunnyTriangleTag extends BodyTagSupport {
private static final int DEFAULT_SIZE = 2;
private int size = -1; public int getSize() {
return size;
} public void setSize(int size) {
this.size = size;
} private int count = 0; @Override
public int doStartTag() throws JspException {
if (size < DEFAULT_SIZE) {
count = DEFAULT_SIZE;
} else {
count = size;
}
return EVAL_BODY_BUFFERED;
} @Override
public int doAfterBody() throws JspException {
if (count-- > 0) {
try {
String string = this.getBodyContent().getString();
this.getPreviousOut().println("<p>"+string+"</p>");
} catch (IOException e) {
e.printStackTrace();
}
return EVAL_BODY_AGAIN;
} else {
return SKIP_BODY;
}
} @Override
public int doEndTag() throws JspException {
size = -1;
count = 0;
return EVAL_PAGE;
} }

index.jsp

<%@ page language="java" contentType="text/html; charset=GBK"
pageEncoding="GBK"%>
<%@ taglib uri="http://tags.xxx.com/foo" prefix="foo" %>
<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=GBK">
<title>Insert title here</title>
</head>
<body>
<foo:funnyTriangle size="5">你好</foo:funnyTriangle>
<foo:funnyTriangle>默认1</foo:funnyTriangle>
<foo:funnyTriangle size="-1">默认2</foo:funnyTriangle>
</body>
</html>

foo.tld

<?xml version="1.0" encoding="UTF-8" ?>

<taglib xmlns="http://java.sun.com/xml/ns/j2ee"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://java.sun.com/xml/ns/j2ee http://java.sun.com/xml/ns/j2ee/web-jsptaglibrary_2_0.xsd"
version="2.0"> <description>xxx's foo tags</description>
<display-name>xxx foo tags</display-name>
<tlib-version>1.0</tlib-version>
<short-name>foo</short-name>
<uri>http://tags.xxx.com/foo</uri> <tag>
<description>Print the string in the tag body repeatedly to form a triangle shape.</description>
<name>funnyTriangle</name>
<tag-class>com.v1.ex118.FunnyTriangleTag</tag-class>
<body-content>JSP</body-content>
<attribute>
<description>
The size of the triangle, no less than 2. If the size is less
than 2, a default-sized triangle will be displayed.
</description>
<name>size</name>
<required>false</required>
<rtexprvalue>true</rtexprvalue> <!-- support EL -->
<type>java.lang.Integer</type>
</attribute>
</tag>
</taglib>

BodyTagSupport小案例1的更多相关文章

  1. 机械表小案例之transform的应用

    这个小案例主要是对transform的应用. 时钟的3个表针分别是3个png图片,通过setInterval来让图片转动.时,分,秒的转动角度分别是30,6,6度. 首先,通过new Date函数获取 ...

  2. shell讲解-小案例

    shell讲解-小案例 一.文件拷贝输出检查 下面测试文件拷贝是否正常,如果cp命令并没有拷贝文件myfile到myfile.bak,则打印错误信息.注意错误信息中basename $0打印脚本名.如 ...

  3. [jQuery学习系列六]6-jQuery实际操作小案例

    前言最后在这里po上jQuery的几个小案例. Jquery例子1_占位符使用需求: 点击第一个按钮后 自动去check 后面是否有按钮没有选中, 如有则提示错误消息. <html> &l ...

  4. 02SpringMvc_springmvc快速入门小案例(XML版本)

    这篇文章中,我们要写一个入门案例,去整体了解整个SpringMVC. 先给出整个项目的结构图:

  5. React.js入门小案例

    <!DOCTYPE html> <html> <head> <meta charset="UTF-8" /> <title&g ...

  6. SqlDependency缓存数据库表小案例

    SqlDependency的简介: SqlDependency是outputcache网页缓存的一个参数,它的作用是指定缓存失效的数据库依赖项,可以具体到数据库和表. SqlDependency能解决 ...

  7. JavaScript apply函数小案例

    //回调函数1 function callback(a,b,c) { alert(a+b+c); } //回调函数2 function callback2(a,b) { alert(a+b); } / ...

  8. Session小案例------完成用户登录

    Session小案例------完成用户登录     在项目开发中,用户登陆功能再平常只是啦,当用户完毕username和password校验后.进入主界面,须要在主界面中显示用户的信息,此时用ses ...

  9. ch1-vuejs基础入门(hw v-bind v-if v-for v-on v-model 应用组件简介 小案例)

    1 hello world 引入vue.min.js 代码: ----2.0+版本 <div id="test"> {{str}} </div> <s ...

随机推荐

  1. jdo pom

    <project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/20 ...

  2. ylbtech-LanguageSamples-Versioning(版本控制)

    ylbtech-Microsoft-CSharpSamples:ylbtech-LanguageSamples-Versioning(版本控制) 1.A,示例(Sample) 返回顶部 “版本控制”示 ...

  3. 有关ubuntu16.04进行sudo apt-get update更新时出现:‘。。。N: 无法安全地用该源进行更新,所以默认禁用该源。。。’等问题解决方案

    关于ubuntu16.04在 sudo apt-get update 时出现如下错误: 针对这种情况,本人结合网上的解决方案总结出以下方案,三条命令搞定,希望有用. 1. 进入 sources.lis ...

  4. megalo -- 网易考拉小程序解决方案

    megalo 是基于 Vue 的小程序框架(没错,又是基于 Vue 的小程序框架),但是它不仅仅支持微信小程序,还支持支付宝小程序,同时还支持在开发时使用更多 Vue 的特性. 背景 对于用户而言,小 ...

  5. OpenCV和Matlab

    OpenCV(Open Computer Vision)是现在流行的做计算机视觉和图像处理的工具库.Matlab一般用于快速实现算法和测试,用于研究理论,OpenCV适合开发实际的图像处理或视觉的应用 ...

  6. php抽象与接口的区别[转载]

    来自:http://www.cnblogs.com/k5054/archive/2012/12/26/2834205.html 对于面向对象开发,抽象类与接口这两个东西是比较难理解的! 今天看了一整天 ...

  7. HDU 1104 Remainder (BFS(广度优先搜索))

    Remainder Time Limit: 6000/3000 MS (Java/Others) Memory Limit: 65536/32768 K (Java/Others) Total Sub ...

  8. 使用VisualSVN建立SVN服务器

    原地址:http://blog.csdn.net/happyjiang2009/article/details/5719988 以前使用官方Subversion搭建SVN版本控制环境,感觉很繁琐,需要 ...

  9. angular 禁止事件冒泡 和 默认行为

    事件冒泡和事件捕捉一直以来都是被讨论的话题,也许大家平时在工作中没有遇到过需要解决事件冒泡的情况举个例子: <body ng-click="fun1()"> <d ...

  10. git push --set-upstream origin

    设置本地分支追踪远程分支 之后就可以直接使用git push提交代码