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的脚本元素;

扫描二维码关注公众号,回复: 4040440 查看本文章

tagdependent:表示标签体由标签本身去解析处理。若指定为tagdependent,在标签体中的所有代码都会原封不动地交给标签处理器,而不是将执行结果交给标签处理器。

猜你喜欢

转载自www.cnblogs.com/naihuangbao/p/9877526.html