jsp标签

看一个学习目标

jsp标签

jsp标签 

 

一、标签语言的特点

标签是由三个部分组成的:开始标签,标签体,结束标签

其次是标签的分类

①    空标签: 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>

上一篇:pycharm 2021.2.1专业版破解


下一篇:最终总结 python中 list 到底是怎么实现的,内存里面是怎么存放的