javaweb中带标签体的自定义标签
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的脚本元素;
tagdependent:表示标签体由标签本身去解析处理。若指定为tagdependent,在标签体中的所有代码都会原封不动地交给标签处理器,而不是将执行结果交给标签处理器。

浙公网安备 33010602011771号