jsp标签运用

jsp标签运用与了解

1.标签语言的特点
由<开始标签> 标签体 </结束标签>三大部分组成
当然还有特殊的标签 如:空标签
2.自定义标签的开发与使用步骤
首先创建一个标签助手类(继承BodyTagSupport)
标签属性必须与助手类的属性对应、且要提供对应get/set方法

.tld标签文件
放在WEB-INF目录下或其子目录下

<!DOCTYPE taglib
  PUBLIC "-//Sun Microsystems, Inc.//DTD JSP Tag Library 1.2//EN"
   "http://java.sun.com/dtd/web-jsptaglibrary_1_2.dtd">
<!-- 标签库描述符 -->
<taglib xmlns="http://java.sun.com/JSP/TagLibraryDescriptor">
	<!-- 标签库的版本 -->
	<tlib-version>1.0</tlib-version>
	<!-- JSP版本 -->
	<jsp-version>1.2</jsp-version>
	<!-- 自定义标签简称-->
	<short-name>Simple Tags</short-name>
	<!-- 自定义标签引用名 -->
	<uri>/zking</uri>
	<!-- If 标签 -->
	<tag>
	  <name>if</name>//标签的名字
	  <tag-class>com.tag.IfTag</tag-class>//属性类的全限定名
	  <body-content>jsp</body-content>//标签的类型empty代表空标签jsp是正常标签。
	  <attribute>//标签的属性
	   <name>n</name>属性名
	   <required>true</required>//是否必写
	   <rtexprvalue>false</rtexprvalue>//是否支持EL表达式等
	  </attribute>
	</tag>
	
    <!-- foreach -->
    <tag>
    <name>forEach</name>
    <tag-class>com.tag.forEachTag</tag-class>
    <body-content>jsp</body-content>
    <attribute>
       <name>vai</name>
       <required>true</required>
       <rtexprvalue>false</rtexprvalue>
    </attribute>
    <attribute>
    <name>items</name>
    <required>true</required>
    <rtexprvalue>true</rtexprvalue>
    </attribute>
    </tag>

</taglib>

页面显示:

<%@page import="java.util.ArrayList"%>
<%@page import="java.util.List"%>
<%@ page language="java" contentType="text/html; charset=UTF-8"
    pageEncoding="UTF-8"%>
    //引入自定义的标签.tld
   <%@ taglib prefix="z" uri="/zking"%>
<!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>
<%
//为测试forEach遍历定义的集合
   List<String> list=new ArrayList<String>();
    for(int i=0;i<10;i++){
    	list.add(i+"");
    }
    //将集合装入会话中
    session.setAttribute("list",list);
%>
<body>
  //定义的 if 标签
    <z:if n="false">我是if标签</z:if>
       行数
       //定义的forEach遍历
    <z:forEach vai="i" items="${list}">
      ${i}
    </z:forEach>
   
</body>
</html>

3.定义标签的属性类
自定义标签的生命周期:
SKIP_BODY:跳过主体
EVAL_BODY_INCLUDE:计算标签主体内容并[输出]
EVAL_PAGE:计算页面的后续部分
SKIP_PAGE:跳过页面的后续部分
EVAL_BODY_AGAIN:再计算主体一次
标签的属性类继承的BodyTagSupport 有三个重写方法:
doStartTag()开始,doAfterBody()内容,doEndTag()结束.
每个方法有二个生命周期。

  1. doStartTag()开始有SKIP_BODY:跳过主体和 EVAL_BODY_INCLUDE:计算标签主体内容并[输出]
    2.doAfterBody()内容有 SKIP_BODY:跳过主体和EVAL_BODY_AGAIN:再计算主体一次
    3.doEndTag()结束有 EVAL_PAGE:计算页面的后续部分和
    SKIP_PAGE:跳过页面的后续部分

在这里插入图片描述

package com.tag;

import java.io.IOException;

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

public class IfTag extends BodyTagSupport{
	private String n="fales";//定义index页面的属性并给予默认值
	

	public String getN() {
		return n;
	}

	public void setN(String n) {
		this.n = n;
	}
 
	@Override
	public int doStartTag() throws JspException {
		JspWriter out = pageContext.getOut();//页面的写入方法
		
		if (n.equals("true")) {//判断n属性的值
			try {
				out.write(n);
			} catch (IOException e) {
				// TODO Auto-generated catch block
				e.printStackTrace();
			}
			return EVAL_BODY_INCLUDE;
		}else {
			return SKIP_BODY;
		}
		
	}
	
	@Override
	public int doAfterBody() throws JspException {
		return SKIP_BODY;
	}
	
	@Override
	public int doEndTag() throws JspException {
		return EVAL_PAGE;
	}
	
}

forEach标签的属性类

import java.util.Iterator;
import java.util.List;

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

public class forEachTag extends BodyTagSupport{

	private String vai;
	private List items;
	
	public String getVai() {
		return vai;
	}

	public void setVai(String vai) {
		this.vai = vai;
	}

	public List getItems() {
		return items;
	}

	public void setItems(List items) {
		this.items = items;
	}

	@Override
	public int doStartTag() throws JspException {
	//首先用迭代器遍历它的第一次值。
		if (null!=items) {//
			Iterator i = items.iterator();
			if (i.hasNext()) {//判断集合的里面的下一个值是否存在。
			  pageContext.setAttribute(vai, i.next());//将查出来的一个值放入var中。
			  pageContext.setAttribute("it",i);//将剩下的值放入会话中
			}
			return EVAL_BODY_INCLUDE;
		}else {
			return SKIP_BODY;
		}
		
	}
	
	@Override
	public int doAfterBody() throws JspException {
		Iterator tor =(Iterator) pageContext.getAttribute("it");//迭代器迭代会话中的值
		if (tor.hasNext()) {//判断是否有值
			pageContext.setAttribute(vai, tor.next());//将遍历的值放入vai中。
			pageContext.setAttribute("it",tor);//将剩余的值放入会话中通过EVAL_BODY_AGAIN的循环机制来不断遍历集合中的值,直到值为空。
			return EVAL_BODY_AGAIN;	
		}else {
			return SKIP_BODY;
		}
	}
	
	@Override
	public int doEndTag() throws JspException {
		return EVAL_PAGE;
	}
	
}

今天的分享就到此结束,各位看官可以在下面评论出自己的看法,大家一起提升,谢谢各位!!!

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值