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()结束.
每个方法有二个生命周期。
- 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;
}
}
今天的分享就到此结束,各位看官可以在下面评论出自己的看法,大家一起提升,谢谢各位!!!