javaweb中帶標籤體的自定義標籤
阿新 • • 發佈:2018-11-12
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,在標籤體中的所有程式碼都會原封不動地交給標籤處理器,而不是將執行結果交給標籤處理器。