黑马day07 自定义标签&简单标签

自定义标签的步骤:

1.写一个类实现SimpleTag接口或者继承SimpleTagSupport

2.写一个tld文件,描述写好的类

3.在jsp页面引入tld文件,就可以在jsp页面中使用自定义标签

执行原理:

当jsp在执行的过程中,每当遇到一个简单标签时都会创建一个处理类对象.

调用setJspContext传入当前jsp页面的PageContext对象.

如果当前标签有父标签则调用setParent方法将父标签传入,如果没有父标签则这个方法不会被调用.

如果该标签具有属性,调用属性的setXXX方法将属性的值传入

如果当前标签具有标签体,则会调用setJspBody将封装了标签体信息的JspFragment传入,如果没有标签体,这个方法不执行

最后调用doTag方法,在这个方法里我们可以书写处理标签事件的java代码

当自定义标签执行完成后,简单标签对象就销毁掉了.

案例1.概念性知识

SimpleDemo1类:

package cn.itheima.simpleTag;

import java.io.IOException;

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

public class SimpleDemo1 extends SimpleTagSupport {
	private int times;

	public void setTimes(int times) {
		this.times = times;
	}

	@Override
	public void doTag() throws JspException, IOException {
		//1.控制表前提的内容要不要执行
			//--控制标签体不执行,什么都不做标签体的内容就不会执行
			//--控制表前提执行,只要调用封装着标签体JSPFragment对象的invoke方法即可
			JspFragment fragment = getJspBody();
			fragment.invoke(getJspContext().getOut());
		//2.控制标签体之后的内容要不要执行
				//标签之后的内容执行,什么都不做,就会执行
				//标签之的内容不执行,抛出一个异常SkipPgageException
//				throw new SkipPageException();
		//3.控制标签体重复执行
				for(int i=0;i<times;i++){
					getJspBody().invoke(null);
				}
	}

}

如果要使用属性:则需要在类中的成员属性中定义,并需要set方法,然后再tld文件中配置。

配置文件:

name:要使用的标签的名字。

tag-class:定义的那个类。

body-content:JSP:简单标签中不能使用这个属性,因为不支持java代码

empty:标签体内容是空。

scriptless:标签体可以有内容

rtexprvalue

attribute:

name:类中定义的属性名(必须实现se方法)

required:是否为必须属性,true表示是必须属性。

rtexprvalue:是否支持EL表达式。true表示支持EL表达式。

type:类中定义的属性的类型。int,String,bolean...等

<tag>
 	<name>bodyInvoke</name>
 	<tag-class>cn.itheima.simpleTag.SimpleDemo1</tag-class>
 	<body-content>scriptless</body-content>
 	<attribute>
 		<name>times</name>
 		<required>true</required>
 		<rtexprvalue>true</rtexprvalue>
 		<type>int</type>
 	</attribute>
 </tag>

在jsp页面是导入tld文件.

<%@ page language="java" import="java.util.*" pageEncoding="UTF-8"%>
<%@ taglib uri="http://www.itheima.com/simples"  prefix="t"%>

<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
<html>
  <head>

    <title></title>

	<meta http-equiv=" pragma" content="no-cache">
	<meta http-equiv="cache-control" content="no-cache">
	<meta http-equiv="expires" content="0">    

  </head>

  <body>
    <t:bodyInvoke times="4">标签体的内容执行了</t:bodyInvoke>after
  </body>
</html>

运行结果:

案例2:模拟防盗链功能的标签:

1.定义的类:

package cn.itheima.simpleTag;

import java.io.IOException;

import javax.servlet.ServletResponse;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import javax.servlet.jsp.JspException;
import javax.servlet.jsp.PageContext;
import javax.servlet.jsp.tagext.SimpleTagSupport;

public class SimpleDemo3  extends SimpleTagSupport{
	@Override
	public void doTag() throws JspException, IOException {
		PageContext pc=(PageContext) getJspContext();
		String ref = pc.getRequest().getParameter("Referer");
		if("".endsWith(ref)||ref==null||!ref.startsWith("http://localhost")){
			HttpServletRequest request=(HttpServletRequest) pc.getRequest();
			HttpServletResponse response = (HttpServletResponse) pc.getResponse();
			response.sendRedirect(request.getContextPath()+"/index.jsp");
			return;
		}
	}

}

2.tld文件:

<tag>
 	<name>referer</name>
 	<tag-class>cn.itheima.simpleTag.SimpleDemo3</tag-class>
 	<body-content>empty</body-content>
 </tag>
时间: 2024-10-12 06:33:30

黑马day07 自定义标签&简单标签的相关文章

JSP自定义标签——简单标签(2)

在前一篇博客中,我们已经学习了自定义的简单标签的基本使用方法,这一篇我们来学习如何在简单标签中添加标签属性.对自定义标签添加一些属性,可以使我们的标签功能更加灵活和复用.例如前一篇博客使用简单标签来对标签体内容执行一定的次数,就无法在标签上规定要执行的次数,必须在标签处理器类中修改,很不方便,如果使用带属性的标签就能很好的解决这个问题. 要想使简单标签具有属性,通常需要满足以下两个步骤: ① 在标签处理器类中定义属性,同时为每个属性生成setter方法: ② 在TLD文件中对于的<tag>标签

javaEE(6)_自定义标签&amp;JSTL标签(JSP Standard Tag Library)

一.自定义标签简介 1.自定义标签主要用于移除Jsp页面中的java代码,jsp禁止出现一行java脚本. 2.使用自定义标签移除jsp页面中的java代码,只需要完成以下两个步骤: •编写一个实现Tag接口的Java类(标签处理器类). •编写标签库描述符(tld)文件,在tld文件中对标签处理器类进行描述. 3.快速入门:使用标签输出客户机IP //java类 public class ViewPortTag extends TagSupport{ @Override public int

自定义过滤器及标签

代码布局(自定义的代码,放在哪里)1. 某个app特有的 -app 目录下,templatetags 文件夹,包(包含__init__.py文件) -再到 templatetags 文件夹下创建python模块(py文件)2. 定义复用 -创建一个新的app,将他们定义在新的app中,在INSTALL_APPS 注册,然后就可以应用 1.自定义模板过滤器 -模板过滤器是什么 -函数,一般情况下有一个或两个参数 - 第一个参数,是传递进来的模板变量,不一定是字符串 - 第二个参数,普通的参数,也可

自定义标签库开发(简单标签开发)

实现Tag接口,BodyTag接口,IterationTag接口的标签开发技术一般称为传统标签开发技术. 实现SimpleTag接口的标签开发技术,一般称为简单标签开发技术. JSP2.0里新增了SimpleTag. 由于传统标签使用三个标签接口来完成不同的功能,显得过于繁琐,不利于标签技术的推广, SUN公司为降低标签技术的学习难度,在JSP 2.0中定义了一个更为简单.便于编写和调用的SimpleTag接口来实现标签的功能.实现SimpleTag接口的标签通常称为简单标签.简单标签共定义了5

JavaWeb_简单标签(自定义标签)HelloWorld

传统标签和简单标签 可发自定义标签,其核心就是编写处理器类,一个标签对应一个标签处理器类,而一个标签库则是很多标签处理器的集合.所有标签处理器类都要实现JspTag接口,该接口没有定义任何方法,主要作为Tag和SimpleTag接口的父接口. 在JSP2.0以前,所有标签处理器类都必须实现Tag接口,这样的标签称为传统标签. JSP2.0规范又定义了一种新的类型的标签,称为简单标签,其对应的处理器类要实现SimpleTag接口 自定义标签的开发与应用步骤 编写完成标签功能的Java类(标签处理器

[原创]java WEB学习笔记40:简单标签概述(背景,使用一个标签,标签库的API,SimpleTag接口,创建一个自定义的标签的步骤 和简单实践)

本博客为原创:综合 尚硅谷(http://www.atguigu.com)的系统教程(深表感谢)和 网络上的现有资源(博客,文档,图书等),资源的出处我会标明 本博客的目的:①总结自己的学习过程,相当于学习笔记 ②将自己的经验分享给大家,相互学习,互相交流,不可商用 内容难免出现问题,欢迎指正,交流,探讨,可以留言,也可以通过以下方式联系. 本人互联网技术爱好者,互联网技术发烧友 微博:伊直都在0221 QQ:951226918 ---------------------------------

javaweb学习总结(二十六)——jsp简单标签标签库开发(二)

一.JspFragment类介绍 javax.servlet.jsp.tagext.JspFragment类是在JSP2.0中定义的,它的实例对象代表JSP页面中的一段符合JSP语法规范的JSP片段,这段JSP片段中不能包含JSP脚本元素. WEB容器在处理简单标签的标签体时,会把标签体内容用一个JspFragment对象表示,并调用标签处理器对象的setJspBody方法把JspFragment对象传递给标签处理器对象.JspFragment类中只定义了两个方法,如下所示: getJspCon

JSP简单标签开发

一.继承自SimpleTag接口的自定义标签实现类称为简单标签,接口中5个方法 1.setJspContext方法 用于把JSP页面的PageContext对象传递给标签处理器对象 2.setParent方法 把父标签处理器对象传递给当前处理器对象 3.getParent方法 用于获取当前标签的父标签处理器对象 4.setJspBody方法 用于把代表标签体的JspFragment对象传递给标签处理器对象 5.doTag方法 用于完成所有标签逻辑,如输出.迭代.修改标签内容等.在方法中可以通过抛

简单标签

简单标签:实现SimpleTag接口的标签通常称为简单标签.简单标签共定义了5个方法:setJspContext方法setParent和getParent方法setJspBody方法doTag方法 setJspContext方法: 用于把JSP页面的pageContext对象传递给标签处理器对象 setParent方法: 用于把父标签处理器对象传递给当前标签处理器对象getParent方法: 用于获得当前标签的父标签处理器对象 setJspBody方法: 用于把代表标签体的JspFragment