目录
思维导图
标签生命周期图
1.jsp自定义标签之foreach
1、创建一个标签助手类(继承BodyTagSupport)。标签属性必须与助手类的属性对应、且要提供对应get/set方法
2、 创建标签库描述文件(tld),添加自定义标签的配置。注:tld文件必须保存到WEB-INF目录或其子目录
3、在JSP通过taglib指令导入标签库,并通过指定后缀访问自定义标签
创建ForeachTag —> 修改mytag.tld ->jsp界面应用
ForeachTag :
package com.zking.jspTag.tag;
import java.util.Iterator;
import java.util.List;
import javax.servlet.jsp.JspException;
import javax.servlet.jsp.tagext.BodyTagSupport;
/**
* 自定义标签Foreach
* @author zjjt
*
*/
public class ForeachTag extends BodyTagSupport {
//page -> request -> session -> application
//接受到外部集合,可以理解为即将要被遍历的集合对象
private List<Object> items;
//将数据保存到指定作用域中,并且var来命名
private String var;
public List<Object> getItems() {
return items;
}
public void setItems(List<Object> items) {
this.items = items;
}
public String getVar() {
return var;
}
public void setVar(String var) {
this.var = var;
}
@Override
public int doEndTag() throws JspException {
// TODO Auto-generated method stub
return EVAL_PAGE;
}
@Override
public int doStartTag() throws JspException {
// TODO Auto-generated method stub
if(null==items)
return SKIP_BODY;
else {
//获取迭代器HasName和next
Iterator<Object> it =items.iterator();
//获取集合中的第一个元素
Object val=it.next();
//将第一个元素保存到page作用域中,并以var属性来命名它
pageContext.setAttribute(var, val);
//将剩余的迭代器对象保存到page作用域
pageContext.setAttribute("it", it);
}
return EVAL_BODY_INCLUDE;
}
@Override
public int doAfterBody() throws JspException {
// TODO Auto-generated method stub
//从page作用域中提取出未遍历完的iterator迭代器对象
Iterator it=(Iterator) pageContext.getAttribute("it");
//判断迭代器中的下一个元素是否存在
if(it.hasNext()) {
//移动下标并取出元素
Object val= it.next();
//将第一个元素保存到page作用域中,并以var属性来命名它
pageContext.setAttribute(var, val);
//将剩余的迭代器对象保存到page作用域
pageContext.setAttribute("it", it);
return EVAL_BODY_AGAIN;
}
return SKIP_BODY;
}
}
2、jsp自定义标签之if
创建IfTag —> 修改mytag.tld ->jsp界面应用
IfTag :
package com.zking.jspTag.tag;
import javax.servlet.jsp.JspException;
import javax.servlet.jsp.tagext.BodyTagSupport;
/**
* 自定义标签if
* @author zjjt
*
*/
public class IfTag extends BodyTagSupport {
private boolean test;
public boolean isTest() {
return test;
}
public void setTest(boolean test) {
this.test = test;
}
@Override
public int doEndTag() throws JspException {
// TODO Auto-generated method stub
return EVAL_PAGE;
}
@Override
public int doStartTag() throws JspException {
// TODO Auto-generated method stub
if(test)
return EVAL_BODY_INCLUDE;
else
return SKIP_BODY;
}
}
3、jsp自定义标签之set和out
创建OutTag、SetTag—> 修改mytag.tld ->jsp界面应用
OutTag:
package com.zking.jspTag.tag;
import java.io.IOException;
import javax.servlet.jsp.JspException;
import javax.servlet.jsp.JspWriter;
import javax.servlet.jsp.tagext.BodyTagSupport;
/**
* 自定义标签out
* @author zjjt
*
*/
public class OutTag extends BodyTagSupport {
private Object value;
public Object getValue() {
return value;
}
public void setValue(Object value) {
this.value = value;
}
@Override
public int doEndTag() throws JspException {
// TODO Auto-generated method stub
return EVAL_PAGE;
}
@Override
public int doStartTag() throws JspException {
// TODO Auto-generated method stub
JspWriter out = pageContext.getOut();
try {
out.print(value);
} catch (IOException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
return SKIP_BODY;
}
}
SetTag:
package com.zking.jspTag.tag;
import javax.servlet.ServletContext;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpSession;
import javax.servlet.jsp.JspException;
import javax.servlet.jsp.tagext.BodyTagSupport;
/**
* 自定义标签Set
* @author zjjt
*
*/
public class SetTag extends BodyTagSupport {
//存储的数据
private Object value;
//将数据存储在作用域并以var命名
private String var;
//将数据保存到那个作用域 page/requst/session/application
private String scope="page";
public Object getValue() {
return value;
}
public void setValue(Object value) {
this.value = value;
}
public String getVar() {
return var;
}
public void setVar(String var) {
this.var = var;
}
public String getScope() {
return scope;
}
public void setScope(String scope) {
this.scope = scope;
}
@Override
public int doEndTag() throws JspException {
// TODO Auto-generated method stub
return EVAL_PAGE;
}
@Override
public int doStartTag() throws JspException {
//request
HttpServletRequest request=(HttpServletRequest) pageContext.getRequest();
//session
HttpSession session = request.getSession();
//application
ServletContext application = pageContext.getServletContext();
if(scope.equals("request")) {
request.setAttribute(var, value);
}else if(scope.equals("session")){
session.setAttribute(var, value);
}else if(scope.equals("application")){
application.setAttribute(var, value);
}else {
pageContext.setAttribute(var, value);
}
return SKIP_BODY;
}
}
4、jsp自定义标签之dept数据标签
创建DeptTag—> 修改mytag.tld ->jsp界面应用
5、jsp自定义标签之select标签(通用)
创建SelsctTag—> 修改mytag.tld ->jsp界面应用
DeptTag、SelsctTag因为和上面所创建的Tag大部分相同,所以就省了,有兴趣的可以自己尝试
的写一下,下面是完整的mytag.tld文件和index.jsp文件以及所有功能的一个效果展示图
mytag.tld:
<!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>z</short-name>
<!-- 你标签库的引用uri -->
<uri>/zking</uri>
<tag>
<!-- 标签名 -->
<name>text</name>
<!-- 标签工具类 -->
<tag-class>com.zking.jspTag.tag.TestTag</tag-class>
<!-- 标签的内容类型:empty表示空标签,jsp表示可以为任何合法的JSP元素 -->
<body-content>jsp</body-content>
<!-- 自定义标签的属性定义,请注意一定要在标签类中提供对应的get/set方法 -->
<attribute>
<!-- 自定义标签的属性名称 -->
<name>name</name>
<!-- true表示必填 -->
<required>true</required>
<!-- true支持动态值,可以向值里面填jsp表达式、EL表达式,false则不支持 -->
<rtexprvalue>true</rtexprvalue>
</attribute>
</tag>
<!-- foreach -->
<tag>
<!-- 标签名 -->
<name>forEach</name>
<!-- 标签工具类 -->
<tag-class>com.zking.jspTag.tag.ForeachTag</tag-class>
<!-- 标签的内容类型:empty表示空标签,jsp表示可以为任何合法的JSP元素 -->
<body-content>jsp</body-content>
<!-- 自定义标签的属性定义,请注意一定要在标签类中提供对应的get/set方法 -->
<attribute>
<!-- 自定义标签的属性名称 -->
<name>items</name>
<!-- true表示必填 -->
<required>true</required>
<!-- true支持动态值,可以向值里面填jsp表达式、EL表达式,false则不支持 -->
<rtexprvalue>true</rtexprvalue>
</attribute>
<attribute>
<!-- 自定义标签的属性名称 -->
<name>var</name>
<!-- true表示必填 -->
<required>true</required>
<!-- true支持动态值,可以向值里面填jsp表达式、EL表达式,false则不支持 -->
<rtexprvalue>false</rtexprvalue>
</attribute>
</tag>
<!-- if -->
<tag>
<!-- 标签名 -->
<name>if</name>
<!-- 标签工具类 -->
<tag-class>com.zking.jspTag.tag.IfTag</tag-class>
<!-- 标签的内容类型:empty表示空标签,jsp表示可以为任何合法的JSP元素 -->
<body-content>jsp</body-content>
<!-- 自定义标签的属性定义,请注意一定要在标签类中提供对应的get/set方法 -->
<attribute>
<!-- 自定义标签的属性名称 -->
<name>test</name>
<!-- true表示必填 -->
<required>true</required>
<!-- true支持动态值,可以向值里面填jsp表达式、EL表达式,false则不支持 -->
<rtexprvalue>true</rtexprvalue>
</attribute>
</tag>
<!-- set -->
<tag>
<!-- 标签名 -->
<name>set</name>
<!-- 标签工具类 -->
<tag-class>com.zking.jspTag.tag.SetTag</tag-class>
<!-- 标签的内容类型:empty表示空标签,jsp表示可以为任何合法的JSP元素 -->
<body-content>empty</body-content>
<!-- 自定义标签的属性定义,请注意一定要在标签类中提供对应的get/set方法 -->
<attribute>
<!-- 自定义标签的属性名称 -->
<name>scope</name>
<!-- true表示必填 -->
<required>false</required>
<!-- true支持动态值,可以向值里面填jsp表达式、EL表达式,false则不支持 -->
<rtexprvalue>false</rtexprvalue>
</attribute>
<attribute>
<!-- 自定义标签的属性名称 -->
<name>value</name>
<!-- true表示必填 -->
<required>true</required>
<!-- true支持动态值,可以向值里面填jsp表达式、EL表达式,false则不支持 -->
<rtexprvalue>true</rtexprvalue>
</attribute>
<attribute>
<!-- 自定义标签的属性名称 -->
<name>var</name>
<!-- true表示必填 -->
<required>true</required>
<!-- true支持动态值,可以向值里面填jsp表达式、EL表达式,false则不支持 -->
<rtexprvalue>false</rtexprvalue>
</attribute>
</tag>
<!-- out -->
<tag>
<!-- 标签名 -->
<name>out</name>
<!-- 标签工具类 -->
<tag-class>com.zking.jspTag.tag.OutTag</tag-class>
<!-- 标签的内容类型:empty表示空标签,jsp表示可以为任何合法的JSP元素 -->
<body-content>empty</body-content>
<!-- 自定义标签的属性定义,请注意一定要在标签类中提供对应的get/set方法 -->
<attribute>
<!-- 自定义标签的属性名称 -->
<name>value</name>
<!-- true表示必填 -->
<required>true</required>
<!-- true支持动态值,可以向值里面填jsp表达式、EL表达式,false则不支持 -->
<rtexprvalue>true</rtexprvalue>
</attribute>
</tag>
<!-- data -->
<tag>
<!-- 标签名 -->
<name>data</name>
<!-- 标签工具类 -->
<tag-class>com.zking.jspTag.tag.DeptTag</tag-class>
<!-- 标签的内容类型:empty表示空标签,jsp表示可以为任何合法的JSP元素 -->
<body-content>empty</body-content>
<!-- 自定义标签的属性定义,请注意一定要在标签类中提供对应的get/set方法 -->
<attribute>
<!-- 自定义标签的属性名称 -->
<name>var</name>
<!-- true表示必填 -->
<required>true</required>
<!-- true支持动态值,可以向值里面填jsp表达式、EL表达式,false则不支持 -->
<rtexprvalue>false</rtexprvalue>
</attribute>
</tag>
<!-- select -->
<tag>
<!-- 标签名 -->
<name>select</name>
<!-- 标签工具类 -->
<tag-class>com.zking.jspTag.tag.SelsctTag</tag-class>
<!-- 标签的内容类型:empty表示空标签,jsp表示可以为任何合法的JSP元素 -->
<body-content>empty</body-content>
<!-- 自定义标签的属性定义,请注意一定要在标签类中提供对应的get/set方法 -->
<attribute>
<!-- 自定义标签的属性名称 -->
<name>items</name>
<!-- true表示必填 -->
<required>true</required>
<!-- true支持动态值,可以向值里面填jsp表达式、EL表达式,false则不支持 -->
<rtexprvalue>true</rtexprvalue>
</attribute>
<attribute>
<!-- 自定义标签的属性名称 -->
<name>optionText</name>
<!-- true表示必填 -->
<required>true</required>
<!-- true支持动态值,可以向值里面填jsp表达式、EL表达式,false则不支持 -->
<rtexprvalue>false</rtexprvalue>
</attribute>
<attribute>
<!-- 自定义标签的属性名称 -->
<name>optionValue</name>
<!-- true表示必填 -->
<required>true</required>
<!-- true支持动态值,可以向值里面填jsp表达式、EL表达式,false则不支持 -->
<rtexprvalue>false</rtexprvalue>
</attribute>
</tag>
</taglib>
index.jsp:
<%@page import="java.util.Arrays"%>
<%@page import="java.util.List"%>
<%@ page language="java" contentType="text/html; charset=UTF-8"
pageEncoding="UTF-8"%>
<%@ taglib prefix="z" uri="/zking" %>
<%@ taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core"%>
<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title>Insert title here</title>
</head>
<body>
<%
List<String> lst=Arrays.asList(new String[]{"zs","ls","ww"});
request.setAttribute("lst", lst);
request.setAttribute("sex", "boy");
%>
<c:forEach items="${lst}" var="s">
${s }
</c:forEach>
<c:if test="${sex eq 'boy' }">
哈哈哈
</c:if>
<h2>1.自定义text标签</h2>
<z:text name="xxxxx">hsad</z:text>
13232<br>
132<br>
1<br>
13<br>
<h2>2.jsp自定义标签之foreach</h2>
<z:forEach items="${lst }" var="s">
${s }
</z:forEach>
<h2>3.jsp自定义标签之if</h2>
<z:if test="${sex eq 'boy' }">
是的,他是纯爷们
</z:if>
<z:if test="${sex eq 'boy是' }">
是的,他是纯爷们是是是
</z:if>
<h2>4.jsp自定义标签之set和out</h2>
<z:set var="ww" value="rwerere"/>
<z:out value="${ww }"/>
<h2>5.jsp自定义标签之dept数据标签</h2>
<z:data var="date"/>
${date }
${role }
<h2>6.jsp自定义标签之select标签(通用)</h2>
<z:select items="${date }" optionValue="id" optionText="name"/>
<z:select items="${role }" optionValue="RoleId" optionText="rolename"/>
</body>
</html>
效果展示
总结
本章内容是在上一章的基础上进行解决的,整体内容基本上没有什么新的知识点,只是一些思维的应用而已。希望对大家有所帮助