做了个简单的实验:写一个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. 使用nsswitch控制linux dns解析顺序

    参考:1.DNS原理入门参考:http://www.ruanyifeng.com/blog/2016/06/dns.html 2.http://cn.linux.vbird.org/linux_ser ...

  2. 对自助提卡系统EDLM的一次代码审计

    前言 并非有意愿要审计该站,前面的走的黑盒没有过于精彩部分就不在贴上了,对于此系统站你们懂的,多说无益,这套程序是开源的,像这种自助提卡系统相信大家已经不在陌生了,很多违法网站通过这种平台方式提卡密的 ...

  3. dedecms会员注册注入漏洞

    一.首先访问“/data/admin/ver.txt”页面获取系统最后升级时间,(判断是否是dede的cms 以及看看是否和这个漏洞相对应)二.然后访问“/member/ajax_membergrou ...

  4. (转)Android项目重构之路:界面篇

    在前一篇文章<Android项目重构之路:架构篇>中已经简单说明了项目的架构,将项目分为了四个层级:模型层.接口层.核心层.界面层.其中,最上层的界面,是变化最频繁的一个层面,也是最复杂最 ...

  5. 提取nds游戏的音乐

    nds游戏绝对是游戏界的瑰宝,尤其是有些游戏的音乐还很好听,所以想把它们提取出来.网上搜了下教程,这里整理一下,全程在archlinux下操作. 首先用到的工具是(vgmtrans)[https:// ...

  6. CocoSourcesCS 1

    CocoSourcesCS 1 /*------------------------------------------------------------------------- Compiler ...

  7. XP系统如何把桌面图标变大

    右击桌面,属性,外观,高级,在项目里面找到图标,大小改为你喜欢的样式.   我测试的结果是:图标大小改为42,字体大小改为8,图标垂直间距改为100,水平间距改为54效果不错.

  8. 网页图表控件Highcharts选项配置参数

    Highcharts提供大量的选项配置参数,您可以轻松定制符合用户要求的图表,目前官网只提供英文版的开发配置说明文档,而中文版的文档网上甚少,且零散不全.这里,我把Highcharts常用的最核心的参 ...

  9. LoadRunner录制:检查点

    LoadRunner怎么request是否执行成功呢?它通过判断服务器返回的HTTP状态码,如果是200 OK,那么VuGen就认为脚本运行通过. 但是很多时候事务执行失败并不一定返回错误的状态码,比 ...

  10. STL源码剖析(容器适配器)

    在STL中,有一类容器完全以底部容器为基础进行实现,这类容器归类为container adapter. priority_queue priority_queue默认使用vector为基础,加上hea ...