一.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; } @Override public 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; } @Override public 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 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-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; } @Override public 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 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-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>