1. 程式人生 > >javaweb中帶標籤體的自定義標籤

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,在標籤體中的所有程式碼都會原封不動地交給標籤處理器,而不是將執行結果交給標籤處理器。