jsp自定义标签

前言

我们学习jsp自定义标签之前,首先要知道什么是标签,标签有哪些特点
1.什么是自定义标签
自定义标签是用户定义的JSP语言元素。当包含自定义标签的JSP页面转换为servlet时,这个标签就转换为一个名为tag handler的对象上的操作。之后当JSP页面的servlet执行时,Web容器就调用这些操作。
2.标签的特点组成
<开始标签 属性=“属性值”>标签体</结束标签>
还有一种标签就是空标签,空标签没有标签体没有结束标签。列如:
< br/>< hr/>
<开始标签/>

为什么要学自定义标签

相信大家都用过c标签吧(jstl标签库),那么为什么有c标签了还要学自定义标签呢?举个例子,假如需要修改学生信息,我们可以同过传值给界面单选按钮是否选中

		<c:if test="${student.ssex=='男' }">
		性别:<input type="radio" name="sex" checked  value="男"/><input type="radio" name="sex"  value="女"/><br/>
		</c:if>
		<c:if test="${student.ssex=='女' }">
		性别:<input type="radio" name="sex"   value="男"/><input type="radio" name="sex" checked value="女"/><br/>
		</c:if>

但如果是爱好每个学生的爱好不同,做修改回填相对会比较麻烦,所以我们掌握自定义标签开发出适合自己项目的标签,可以减少多余代码

使用自定义标签步骤

1,先建一个.tld文件在WEB-INF目录下

 <tag>
    <name>out</name>//标签名
    <tag-class>com.liuchunming.OutTag</tag-class>//助手类
    <body-content>JSP</body-content>
    <attribute>
        <name>value</name>//属性名
        <required>true</required>//是否必填
        <rtexprvalue>true</rtexprvalue>//是否支持表达式
    </attribute> 
  </tag>

2,我们在jsp标签使用标签库时,写一行代码引用标签库

<%@taglib prefix="l" uri="/liuchunming" %>

uri是引用地址,prefix是定义的名字,鼠标移入uriCtrl+点击就可以进入到tld中查看
在这里插入图片描述

3,每一个标签都必须有一个对于的助手类,继承BodyTagSupport

package com.liuchunming;

import java.io.IOException;

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

public class OutTag extends BodyTagSupport{
	private static final long serialVersionUID = 1L;
	private Object value;

	public Object getValue() {
		return value;
	}

	public void setValue(Object value) {
		this.value = value;
	}
	
	@Override
	public int doStartTag() throws JspException {
		JspWriter out = pageContext.getOut();
		try {
			out.println(value);
		} catch (IOException e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
		}
		return SKIP_BODY;
	}
}

属性需要对应标签里的属性值用于赋值取值(get/set)

自定义标签生命周期图

在这里插入图片描述
图中我们可以看出有三个方法体,doStarTag对应了两个返回值,doAfterBody()也要两个,doEndTag也是两个。下面解释一下这些返回值的作用

SKIP_BODY跳过主体
EVAL_BODY_INCLUDE计算主体内容并输出
EVAL_PAGE计算后续内容
SKIP_PAGE跳过后续内容
EVAL_BODY_AGAIN再次计算主体

自定义标签简单案例

set标签

 <tag>
    <name>set</name>//标签名
    <tag-class>com.liuchunming.SetTag</tag-class>//助手类完整类名
    <body-content>JSP</body-content>
    <attribute>
        <name>var</name>//属性名
        <required>true</required>//是必填
        <rtexprvalue>false</rtexprvalue>//不支持表达式
    </attribute> 
    <attribute>
        <name>value</name>
        <required>true</required>
        <rtexprvalue>true</rtexprvalue>
    </attribute> 
  </tag>

set助手类

package com.liuchunming;

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

public class SetTag extends BodyTagSupport{
	private static final long serialVersionUID = 1L;
	private String var;
	private Object value;
	public String getVar() {
		return var;
	}
	public void setVar(String var) {
		this.var = var;
	}
	public Object getValue() {
		return value;
	}
	public void setValue(Object value) {
		this.value = value;
	}
	@Override
	public int doStartTag() throws JspException {
		pageContext.setAttribute(var, value);
		return SKIP_BODY;
	}
	
}

out标签

<tag>
    <name>out</name>
    <tag-class>com.liuchunming.OutTag</tag-class>
    <body-content>JSP</body-content>
    <attribute>
        <name>value</name>
        <required>true</required>
        <rtexprvalue>true</rtexprvalue>
    </attribute> 
  </tag>

out助手类

package com.liuchunming;

import java.io.IOException;

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

public class OutTag extends BodyTagSupport{
	private static final long serialVersionUID = 1L;
	private Object value;

	public Object getValue() {
		return value;
	}

	public void setValue(Object value) {
		this.value = value;
	}
	
	@Override
	public int doStartTag() throws JspException {
		JspWriter out = pageContext.getOut();
		try {
			out.println(value);
		} catch (IOException e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
		}
		return SKIP_BODY;
	}
}

jsp界面
在这里插入图片描述
效果
在这里插入图片描述
if标签

<tag>
    <name>if</name>
    <tag-class>com.liuchunming.IFTag</tag-class>
    <body-content>JSP</body-content>
    <attribute>
        <name>test</name>
        <required>true</required>
        <rtexprvalue>true</rtexprvalue>
    </attribute>  
  </tag>

if助手类

package com.liuchunming;

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

public class IFTag extends BodyTagSupport{
	private boolean test;

	public boolean isTest() {
		return test;
	}

	public void setTest(boolean test) {
		this.test = test;
	}
	
	@Override
	public int doStartTag() throws JspException {
		
		return test?EVAL_BODY_INCLUDE:SKIP_BODY;
	}
}

jsp页面
在这里插入图片描述
效果图
在这里插入图片描述

总结

今天的分享就到这里,如果有什么不对的地方欢迎大家提出来改进。

  • 3
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值