JSP标签 01 完整详细

目录

一.JSP标签是什么??

二.JSP标签语言的特点

        2.1 标签的格式:

        2.2 标签的分类

三.自定义标签的开发

3.1 步骤

   1.编写助手

        2.编写.tld文件

 3.最后导入就OK了

四.标签的生命周期

五.if标签

案例

六.set和out标签

   Set

  out


一.JSP标签是什么??

JSP是Java Server Pages的缩写,是一种在服务器端使用Java语言编写的动态网页技术。通过JSP,可以在HTML文件中嵌入Java代码和标签,将动态生成的数据合并到HTML页面中,实现动态的内容展示和交互功能。

二.JSP标签语言的特点

        2.1 标签的格式

                <开始标签  属性="属性值"> 标签体 </结束标签>

                        例:<c:if test="true">true</c:if>

        2.2 标签的分类

    空标签:      br hr    
    控制标签:  if  foreach
    数据标签:  out    保存数据    
    UI标签 :    input,table  (没有标签体也可以输出内容的标签就是UI标签)

 点击c:if 跳转到 c.tld 界面  .tld文件是标签库的描述文件 而且必须放在WEB-INF 里面


三.自定义标签的开发

先来看看.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">
    
  <description>JSTL 1.1 core library</description>
  <display-name>JSTL core</display-name>
  <tlib-version>1.1</tlib-version>
  <short-name>y</short-name>
  <uri>http://yinzi</uri>

  <tag>
    <!-- 标签库标签的名字 -->
    <name>aa</name>
   <!--  对应的助手类 -->
    <tag-class>com.yinzi.jsp.DomeTag1</tag-class>
   <!--  代表JSP标签 -->
    <body-content>JSP</body-content>
    <!-- 属性 -->
      <attribute>
       <!--  属性名称 -->
       <name>var</name>
        <!-- 是否为必填项 -->
         <required>false</required> 
       <!--  是否支持EL表达式 -->
       <rtexprvalue>true</rtexprvalue> 
   </attribute>
   
  </tag>

   <tag>
    <!-- 标签库标签的名字 -->
    <name>if</name>
   <!--  对应的助手类 -->
    <tag-class>com.yinzi.jsp.IfTag</tag-class>
   <!--  代表JSP标签 -->
    <body-content>JSP</body-content>
    <!-- 属性 -->
      <attribute>
       <!--  属性名称 -->
       <name>test</name>
        <!-- 是否为必填项 -->
         <required>true</required> 
       <!--  是否支持EL表达式 -->
       <rtexprvalue>true</rtexprvalue> 
   </attribute>
   
   
   
  </tag>
  
  
  <tag>
    <!-- 标签库标签的名字 -->
    <name>set</name>
   <!--  对应的助手类 -->
    <tag-class>com.yinzi.jsp.SetTag</tag-class>
   <!--  代表JSP标签 -->
    <body-content>JSP</body-content>
    <!-- 属性 -->
      <attribute>
       <!--  属性名称 -->
       <name>var</name>
        <!-- 是否为必填项 -->
         <required>true</required> 
       <!--  是否支持EL表达式 -->
       <rtexprvalue>false</rtexprvalue> 
   </attribute>
   <attribute>
     <!--  属性名称 -->
       <name>value</name>
        <!-- 是否为必填项 -->
         <required>true</required> 
       <!--  是否支持EL表达式 -->
       <rtexprvalue>true</rtexprvalue> 
   </attribute>
  </tag>
  
  
  
  <tag>
    <!-- 标签库标签的名字 -->
    <name>out</name>
   <!--  对应的助手类 -->
    <tag-class>com.yinzi.jsp.OutTag</tag-class>
   <!--  代表JSP标签 -->
    <body-content>JSP</body-content>
    <!-- 属性 -->
      <attribute>
       <!--  属性名称 -->
       <name>value</name>
        <!-- 是否为必填项 -->
         <required>true</required> 
       <!--  是否支持EL表达式 -->
       <rtexprvalue>true</rtexprvalue> 
   </attribute>
   
  </tag>
</taglib>

 截取了一部分完整的,标注了其意思

3.1 步骤

   1.编写助手类

        可以看到第二个是助手类

助手类实现了JSP标签库中定义的标签,并提供了简单的API来处理标签的属性和输出

助手类将负责处理标签的输出。标签的具体实现可以在助手类中完成,也可以包含在独立的标签处理器类中。

package com.yinzi.jsp;

import java.io.IOException;

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

/**
 * 助手类(必须继承BodyTagSupport)
 * @author 86131
 *
 */
public class DomeTag1 extends BodyTagSupport{


	@Override
	public int doStartTag() throws JspException {

		System.out.println("调用了doStartTag方法");
		return EVAL_BODY_INCLUDE;
	}
	
	@Override
	public int doAfterBody() throws JspException {
		System.out.println("调用了doAfterBody方法");
		return super.doAfterBody();
	}
	
	@Override
	public int doEndTag() throws JspException {
		System.out.println("调用了doEndTag方法");
		return super.doEndTag();
	}
	
}

        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">
    
  <description>JSTL 1.1 core library</description>
  <display-name>JSTL core</display-name>
  <tlib-version>1.1</tlib-version>
  <short-name>y</short-name>
  <uri>http://yinzi</uri>

  <tag>
    <!-- 标签库标签的名字 -->
    <name>aa</name>
   <!--  对应的助手类 -->
    <tag-class>com.yinzi.jsp.DomeTag1</tag-class>
   <!--  代表JSP标签 -->
    <body-content>JSP</body-content>
    <!-- 属性 -->
      <attribute>
       <!--  属性名称 -->
       <name>var</name>
        <!-- 是否为必填项 -->
         <required>false</required> 
       <!--  是否支持EL表达式 -->
       <rtexprvalue>true</rtexprvalue> 
   </attribute>
   
  </tag>

   <tag>
    <!-- 标签库标签的名字 -->
    <name>if</name>
   <!--  对应的助手类 -->
    <tag-class>com.yinzi.jsp.IfTag</tag-class>
   <!--  代表JSP标签 -->
    <body-content>JSP</body-content>
    <!-- 属性 -->
      <attribute>
       <!--  属性名称 -->
       <name>test</name>
        <!-- 是否为必填项 -->
         <required>true</required> 
       <!--  是否支持EL表达式 -->
       <rtexprvalue>true</rtexprvalue> 
   </attribute>
   
   
   
  </tag>
  
  
  <tag>
    <!-- 标签库标签的名字 -->
    <name>set</name>
   <!--  对应的助手类 -->
    <tag-class>com.yinzi.jsp.SetTag</tag-class>
   <!--  代表JSP标签 -->
    <body-content>JSP</body-content>
    <!-- 属性 -->
      <attribute>
       <!--  属性名称 -->
       <name>var</name>
        <!-- 是否为必填项 -->
         <required>true</required> 
       <!--  是否支持EL表达式 -->
       <rtexprvalue>false</rtexprvalue> 
   </attribute>
   <attribute>
     <!--  属性名称 -->
       <name>value</name>
        <!-- 是否为必填项 -->
         <required>true</required> 
       <!--  是否支持EL表达式 -->
       <rtexprvalue>true</rtexprvalue> 
   </attribute>
  </tag>
  
  
  
  <tag>
    <!-- 标签库标签的名字 -->
    <name>out</name>
   <!--  对应的助手类 -->
    <tag-class>com.yinzi.jsp.OutTag</tag-class>
   <!--  代表JSP标签 -->
    <body-content>JSP</body-content>
    <!-- 属性 -->
      <attribute>
       <!--  属性名称 -->
       <name>value</name>
        <!-- 是否为必填项 -->
         <required>true</required> 
       <!--  是否支持EL表达式 -->
       <rtexprvalue>true</rtexprvalue> 
   </attribute>
   
  </tag>
</taglib>

 3.最后导入就OK了

 

 这个自己定义!!


四.标签的生命周期

 

 

     1.有标签体的情况下,默认调用doStartTag,doAfterBody,doEndTag方法
    2.如果将doStartTag返回值改为skip_body,则doAfterBody不会执行(路线1)
    3.如果将doStartTag返回值改为eval_body_include ,则doAfterBody会执行(路线2)
    4.如果将doAfterBody返回值改为EVAL_BODY_AGAIN,则会进入循环(路线3)

 

五.if标签

案例


  如果满足条件就输出标签体    返回值为eval_body_include
 否则返回值为skip_body
 需要获取一个是否满足条件的结果值,则会有一个属性为boolean类型

 

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;
	}

六.set和out标签

   Set

package com.yinzi.jsp;

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

/**
 * 数据标签(存储数据,存储在作用域中)以键值对的方式
 * @author 86131
 *
 */
public class SetTag extends BodyTagSupport{

	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 super.doStartTag();
	}
	
 <tag>
    <!-- 标签库标签的名字 -->
    <name>set</name>
   <!--  对应的助手类 -->
    <tag-class>com.yinzi.jsp.SetTag</tag-class>
   <!--  代表JSP标签 -->
    <body-content>JSP</body-content>
    <!-- 属性 -->
      <attribute>
       <!--  属性名称 -->
       <name>var</name>
        <!-- 是否为必填项 -->
         <required>true</required> 
       <!--  是否支持EL表达式 -->
       <rtexprvalue>false</rtexprvalue> 
   </attribute>
   <attribute>
     <!--  属性名称 -->
       <name>value</name>
        <!-- 是否为必填项 -->
         <required>true</required> 
       <!--  是否支持EL表达式 -->
       <rtexprvalue>true</rtexprvalue> 
   </attribute>
  </tag>

  out

package com.yinzi.jsp;

import java.io.IOException;

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

/**
 * UI类型
 * 输出
 * @author 86131
 *
 */
public class OutTag extends BodyTagSupport{
	
	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.print(value);
	} catch (IOException e) {
		// TODO Auto-generated catch block
		e.printStackTrace();
	}
	return super.doStartTag();
}
}
<tag>
    <!-- 标签库标签的名字 -->
    <name>out</name>
   <!--  对应的助手类 -->
    <tag-class>com.yinzi.jsp.OutTag</tag-class>
   <!--  代表JSP标签 -->
    <body-content>JSP</body-content>
    <!-- 属性 -->
      <attribute>
       <!--  属性名称 -->
       <name>value</name>
        <!-- 是否为必填项 -->
         <required>true</required> 
       <!--  是否支持EL表达式 -->
       <rtexprvalue>true</rtexprvalue> 
   </attribute>
   
  </tag>

 输出结果:

 

评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值