zoukankan      html  css  js  c++  java
  • 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,在标签体中的所有代码都会原封不动地交给标签处理器,而不是将执行结果交给标签处理器。

  • 相关阅读:
    Windows消息初探(1)
    配置Git Extension免密码发布代码到CSDN
    一个简单的参数校验类
    Functions类,一个Javascript的函数加法类,将两个函数加起来,顺序执行
    对Javascript异步执行的理解
    aws在线技术峰会笔记-游戏解决方案
    aws在线技术峰会笔记-主会场
    努力成长为一只全栈工程师
    翻译:在Ubuntu 14.04上安装FTP服务器的方法
    奇妙的时间旅程
  • 原文地址:https://www.cnblogs.com/naihuangbao/p/9877526.html
Copyright © 2011-2022 走看看