博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
BodyTagSupport小案例1
阅读量:5019 次
发布时间:2019-06-12

本文共 2783 字,大约阅读时间需要 9 分钟。

做了个简单的实验:写一个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("

"+string+"

"); } 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" %>
Insert title here
你好
默认1
默认2

foo.tld

xxx's foo tags
xxx foo tags
1.0
foo
http://tags.xxx.com/foo
Print the string in the tag body repeatedly to form a triangle shape.
funnyTriangle
com.v1.ex118.FunnyTriangleTag
JSP
The size of the triangle, no less than 2. If the size is less than 2, a default-sized triangle will be displayed.
size
false
true
java.lang.Integer

 

转载于:https://www.cnblogs.com/qrlozte/p/3540396.html

你可能感兴趣的文章
Vue双向绑定原理详解
查看>>
Android基础总结(5)——数据存储,持久化技术
查看>>
关于DataSet事务处理以及SqlDataAdapter四种用法
查看>>
bootstrap
查看>>
http://lorempixel.com/ 可以快速产生假图
查看>>
工程经验总结之吹水"管理大境界"
查看>>
为什么JS动态生成的input标签在后台有时候没法获取到
查看>>
20189210 移动开发平台第六周作业
查看>>
java之hibernate之基于外键的双向一对一关联映射
查看>>
java之aop
查看>>
java之spring mvc之页面跳转
查看>>
java之spring mvc之Restful风格开发及相关的配置
查看>>
json编码解码方法
查看>>
.Net使用SignalR实现实时推送功能
查看>>
如何更改已经pushed的commit的注释信息(How to change the pushed commit message)
查看>>
Git 版本回退的几种操作方法
查看>>
Linux新建用户,切换后只显示$问题
查看>>
Linux 批量添加用户
查看>>
Excel 不同文件、sheet 关联引用(vlookup函数)
查看>>
ELK 错误: retrying failed action with response code: 403, kibana无log显示
查看>>