1.完整的示例代码:
标签体的处理器类,JspFragmentTest.java
package com.javaweb.tag; import java.io.IOException; import java.io.StringWriter; import javax.servlet.jsp.JspException; import javax.servlet.jsp.tagext.JspFragment; import javax.servlet.jsp.tagext.SimpleTagSupport; public class JspFragmentTest extends SimpleTagSupport { public void doTag() throws JspException,IOException{ JspFragment bodyContent=getJspBody(); //JspFragment.invoke(Writer):Writer即为标签体内容输出的字符流,若为null, //则输出到getJspContext().getOut(),即输出到页面上。 //bodyContent.invoke(null); //利用StringWriter得到标签体的内容 StringWriter sw=new StringWriter(); bodyContent.invoke(sw); //把标签体的内容都变为大写 String content =sw.toString().toUpperCase(); //获取jsp页面的out隐含对象,输出到页面上 getJspContext().getOut().print(content); } }
tld文件,jspfragment.tld
<?xml version="1.0" encoding="UTF-8"?> <taglib xmlns="http://java.sun.com/xml/ns/javaee" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://java.sun.com/xml/ns/javaee http://java.sun.com/xml/ns/javaee/web-jsptaglibrary_2_1.xsd" version="2.1"> <description>MyTag 1.1 core library</description> <display-name>MyTag core</display-name> <tlib-version>1.1</tlib-version> <short-name>c</short-name> <uri>http://java.koala.com/jsp/jstl/core</uri> <tag> <name>jspFragmentTest</name> <tag-class>com.javaweb.tag.JspFragmentTest</tag-class> <body-content>scriptless</body-content> </tag> </taglib>
jsp调用文件,jspFragmentTest.jsp
<%@ page language="java" import="java.util.*" pageEncoding="UTF-8"%> <%@ taglib uri="http://java.koala.com/jsp/jstl/core" prefix="koala"%> <% String path = request.getContextPath(); String basePath = request.getScheme()+"://"+request.getServerName()+":"+request.getServerPort()+path+"/"; %> <!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN"> <html> <head> <base href="<%=basePath%>"> <title>My JSP 'jspFragmentTest.jsp' starting page</title> <meta http-equiv="pragma" content="no-cache"> <meta http-equiv="cache-control" content="no-cache"> <meta http-equiv="expires" content="0"> <meta http-equiv="keywords" content="keyword1,keyword2,keyword3"> <meta http-equiv="description" content="This is my page"> <!-- <link rel="stylesheet" type="text/css" href="styles.css"> --> </head> <body> <koala:jspFragmentTest>Hello,koala!</koala:jspFragmentTest> </body> </html>
1.1 若一个标签有标签体,类似于<koala:jspFragmentTest>Hello,koala!</koala:jspFragmentTest>,在自定义标签的标签处理器中使用JspFragment对象封装标签体信息。
1.2 若配置了标签含有标签体,则jsp引擎会调用setJspBody()方法把JspFragment传递给标签处理器类。在SimpleTagSupport中还定义了一个getJspBody()方法,用于返回JspFragment对象。
1.3 JspFragment的invoke(Writer)方法:把标签体内容从Writer中输出,若为null,则等同于invoke(getJspContext().getOut()),即直接把标签体内容输出到页面上。有时,可以借助于StringWriter,可以在标签处理器中先得到标签体的内容:
//利用StringWriter得到标签体的内容 StringWriter sw=new StringWriter(); bodyContent.invoke(sw);
1.4 在tld文件中,使用body-content节点来描述标签体的类型:
<body-content>:指定标签体的类型,大部分情况下,取值为scriptless。可能取值有三种:
empty:没有标签体
scriptless:标签体可以包含el表达式和jsp动作元素,但不能包含jsp的脚本元素;
扫描二维码关注公众号,回复:
4040440 查看本文章
tagdependent:表示标签体由标签本身去解析处理。若指定为tagdependent,在标签体中的所有代码都会原封不动地交给标签处理器,而不是将执行结果交给标签处理器。