JSP自定义标签(一瞧就会)

一、继承TagSupport

1、创建普通Java类

这里的类需要继承TagSupport,然后使用继承过来的方法doStartTag(eclipse快捷键:Alt+Shift+s,选择Override/Implement Methosd…)

下面为返回值所表达的意思:
返回值所表达的意思
案列1-
——无属性的标签(此标签功能:直接输出字符)

package com.java.tag;

import java.io.IOException;

import javax.servlet.jsp.JspException;
import javax.servlet.jsp.JspWriter;
import javax.servlet.jsp.tagext.TagSupport;

//引用自定义标签输出“haoren”
public class Mytag extends TagSupport{
	@Override
	public int doStartTag() throws JspException {
		JspWriter out = this.pageContext.getOut();
		try {
			out.write("haoren");
		} catch (IOException e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
		}
		// TODO Auto-generated method stub
		return TagSupport.SKIP_BODY;
	}		
}

案列2-
——有属性的标签(此标签功能:使用属性更改当前日期输出格式)

package com.java.tag;

import java.io.IOException;
import java.text.SimpleDateFormat;
import java.util.Date;

import javax.servlet.jsp.JspException;
import javax.servlet.jsp.tagext.TagSupport;

//引用自定义标签输出更改当前日期输出格式
public class FormatDateTag extends TagSupport{
	private String formats;
	
	public String getFormats() {
		return formats;
	}
	public void setFormats(String formats) {
		this.formats = formats;
	}

	@Override
	public int doStartTag() throws JspException {
		//判断是否为空
		if(formats!=null){
			String date =new SimpleDateFormat(formats).format(new Date());
			try {
				this.pageContext.getOut().print(date);
			} catch (IOException e) {
				// TODO Auto-generated catch block
				e.printStackTrace();
			}
		}
		// TODO Auto-generated method stub
		return TagSupport.SKIP_BODY;
	}
	
}

2、创建tld文件

body-content为标签体的限制,它有4个值:
—— a、empty:不允许有标签体(jsp和html中<>标签体</>)。
—— b、jsp:允许有jsp代码。
—— c、scriptless:不允许有脚本代码(也就是<%%>)。
—— d、tagdepentend:标签体内的JSP代码不会被解析,直接输出文本。

<?xml version="1.0" encoding="UTF-8"?>


<taglib xmlns="http://java.sun.com/xml/ns/j2ee"
    xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
    xsi:schemaLocation="http://java.sun.com/xml/ns/j2ee http://java.sun.com/xml/ns/j2ee/web-jsptaglibrary_2_0.xsd"
    version="2.0">
   <!-- 版本号 -->
    <tlib-version>1.0</tlib-version>
    <!-- 最好与文件名同名,可任意写 -->
    <short-name>mytag</short-name>
    <!-- taglib中的uri引入标签时需要,可任意写 -->
    <uri>http://www.xinhua.com/mytag</uri>
    
    <tag>
    	<!-- 标签名 -->
        <name>mytag</name>
        <!-- 实现类 -->
        <tag-class>com.java.tag.Mytag</tag-class>
        <!-- empty不允许有标签体 -->
        <body-content>empty</body-content>
    </tag>
    


    <tag>
    	<!-- 标签名 -->
        <name>dateformat</name>
        <!-- 实现类 -->
        <tag-class>com.java.tag.FormatDateTag</tag-class>
        <!-- empty不允许有标签体 -->
        <body-content>empty</body-content>
        
        <attribute>
        	<!-- 标签属性名-->   
        	<name>formats</name>
        	<!-- 是否为可选属性 -->
        	<required>false</required>
        	<!-- 是否能使用EL表达式 -->
        	<rtexprvalue>true</rtexprvalue>
        </attribute>
    </tag>
    
</taglib>

3、Jsp实现自己创建好的标签

别忘了使用taglib引入自己写好的标签

<%@ page language="java" contentType="text/html; charset=UTF-8"
    pageEncoding="UTF-8"%>
<%@ taglib prefix="m" uri="http://www.xinhua.com/mytag" %>
<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title>Insert title here</title>
</head>
<body>

	<m:mytag/><br>
	
	<!-- 给当前时间给格式 -->
	<m:dateformat/>在类里面判断了属性是否为空,所以没有给东西就没有显示<br>
	<m:dateformat formats="yyyy/MM/dd"/><br>
	<m:dateformat formats="yyyy年MM月dd日  HH时mm分ss秒"/><br>
	
</body>
</html>

在这里插入图片描述

二、继承BodyTagSupport

1、BodyTagSupport类说明

  • BodyTagSupport类的方法:
    编写标签对应的实现类时,需要重载BodyTagSupport类几个方法:
    doStartTag(), setBodyContent(), doInitBody(), doAfterBody(), doEndTag();

  • 他们执行顺序如下:
    doStartTag()→doInitBody()→setBodyContent()→doAfterBody()→doEndTag()

  • doStartTag()方法可返回EVAL_BODY_INCLUDE或SKIP_BODY,
    如果返回EVAL_BODY_INCLUDE则继续执行;
    如果返回SKIP_BODY则接下来的doInitBody(),setBodyContent(), doAfterBody()三个方法不会被执行,而直接执行doEndTag()方法。

  • setBodyContent()方法用于设置标签体内容,如果在此之前要作一些初始化工作,则在doInitBody()方法中完成。

  • 标签体内容执行完后,会调用doAfterBody()方法
    此方法可返回 EVAL_BODY_TAG, SKIP_BODY, EVAL_PAGE或SKIP_PAGE。
    如果返回EVAL_BODY_TAG则会再次设置标签体内容,直到返回SKIP_BODY;
    如果返回EVAL_PAGE则标签体执行完后会继续执行JSP页面中接下来的部分;
    如果返回SKIP_PAGE,则JSP页面的后续内容将不再执行。

  • 标签中静态常量:
    EVAL_BODY_INCLUDE:告诉服务器正文的内容,并把这些内容送入输出流
    SKIP_BODY:告诉服务器不要处理正文内容
    EVAL_PAGE:让服务器继续执行页面
    SKIP_PAGE:让服务器不要处理剩余的页面
    EVAL_BODY_AGAIN:让服务器继续处理正文内容,只有doAfterBody方法可以返回
    EVAL_BODY_BUFFERED:BodyTag接口的字段,在doStartTag()返回

    EVAL_BODY_INCLUDE、SKIP_BODY一般由doStartTag()返回,而EVAL_PAPGE、SKIP_PAGE由doEndTag()返回。

a、案列(修改标签体的内容)

(1)、创建普通Java类

需要继承BodyTagSupport

package com.java.tag;

import java.io.IOException;

import javax.servlet.jsp.JspException;
import javax.servlet.jsp.tagext.BodyContent;
import javax.servlet.jsp.tagext.BodyTagSupport;


public class IIrevise_content extends BodyTagSupport{
	private String ss;
	
	public String getSs() {
		return ss;
	}
	public void setSs(String ss) {
		this.ss = ss;
	}

	@Override
	public int doStartTag() throws JspException {
		return BodyTagSupport.EVAL_BODY_BUFFERED;
	}

	@Override
	public int doEndTag() throws JspException {
		BodyContent bc = this.getBodyContent();
		String s = bc.getString();
		String st = s + ss;
		try {
			this.pageContext.getOut().print(st);
		} catch (IOException e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
		}
		return BodyTagSupport.EVAL_PAGE;
	}
}

(2)、创建tld文件
<?xml version="1.0" encoding="UTF-8"?>
<taglib xmlns="http://java.sun.com/xml/ns/j2ee"
    xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
    xsi:schemaLocation="http://java.sun.com/xml/ns/j2ee http://java.sun.com/xml/ns/j2ee/web-jsptaglibrary_2_0.xsd"
    version="2.0">
   <!-- 版本号 -->
    <tlib-version>1.0</tlib-version>
    <!-- 最好与文件名同名,可任意写 -->
    <short-name>mytag</short-name>
    <!-- taglib中的uri引入标签时需要,可任意写 -->
    <uri>http://www.xinhua.com/mytag</uri>
  
    
    <tag>
        <name>IIrevise_content</name>
        <tag-class>com.java.tag.IIrevise_content</tag-class>
        <body-content>JSP</body-content>
        
         <attribute>  
        	<name>ss</name>
        	<required>true</required>
        	<rtexprvalue>true</rtexprvalue>
        </attribute>
    </tag>
    
</taglib>

(31)、Jsp实现自己创建好的标签
<%@ page language="java" contentType="text/html; charset=UTF-8"
    pageEncoding="UTF-8"%>
<%@ taglib prefix="m" uri="http://www.xinhua.com/mytag" %>
<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title>Insert title here</title>
</head>
<body>		
	<!-- 修改标签体的内容 -->
	<m:IIrevise_content ss="好勒"></m:IIrevise_content>
</body>
</html>

在这里插入图片描述

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值