JSP自定义标签

自定义标签的作用

(1)自定义JSP标签技术是在JSP 1.1版本中才出现的,它支持用户在JSP文件中自定义标签,这样可以使JSP代码更加简洁。
(2)这些可重用的标签能处理复杂的逻辑运算和事务,或者定义JSP网页的输出内容和格式。

创建自定义标签的步骤

(1)创建标签的处理类
(2)创建标签库描述文件
(3)在JSP文件中引入标签库,然后插入标签,例如:<mm:hello/>

Servlet容器编译JSP网页时,如果遇到自定义标签,就会调用这个标签的处理类。

标签处理类必须扩展以下两个类之一:

–javax.servlet.jsp. tagext .TagSupport
–javax.servlet.jsp. tagext . BodyTagSupport

TagSupport的主要方法

•doStartTag:Servlet容器遇到自定义标签的起始标志时调用该方法
•doEndTag:Servlet容器遇到自定义标签的结束标志时调用该方法
•setValue(String k,Object o):在标签处理类中设置key/value
•getValue(String k):在标签处理类中根据参数key返回匹配的value
•removeValue(String k):在标签处理类中删除key/value
•setPageContext(PageContext pc):设置PageContext对象,该方法由Servlet容器在调用doStartTag或doEndTag方法前调用
•setParent(Tag t):设置嵌套了当前标签的上层标签的处理类,该方法由Servlet容器在调用doStartTag或doEndTag方法前调用
•getParent():返回嵌套了当前标签的上层标签的处理类

TabSupport类中的两个重要属性

•parent:代表嵌套了当前标签的上层标签的处理类
•pageContext:代表Web应用中的javax.servlet.jsp.PageContext对象

        JSP容器在调用doStartTag或doEndTag方法前,会先调用setPageContext和setParent方法,设置pageContext和parent。在doStartTag或doEndTag方法中可以通过getParent方法获取上层标签的处理类;在TagSupport类中定义了protected类型的pageContext成员变量,因此在标签处理类中可以直接访问pageContext变量。

PageContext类提供了保存和访问Web应用的共享数据的方法:

–public void setAttribute(String name, Object value, int scope)
–public Object getAttribute(String name, int scope)

其中,scope参数用来指定属性存在的范围,它的可选值包括:

–PageContext.PAGE_SCOPE
–PageContext.REQUEST_SCOPE
–PageContext.SESSION_SCOPE
–PageContext.APPLICATION_SCOPE

例如:pageContext.setAttribute(“username”,”zhangsan”, PageContext.SESSION_SCOPE);

doStartTag()方法

当Servlet容器遇到自定义标签的起始标志,就会调用doStartTag()方法。doStartTag()方法返回一个整数值,用来决定程序的后续流程。它有两个可选值:
–Tag.SKIP_BODY
–Tag.EVAL_BODY_INCLUDE
Tag.SKIP_BODY表示标签之间的内容被忽略。
Tag.EVAL_BODY_INCLUDE表示标签之间的内容被正常执行。例如对于以下代码:

<prefix: Mytag>
   Hello
   ……
   ……
</prefix:Mytag>
假若<Mytag>的doStartTag()方法返回Tag.SKIP_BODY,”Hello”字符串不会显示在网页上;若返回Tag.EVAL_BODY_INCLUDE,“Hello” 字符串将显示在网页上。
doEndTag()方法
当Servlet容器遇到自定义标签的结束标志,就会调用doEndTag()方法。
doEndTag()方法也返回一个整数值,用来决定程序后续流程。它有两个可选值:
–Tag.SKIP_PAGE
–Tag.EVAL_PAGE
Tag.SKIP_PAGE表示立刻停止执行JSP网页,网页上未处理的静态内容和JSP程序均被忽略,任何已有的输出内容立刻返回到客户的浏览器上。
Tag.EVAL_PAGE表示按正常的流程继续执行JSP网页。

用户自定义的标签属性

在标签中还能包含自定义的属性,例如:
<prefix:mytag username=“zhangsan">
……
……
</prefix:mytag>
在标签处理类中应该将这个属性作为成员变量,并且分别提供设置和读取属性的方法,假定以上username为String类型,可以定义如下方法:
private String username;
public void setUsername(String value){
    this.username=value;
}
public String getUsername(){
    return username;
}

示例1(简单)
步骤1:创建标签处理类
public class MyTag extends TagSupport
{
	@Override
	public int doStartTag() throws JspException
	{
		try
		{
			pageContext.getOut().print("startTag");
		}
		catch (IOException e)
		{
			e.printStackTrace();
		}
		return EVAL_BODY_INCLUDE;
	}

	@Override
	public int doEndTag() throws JspException
	{
		try
		{
			pageContext.getOut().print("endTag");
		}
		catch (IOException e)
		{
			e.printStackTrace();
		}
		return EVAL_PAGE;
	}
}
步骤2:创建标签库描述符文件,后缀名为.tld,保存在WEB-INF文件夹下。
<?xml version="1.0" encoding="UTF-8" standalone="no"?>
<taglib xmlns="http://java.sun.com/xml/ns/j2ee" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
	version="2.0"
	xsi:schemaLocation="http://java.sun.com/xml/ns/j2ee http://java.sun.com/xml/ns/j2ee/web-jsptaglibrary_2_0.xsd">
	<tlib-version>1</tlib-version>
	<short-name>m</short-name>
	<uri>/mytag</uri>
	<tag>
		<name>tag</name>
		<tag-class>com.kqygww.tag.MyTag</tag-class>
	</tag>
</taglib>
步骤3:在JSP页面中引入标签并插入标签
<%@ page language="java" pageEncoding="UTF-8"%>
<%@ taglib prefix="m" uri="/mytag"%>
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
<html>
<head>
</head>
<body>
	<m:tag>tag_Test </m:tag>
</body>
</html>

输出

startTag tag_Test endTag 

示例2(稍微复杂)

步骤1:创建标签处理类
public class MyTag extends TagSupport
{
	private String key;

	public String getKey()
	{
		return key;
	}

	public void setKey(String key)
	{
		this.key = key;
	}

	@Override
	public int doEndTag() throws JspException
	{
		Properties properties = (Properties) pageContext.getAttribute(
				"properties", PageContext.APPLICATION_SCOPE);
		String message = (String)properties.getProperty("test");
		try
		{
			pageContext.getOut().println(message);
		}
		catch (IOException e)
		{
			e.printStackTrace();
		}
		return EVAL_PAGE;
	}
}
此处要用到一个初始化时加载信息的servlet
public class LoadInfo extends HttpServlet
{
	@Override
	public void init(ServletConfig config) throws ServletException
	{
		Properties properties = new Properties();
		try
		{
			ServletContext context = config.getServletContext();
			InputStream is = context
					.getResourceAsStream("/WEB-INF/message.properties");
			properties.load(is);
			is.close();
			context.setAttribute("properties", properties);
		}
		catch (IOException e)
		{
			e.printStackTrace();
		}
	}
}
message.properties的内容是
test=HelloWorld
步骤2:创建标签库描述符文件,后缀名为.tld,保存在WEB-INF文件夹下。
<?xml version="1.0" encoding="UTF-8" standalone="no"?>
<taglib xmlns="http://java.sun.com/xml/ns/j2ee" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
	version="2.0"
	xsi:schemaLocation="http://java.sun.com/xml/ns/j2ee http://java.sun.com/xml/ns/j2ee/web-jsptaglibrary_2_0.xsd">
	<tlib-version>1</tlib-version>
	<short-name>m</short-name>
	<uri>/mytag</uri>
	<tag>
		<name>tag</name>
		<tag-class>com.kqygww.tag.MyTag</tag-class>
		<attribute>
			<name>key</name>
			<required>true</required>
		</attribute>
	</tag>
</taglib>
步骤3:在JSP页面中引入标签并插入标签
<%@ page language="java" pageEncoding="UTF-8"%>
<%@ taglib prefix="m" uri="/mytag"%>
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
<html>
<head>
</head>
<body>
	<m:tag key="test"></m:tag>
</body>
</html>
输出
Hello World





评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值