目录
一.foreach标签
编写助手类
编写tld
测试数据辅助类
在页面上使用标签
二.select
编写助手类
编写tld
在页面上使用标签
一.foreach标签
-
编写助手类
public class ForeachTag extends BodyTagSupport {//存放数据源private List<?> items;//每次循环获取的对象放入pageContext中,并以var属性的值为key进行保存//示例: 页面上标签var属性指定为item,则每次循环取出的对象(obj)将执行如下://pageContext.setAttribute("item", obj); //页面中可以使用EL表达式取出对象中的属性, 如: ${item.name}private String var;public List<?> getItems() {return items;}public void setItems(List<?> items) {this.items = items;}public String getVar() {return var;}public void setVar(String var) {this.var = var;}@Overridepublic int doStartTag() {if(Objects.isNull(this.items) || this.items.size() == 0) {return SKIP_BODY;}Iterator<?> iterator = this.items.iterator();Object obj = iterator.next();this.pageContext.setAttribute(var, obj);this.pageContext.setAttribute("iterator", iterator);return EVAL_BODY_INCLUDE;}@Overridepublic int doAfterBody() {Iterator<?> it = (Iterator<?>)this.pageContext.getAttribute("iterator");if(it.hasNext()) {this.pageContext.setAttribute(var, it.next());return EVAL_BODY_AGAIN;}return SKIP_BODY;}}
-
编写tld
<!DOCTYPE taglibPUBLIC "-//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-version>1.2</jsp-version><short-name>Simple Tags</short-name><uri>/zking</uri>
<tag><!-- 标签名 --><name>foreach</name><!-- 标签助手类 --><tag-class>com.zking.tagdemo.tag.ForeachTag</tag-class><!-- 标签的内容类型:empty表示空标签,jsp表示可以为任何合法的JSP元素 --><body-content>jsp</body-content><attribute><!-- 属性名, OutTag类中的val属性相匹配 --><name>items</name><!-- 表示该属性为必要的属性 --><required>true</required><!-- 该属性可以接受EL表示式的值 --><rtexprvalue>true</rtexprvalue><!-- 标签描述,用于说明标签的作用 --><description>out标签test属性,用于输出test的值</description></attribute><attribute><!-- 属性名, OutTag类中的val属性相匹配 --><name>var</name><!-- 表示该属性为必要的属性 --><required>true</required><!-- 该属性可以接受EL表示式的值 --><rtexprvalue>true</rtexprvalue><!-- 标签描述,用于说明标签的作用 --><description>out标签test属性,用于输出test的值</description></attribute></tag>
-
测试数据辅助类
public class Book {private int id;private String name;public int getId() {return id;}public void setId(int id) {this.id = id;}public String getName() {return name;}public void setName(String name) {this.name = name;}}
public class TestData {public static List<Book> getBooks() {List<Book> books = new ArrayList<>();Book b1 = new Book();b1.setId(1);b1.setName("水浒传");Book b2 = new Book();b2.setId(2);b2.setName("红楼梦");Book b3 = new Book();b3.setId(3);b3.setName("西游记");books.add(b1);books.add(b2);books.add(b3);return books;}}
-
在页面上使用标签
<%@page import="com.zking.mvc.test.*,java.util.List" %>
<%@ page language="java" contentType="text/html; charset=utf-8"pageEncoding="utf-8"%>
<%@taglib prefix="z" uri="/zking" %>
<!DOCTYPE html">
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=ISO-8859-1">
<title>Insert title here</title>
</head>
<body><h1><%=System.currentTimeMillis()%></h1><z:hello/><!-- out --><z:out val="adb"/><%request.setAttribute("name", null);%><z:out val="${name}" defaultVal="test"/><p><!-- if --><z:if test="${100 == 100}">测试if(100 == 100)</z:if><z:if test="${100 == 1}">测试if(100 == 1)</z:if><p><!-- foreach --><%//获取测试数据List<Book> books = TestData.getBooks();//放入request对象中request.setAttribute("books", books);%><z:foreach items="${books}" var="book"><p>${book.id } - ${book.name }</p></z:foreach></body>
</html>
二.select
编写助手类
package com.zking.tagdemo.tag;import java.util.Map;import javax.servlet.jsp.JspException;
import javax.servlet.jsp.JspWriter;
import javax.servlet.jsp.tagext.BodyTagSupport;public class SelectTag extends BodyTagSupport{private String name;private Map<String, String> options;private String selectedValue;public String getName() {return name;}public void setName(String name) {this.name = name;}public Map<String, String> getOptions() {return options;}public void setOptions(Map<String, String> options) {this.options = options;}public String getSelectedValue() {return selectedValue;}public void setSelectedValue(String selectedValue) {this.selectedValue = selectedValue;}@Overridepublic int doStartTag() throws JspException {JspWriter out = this.pageContext.getOut();try {out.print("<select name=\""+name+"\">");for (String key : options.keySet()) {if(key.equals(selectedValue)) {out.print(" <option value=\""+key+"\" selected>"+options.get(key)+"</option>");}else {out.print(" <option value=\""+key+"\" >"+options.get(key)+"</option>");}}out.print("</select>");} catch (Exception e) {e.printStackTrace();}return SKIP_BODY;}}
编写tld
<!DOCTYPE taglibPUBLIC "-//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-version>1.2</jsp-version><short-name>Simple Tags</short-name><uri>/zking</uri>
<tag><!-- 标签名 --><name>selectTag</name><!-- 标签助手类 --><tag-class>com.zking.tagdemo.tag.SelectTag</tag-class><!-- 标签的内容类型:empty表示空标签,jsp表示可以为任何合法的JSP元素 --><body-content>empty</body-content><attribute><!-- 属性名, OutTag类中的val属性相匹配 --><name>name</name><!-- 表示该属性为必要的属性 --><required>true</required><!-- 该属性可以接受EL表示式的值 --><rtexprvalue>true</rtexprvalue><!-- 标签描述,用于说明标签的作用 --><description>out标签test属性,用于输出test的值</description></attribute><attribute><!-- 属性名, OutTag类中的val属性相匹配 --><name>options</name><!-- 表示该属性为必要的属性 --><required>true</required><!-- 该属性可以接受EL表示式的值 --><rtexprvalue>true</rtexprvalue><!-- 标签描述,用于说明标签的作用 --><description>out标签test属性,用于输出test的值</description></attribute><attribute><!-- 属性名, OutTag类中的val属性相匹配 --><name>selectedValue</name><!-- 表示该属性为必要的属性 --><required>false</required><!-- 该属性可以接受EL表示式的值 --><rtexprvalue>true</rtexprvalue><!-- 标签描述,用于说明标签的作用 --><description>out标签test属性,用于输出test的值</description></attribute></tag>
在页面上使用标签
<%@page import="java.util.HashMap"%>
<%@page import="java.util.Map"%>
<%@page import="java.util.List"%>
<%@page import="com.zking.tagdemo.tag.Book"%>
<%@page import="com.zking.tagdemo.tag.BookTest"%>
<%@ page language="java" contentType="text/html; charset=UTF-8"pageEncoding="UTF-8"%>
<%@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>
<body>sname}-${book.tid}</p></z:foreach><!-- 模拟数据 --><%request.setAttribute("name", "瑶姐");Map<String,String> map = new HashMap<>();map.put("1", "宝宝");map.put("2", "辉辉");map.put("3", "杰少");request.setAttribute("options", map);%><select name="type"><option value="1">药药</option> <option value="2">理论</option> <option value="3" selected="selected">付费</option> </select><z:selectTag name="selectName" options="${options}" selectedValue="3"/></body>
</html>