看一个学习目标
一、标签语言的特点
标签是由三个部分组成的:开始标签,标签体,结束标签
其次是标签的分类
① 空标签: br、hr
② ui标签:input、table
③ 控制标签:if、foreach
④ 数据标签:set标签、out标签
<%@ page language="java" contentType="text/html; charset=UTF-8"
pageEncoding="UTF-8"%>
<%@ taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core"%>
<%@taglib prefix="l" uri="http://jsp.veryedu.cn"%>
<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
<title>Insert title here</title>
</head>
<body>
<l:if test=""></l:if>
<!-- 标签的构成:开始标签,标签体,结束标签 -->
<a>标签语言的特点</a>
空标签
<!-- 有没有内容 -->
<br>
<hr>
UI标签
<table>
<tr></tr>
</table>
<input>
控制标签
<c:if test="true">输出</c:if>
<c:if test="false">不输出</c:if>
<c:if test="false"></c:if>
数据标签
<c:set var="name" value="zs"></c:set>
<c:out value="${name }"></c:out>
</body>
</html>
二、自定义标签的开发及步骤
继承BodyTagSupport类------>打开标签库描述文件(tld)------>J输入taglib指令导入标签库
<?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>lsy 1.1 core library</description>
<display-name>lsy core</display-name>
<tlib-version>1.1</tlib-version>
<short-name>lsy</short-name>
<uri>http://jsp.veryedu.cn</uri>
<validator>
<description>
Provides core validation features for JSTL tags.
</description>
<validator-class>
org.apache.taglibs.standard.tlv.JstlCoreTLV
</validator-class>
</validator>
<tag>
<name>demo1</name>
<tag-class>com.lsy.tag.Demo1</tag-class>
<body-content>JSP</body-content>
</tag>
<tag>
<name>demo2</name>
<tag-class>com.lsy.tag.Demo2</tag-class>
<body-content>JSP</body-content>
</tag>
<tag>
<name>demo3</name>
<tag-class>com.lsy.tag.Demo3</tag-class>
<body-content>JSP</body-content>
</tag>
<tag>
<name>if</name>
<tag-class>com.lsy.tag.IfTag</tag-class>
<body-content>JSP</body-content>
<attribute>
<!-- 自定义标签的成员变量名称 -->
<name>test</name>
<!-- 该成员变量是否必传 -->
<required>false</required>
<!-- 是否支持el表达式 -->
<rtexprvalue>false</rtexprvalue>
</attribute>
</tag>
<tag>
<name>set</name>
<tag-class>com.lsy.tag.SetTag</tag-class>
<body-content>JSP</body-content>
<attribute>
<!-- 自定义标签的成员变量名称 -->
<name>var</name>
<!-- 该成员变量是否必传 -->
<required>true</required>
<!-- 是否支持el表达式 -->
<rtexprvalue>false</rtexprvalue>
</attribute>
<attribute>
<name>value</name>
<required>true</required>
<rtexprvalue>true</rtexprvalue>
</attribute>
</tag>
<tag>
<name>out</name>
<tag-class>com.lsy.tag.OutTag</tag-class>
<body-content>JSP</body-content>
<attribute>
<!-- 自定义标签的成员变量名称 -->
<name>var</name>
<!-- 该成员变量是否必传 -->
<required>true</required>
<!-- 是否支持el表达式 -->
<rtexprvalue>true</rtexprvalue>
</attribute>
</tag>
<tag>
<name>forEach</name>
<tag-class>com.lsy.tag.ForeachTag</tag-class>
<body-content>JSP</body-content>
<attribute>
<!-- 自定义标签的成员变量名称 -->
<name>var</name>
<!-- 该成员变量是否必传 -->
<required>true</required>
<!-- 是否支持el表达式 -->
<rtexprvalue>false</rtexprvalue>
</attribute>
<attribute>
<name>items</name>
<required>true</required>
<rtexprvalue>true</rtexprvalue>
</attribute>
</tag>
</taglib>
1、标签开发的三条路线
①、doStartTag——SKIP_BODY——doEndTag
②、doStartTag——EVAL_BODY_INCLUDE——doAfterBody——EVAL_PAGE——doEndTag
③、doStartTag——EVAL_BODY_INCLUDE——doAfterBody——EVAL_BODY_AGAIN(N次)——doEndTag
2、五种返回值
①、SKIP_BODY
②、EVAL_BODY_INCLUDE
③、EVAL_BODY_AGAIN
④、EVAL_PAGE
⑤、SKIP_PAGE
第一条论证
package com.lsy.tag;
import javax.servlet.jsp.JspException;
import javax.servlet.jsp.tagext.BodyTagSupport;
/**
* 三种路线
* 1.doStartTag--->skipBody----->doEndBody
* 2.doStartTag--->EVAL_BODY_INCLUDE----->doAfterBody----->EVAL_PAGE----->doEndTag
* 3.doStartTag--->EVAL_BODY_INCLUDE----->doAfterBody----->EVAL_BODY_AGAIN----->doAfterBody
*
*
* 6个例子
* 第一个例子,论证这三条路线的执行顺序(Demo1.java,Demo2.java,Demo3.java)
* 预测结果:在jsp页面中通过l:demo1使用自定义标签,后台打印语句一下语句,那么说明
* 第一条的正确性
* @author zjjt
*
*/
public class Demo1 extends BodyTagSupport{
@Override
public int doStartTag() throws JspException {
System.out.println("Demo1_doStartTag进来了");
// return super.doStartTag();
return SKIP_BODY;
}
@Override
public int doEndTag() throws JspException {
System.out.println("Demo1_doEndTag进来了");
return super.doEndTag();
}
}
第二条论证
package com.lsy.tag;
import javax.servlet.jsp.JspException;
import javax.servlet.jsp.tagext.BodyTagSupport;
/**
* 三种路线
* 1.doStartTag--->skipBody----->doEndBody
* 2.doStartTag--->EVAL_BODY_INCLUDE----->doAfterBody----->EVAL_PAGE----->doEndTag
* 3.doStartTag--->EVAL_BODY_INCLUDE----->doAfterBody----->EVAL_BODY_AGAIN----->doAfterBody
*
*
* 6个例子
* 第一个例子,论证这三条路线的执行顺序(Demo1.java,Demo2.java,Demo3.java)
*
* @author zjjt
*
*/
public class Demo2 extends BodyTagSupport{
@Override
public int doStartTag() throws JspException {
System.out.println("Demo2_doStartTag进来了");
// return super.doStartTag();
return EVAL_BODY_INCLUDE;
}
@Override
public int doAfterBody() throws JspException {
System.out.println("Demo2_doAfterBody进来了");
return super.doAfterBody();
}
@Override
public int doEndTag() throws JspException {
System.out.println("Demo2_doEndTag进来了");
return super.doEndTag();
}
}
第三条论证
package com.lsy.tag;
import javax.servlet.jsp.JspException;
import javax.servlet.jsp.tagext.BodyTagSupport;
/**
* 三种路线
* 1.doStartTag--->skipBody----->doEndBody
* 2.doStartTag--->EVAL_BODY_INCLUDE----->doAfterBody----->EVAL_PAGE----->doEndTag
* 3.doStartTag--->EVAL_BODY_INCLUDE----->doAfterBody----->EVAL_BODY_AGAIN----->doAfterBody
*
*
* 6个例子
* 第一个例子,论证这三条路线的执行顺序(Demo1.java,Demo2.java,Demo3.java)
* 预测结果,doAfterBody会被反复执行
* @author zjjt
*
*/
public class Demo3 extends BodyTagSupport{
@Override
public int doStartTag() throws JspException {
System.out.println("Demo3_doStartTag进来了");
// return super.doStartTag();
return EVAL_BODY_INCLUDE;
}
@Override
public int doAfterBody() throws JspException {
System.out.println("Demo3_doAfterBody进来了");
return EVAL_BODY_AGAIN;
}
@Override
public int doEndTag() throws JspException {
System.out.println("Demo3_doEndTag进来了");
return super.doEndTag();
}
}
四 相关标签(自制)
<%@page import="com.lsy.tag.User"%>
<%@page import="java.util.ArrayList"%>
<%@page import="java.util.List"%>
<%@ page language="java" contentType="text/html; charset=UTF-8"
pageEncoding="UTF-8"%>
<%@taglib prefix="l" uri="http://jsp.veryedu.cn"%>
<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
<title>Insert title here</title>
</head>
<body>
<l:demo1>随便来根烟</l:demo1>
<l:demo2>demo2</l:demo2>
<l:demo3>demo3</l:demo3>
<l:set var="" value=""></l:set>
<l:out var=""></l:out>
<l:if></l:if>
<%
List users=new ArrayList<>();
users.add(new User("u001","zs"));
users.add(new User("u002","ls"));
users.add(new User("u003","ww"));
users.add(new User("u004","zl"));
request.setAttribute("users", users);
%>
<l:forEach items="${users }" var="user"></l:forEach>
</body>
</html>
里面传入了user类进行测试
user类
package com.lsy.tag;
public class User {
private String id;
private String name;
public String getId() {
return id;
}
public void setId(String id) {
this.id = id;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
@Override
public String toString() {
return "User [id=" + id + ", name=" + name + "]";
}
public User(String id, String name) {
super();
this.id = id;
this.name = name;
}
public User() {
// TODO Auto-generated constructor stub
}
}
tld文件
<tag>
<name>if</name>
<tag-class>com.lsy.tag.IfTag</tag-class>
<body-content>JSP</body-content>
<attribute>
<!-- 自定义标签的成员变量名称 -->
<name>test</name>
<!-- 该成员变量是否必传 -->
<required>false</required>
<!-- 是否支持el表达式 -->
<rtexprvalue>false</rtexprvalue>
</attribute>
</tag>
下面还有别的,就不分开了,整合在一起了
这个是l:set标签
<tag>
<name>set</name>
<tag-class>com.lsy.tag.SetTag</tag-class>
<body-content>JSP</body-content>
<attribute>
<!-- 自定义标签的成员变量名称 -->
<name>var</name>
<!-- 该成员变量是否必传 -->
<required>true</required>
<!-- 是否支持el表达式 -->
<rtexprvalue>false</rtexprvalue>
</attribute>
<attribute>
<name>value</name>
<required>true</required>
<rtexprvalue>true</rtexprvalue>
</attribute>
</tag>
这个是l:out标签
<tag>
<name>out</name>
<tag-class>com.lsy.tag.OutTag</tag-class>
<body-content>JSP</body-content>
<attribute>
<!-- 自定义标签的成员变量名称 -->
<name>var</name>
<!-- 该成员变量是否必传 -->
<required>true</required>
<!-- 是否支持el表达式 -->
<rtexprvalue>true</rtexprvalue>
</attribute>
</tag>
这个是l:forEach标签
<tag>
<name>forEach</name>
<tag-class>com.lsy.tag.ForeachTag</tag-class>
<body-content>JSP</body-content>
<attribute>
<!-- 自定义标签的成员变量名称 -->
<name>var</name>
<!-- 该成员变量是否必传 -->
<required>true</required>
<!-- 是否支持el表达式 -->
<rtexprvalue>false</rtexprvalue>
</attribute>
<attribute>
<name>items</name>
<required>true</required>
<rtexprvalue>true</rtexprvalue>
</attribute>
</tag>