自定义标签--简单标签学习笔记

注意点1:setJspBody方法和doTag方法是整个简单标签里最重要的两个方法。服务器在调用标签的时候,首先会调用setJspBody方法,把标签体作为一个JspFragment对象传递进来。接着,服务器遇到标签执行的时候调用doTag方法,要特别注意的是,简单标签没有开始标签和结束标签之分!

注意点2:设置标签体类型scriptless。因为在JSP2.0中,sun公司已经不建议在JSP页面中写脚本代码!如果设置标签体类型JSP,这样JSP页面中就可以写脚本代码。


执行流程:浏览器向服务器发出请求,服务器执行jsp。遇到简单标签,第一步,实例化标签处理器类;第二步,调用setJspContext,把页面pageContext传递给标签处理器类;第三步,调用setParent,把父标签传递进去,如果没有,传null;第四步,调用setJspBody方法,把封装了标签体JspFragment对象传递给标签处理器类;经过上述步骤,标签的初始化完成,开始执行标签。第五步,执行页面中的自定义标签,实际上就是调用doTgt方法。标签执行完成!


1.控制jsp页面某一部分内容是否执行  

jsp页面:

<%@ page language="java" import="java.util.*" pageEncoding="UTF-8"%>
<%@ taglib uri="/simpletag" prefix="simpletag"%>

<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
<html>
  <head>
    
    <title>用简单标签控制是否执行标签体</title>
    
  </head>
  
  <body>
   	
   	<simpletag:demo1>
   		aaaaa
   	</simpletag:demo1>
   
   
  </body>
</html>

标签处理器类:

import java.io.IOException;
import javax.servlet.jsp.JspException;
import javax.servlet.jsp.tagext.JspFragment;
import javax.servlet.jsp.tagext.SimpleTagSupport;

//控制标签体是否执行
public class SimpleTagDemo1 extends SimpleTagSupport {

	@Override
	public void doTag() throws JspException, IOException {
		JspFragment jf = this.getJspBody();  //拿到标签体
		//jf.invoke(this.getJspContext().getOut());  //注释掉,代表什么都不做,不会有任何的输出
	}
	
}

2.控制标签体 重复执行

jsp页面:   

<%@ page language="java" import="java.util.*" pageEncoding="UTF-8"%>
<%@ taglib uri="/simpletag" prefix="simpletag"%>

<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
<html>
  <head>
    
    <title>控制标签体重复执行</title>
    
  </head>
  
  <body>
  	<simpletag:demo2>
    	This is my JSP page. <br>
    </simpletag:demo2>
  </body>
</html>


标签处理器类:

import java.io.IOException;

import javax.servlet.jsp.JspException;
import javax.servlet.jsp.tagext.JspFragment;
import javax.servlet.jsp.tagext.SimpleTagSupport;

public class SimpleTagDemo2 extends SimpleTagSupport {

	@Override
	public void doTag() throws JspException, IOException {
		
		JspFragment jf = this.getJspBody();
		for (int i=0; i<5; i++) {
			jf.invoke(null);  //默认写到浏览器。等价于jf.invoke(this.getJspContext().getOut())
		}
	}
}

3.修改标签体内容输出

jsp页面:

<%@ page language="java" import="java.util.*" pageEncoding="UTF-8"%>
<%@ taglib uri="/simpletag" prefix="simpletag"%>

<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
<html>
  <head>
    
    <title>修改标签体</title>
    
  </head>
  
  <body>
  	<simpletag:demo3>
    	This is my JSP page. <br>
    </simpletag:demo3>
  </body>
</html>

标签处理器类:

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 SimpleTagDemo3 extends SimpleTagSupport {

	@Override
	public void doTag() throws JspException, IOException {
		
		JspFragment jf = this.getJspBody();
		
		//建立一个缓冲区
		StringWriter sw = new StringWriter();
		
		//把标签体数据写入缓冲区
		jf.invoke(sw);
		
		String content = sw.toString();
		content = content.toUpperCase();
		
		this.getJspContext().getOut().write(content);
		
	}
}


4.控制标签余下的jsp页面是否执行  

jsp页面:

<%@ page language="java" import="java.util.*" pageEncoding="UTF-8"%>
<%@ taglib uri="/simpletag" prefix="simpletag"%>

<simpletag:demo4/>
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
<html>
  <head>
    
    <title>控制标签余下的JSP不执行</title>
    
  </head>
  
  <body>
    This is my JSP page. <br>
  </body>
</html>

标签处理器类:

import java.io.IOException;

import javax.servlet.jsp.JspException;
import javax.servlet.jsp.SkipPageException;
import javax.servlet.jsp.tagext.SimpleTagSupport;

//控制标签余下的JSP不执行
public class SimpleTagDemo4 extends SimpleTagSupport {

	@Override
	public void doTag() throws JspException, IOException {
		
		throw new SkipPageException();
		
	}
}


  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值