通过上一篇博客《自定义JSP标签01》我们已经充分了解了自定义标签的步骤,所以在02篇我们就直接上代码:
1.foreach标签
自定义
foreach
标签能够在JSP页面中遍历集合并将集合中的元素逐个渲染到页面上,使用起来非常方便。
tld配置文件:
<?xml version="1.0" encoding="UTF-8" ?> <taglib xmlns="http://java.sun.com/xml/ns/j2ee" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://java.sun.com/xml/ns/j2ee http://java.sun.com/xml/ns/j2ee/web-jsptaglibrary_2_0.xsd" version="2.0"> <description>JSTL 1.1 core library</description> <display-name>JSTL core</display-name> <tlib-version>1.1</tlib-version> <short-name>z</short-name> <uri>http://www/Kissship/com</uri> <validator> <description> Provides core validation features for JSTL tags. </description> <validator-class> org.apache.taglibs.standard.tlv.JstlCoreTLV </validator-class> </validator> <tag> <name>foreach</name> <tag-class>com.Kissship.tag.ForeachTag</tag-class> <body-content>JSP</body-content> <attribute> <name>items</name> <required>true</required> <rtexprvalue>true</rtexprvalue> </attribute> <attribute> <name>var</name> <required>true</required> <rtexprvalue>false</rtexprvalue> </attribute> </tag> </taglib>
助手类:
package com.Kissship.tag; import java.util.ArrayList; import java.util.Iterator; import java.util.List; import javax.servlet.jsp.JspException; import javax.servlet.jsp.tagext.BodyTagSupport; public class ForeachTag extends BodyTagSupport{ //对象的指针,指向的是数据源中的哪一个对象 private String var; //数据源,用来遍历的 private List<Object> items = new ArrayList<Object>(); public String getVar() { return var; } public void setVar(String var) { this.var = var; } public List<Object> getItems() { return items; } public void setItems(List<Object> items) { this.items = items; } @Override public int doStartTag() throws JspException { if(items == null || items.size() == 0) return SKIP_BODY; Iterator<Object> it = items.iterator(); //取得数据源中的第一条数据 pageContext.setAttribute(var, it.next()); pageContext.setAttribute("it", it); return EVAL_BODY_INCLUDE; } @Override public int doAfterBody() throws JspException { Iterator<Object> it = (Iterator<Object>)pageContext.getAttribute("it"); if(it.hasNext()) { //取得数据源中的第二条,第三条数据乃至更多 pageContext.setAttribute(var, it.next()); pageContext.setAttribute("it", it); return EVAL_BODY_AGAIN; } return SKIP_BODY; } }
demo4:
<%@page import="com.Kissship.entity.Dept"%> <%@page import="java.util.ArrayList"%> <%@page import="java.util.List"%> <%@ page language="java" contentType="text/html; charset=UTF-8" pageEncoding="UTF-8"%> <%@ taglib uri="http://java.sun.com/jsp/jstl/core" prefix="c"%> <%@ taglib uri="http://www/Kissship/com" prefix="z" %> <!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> <% List<Dept> list = new ArrayList(); list.add(new Dept(1,"AK47野荷")); list.add(new Dept(2,"AWP永恒之枪")); list.add(new Dept(3,"格洛克18型伽马多普勒")); request.setAttribute("list", list); %> </head> <body> <p>c标签:</p> <c:forEach items="${list }" var="l"> ${l.id}:${l.name}<hr> </c:forEach> <hr> <p>自定义foreach标签:</p> <z:foreach items="${list }" var="l"> ${l.id}========${l.name}<hr> </z:foreach> </body> </html>
效果图如下:
2.Dept数据标签
自定义的dept标签可以方便地将部门数据渲染到JSP页面上。
tld文件:
<?xml version="1.0" encoding="UTF-8" ?> <taglib xmlns="http://java.sun.com/xml/ns/j2ee" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://java.sun.com/xml/ns/j2ee http://java.sun.com/xml/ns/j2ee/web-jsptaglibrary_2_0.xsd" version="2.0"> <description>JSTL 1.1 core library</description> <display-name>JSTL core</display-name> <tlib-version>1.1</tlib-version> <short-name>z</short-name> <uri>http://www/Kissship/com</uri> <validator> <description> Provides core validation features for JSTL tags. </description> <validator-class> org.apache.taglibs.standard.tlv.JstlCoreTLV </validator-class> </validator> <tag> <name>foreach</name> <tag-class>com.Kissship.tag.ForeachTag</tag-class> <body-content>JSP</body-content> <attribute> <name>items</name> <required>true</required> <rtexprvalue>true</rtexprvalue> </attribute> <attribute> <name>var</name> <required>true</required> <rtexprvalue>false</rtexprvalue> </attribute> </tag> <tag> <name>dept</name> <tag-class>com.Kissship.tag.DeptTag</tag-class> <body-content>JSP</body-content> <attribute> <name>var</name> <required>true</required> <rtexprvalue>false</rtexprvalue> </attribute> </tag> </taglib>
助手类:
package com.Kissship.tag; import java.util.ArrayList; import java.util.List; import javax.servlet.jsp.JspException; import javax.servlet.jsp.PageContext; import javax.servlet.jsp.tagext.BodyTagSupport; import com.Kissship.entity.Dept; public class DeptTag extends BodyTagSupport{ private String var;//存放数据的名称 public String getVar() { return var; } public void setVar(String var) { this.var = var; } @Override public int doStartTag() throws JspException { //模拟数据库访问的过程 List<Dept> list = new ArrayList(); list.add(new Dept(1,"AK47野荷")); list.add(new Dept(2,"AWP永恒之枪")); list.add(new Dept(3,"格洛克18型伽马多普勒")); //将数据放入var中 pageContext.setAttribute(var, list); return SKIP_BODY; } }
demo5:
<%@page import="com.Kissship.entity.Dept"%> <%@page import="java.util.ArrayList"%> <%@page import="java.util.List"%> <%@ page language="java" contentType="text/html; charset=UTF-8" pageEncoding="UTF-8"%> <%@ taglib uri="http://java.sun.com/jsp/jstl/core" prefix="c"%> <%@ taglib uri="http://www/Kissship/com" prefix="z" %> <!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> <% List<Dept> list = new ArrayList(); list.add(new Dept(1,"AK47野荷")); list.add(new Dept(2,"AWP永恒之枪")); list.add(new Dept(3,"格洛克18型伽马多普勒")); request.setAttribute("list", list); %> </head> <body> <p>c标签:</p> <c:forEach items="${list }" var="l"> ${l.id}:${l.name}<hr> </c:forEach> <hr> <p>自定义foreach标签:</p> <z:foreach items="${list }" var="l"> ${l.id}========${l.name}<hr> </z:foreach> <p>自定义Dept标签:数据标签</p> 作用:当某一些数据多个页面,或者多个地方频繁使用时,就可以做成数据标签,减少代码量。<hr> 商品模块部门使用数据(你是财务才能操作下面内容) <z:dept var="ds"></z:dept> ${ds }<hr> </body> </html>
效果图如下:
3.select标签
自定义
select
标签可以方便地在JSP页面中渲染下拉菜单,使用起来非常便捷。
tld配置文件:
<tag> <name>select</name> <tag-class>com.Kissship.tag.SelectTag</tag-class> <body-content>JSP</body-content> <attribute> <name>items</name> <required>true</required> <rtexprvalue>true</rtexprvalue> </attribute> <attribute> <name>optioVal</name> <required>true</required> <rtexprvalue>true</rtexprvalue> </attribute> <attribute> <name>optionText</name> <required>true</required> <rtexprvalue>true</rtexprvalue> </attribute> <attribute> <name>selectedVal</name> <required>false</required> <rtexprvalue>true</rtexprvalue> </attribute> </tag>
助手类:
package com.Kissship.tag; import java.util.ArrayList; import java.util.List; import javax.servlet.jsp.JspException; import javax.servlet.jsp.JspWriter; import javax.servlet.jsp.tagext.BodyTagSupport; public class SelectTag extends BodyTagSupport{ //下拉框的数据源 private List<Object> items = new ArrayList<Object>(); //下拉框option的value值 private String optioVal;//id //数据库中存储的数据,用于下拉框回显 private String selectedVal; public String getSelectedVal() { return selectedVal; } public void setSelectedVal(String selectedVal) { this.selectedVal = selectedVal; } //下拉框option的标签体内容 private String optionText;//name public List<Object> getItems() { return items; } public void setItems(List<Object> items) { this.items = items; } public String getOptioVal() { return optioVal; } public void setOptioVal(String optioVal) { this.optioVal = optioVal; } public String getOptionText() { return optionText; } public void setOptionText(String optionText) { this.optionText = optionText; } @Override public int doStartTag() throws JspException { //因为z:select标签没有标签体,页面又要输出下面内容 JspWriter out = pageContext.getOut(); try { out.print(toHTML()); } catch (Exception e) { e.printStackTrace(); } return super.doStartTag(); } private String toHTML() throws Exception{ StringBuffer sb = new StringBuffer("<select>"); for(Object object : items) { String val = getObjAttrValue(object,optioVal); String text = getObjAttrValue(object,optionText); sb.append("<option "+(val.equals(selectedVal) ? "selected" :"")+" value='"+val+"'>"+text+"</option>"); } sb.append("</select>"); return sb.toString(); } /** * 获取某个对象的某个属性值 * @param object --------dept * @param attr --------id/name * @return * @throws SecurityException * @throws NoSuchFieldException * @throws Exception * @throws IllegalArgumentException */ private String getObjAttrValue(Object object, String attr) throws Exception { Class c1 = object.getClass(); java.lang.reflect.Field f = c1.getDeclaredField(attr); f.setAccessible(true); return (String) f.get(object).toString(); } }
demo:
<%@page import="com.Kissship.entity.Dept"%> <%@page import="java.util.ArrayList"%> <%@page import="java.util.List"%> <%@ page language="java" contentType="text/html; charset=UTF-8" pageEncoding="UTF-8"%> <%@ taglib uri="http://java.sun.com/jsp/jstl/core" prefix="c"%> <%@ taglib uri="http://www/Kissship/com" prefix="z" %> <!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> <% List<Dept> list = new ArrayList(); list.add(new Dept(1,"AK47野荷")); list.add(new Dept(2,"AWP永恒之枪")); list.add(new Dept(3,"格洛克18型伽马多普勒")); request.setAttribute("list", list); %> </head> <body> <p>c标签:</p> <c:forEach items="${list }" var="l"> ${l.id}:${l.name}<hr> </c:forEach> <hr> <p>自定义foreach标签:</p> <z:foreach items="${list }" var="l"> ${l.id}========${l.name}<hr> </z:foreach> <p>自定义Dept标签:数据标签</p> 作用:当某一些数据多个页面,或者多个地方频繁使用时,就可以做成数据标签,减少代码量。<hr> 商品模块部门使用数据(你是财务才能操作下面内容) <z:dept var="ds"></z:dept> ${ds }<hr> <p>自定义select标签:</p> <z:select items="${list }" optioVal="id" optionText="name"></z:select> <z:select items="${list }" optioVal="id" optionText="name" selectedVal="2"></z:select> <z:select items="${list }" optioVal="id" optionText="name" selectedVal="3"></z:select> </body> </html>
效果图:
总结:自定义JSP标签是一种扩展JSP功能的方式,可以将复杂逻辑封装到标签中,使JSP页面更加简单易懂,易于维护。以下是自定义JSP标签的基本流程:
- 创建标签处理类(Tag Handler Class),该类实现javax.servlet.jsp.tagext.Tag接口或其子接口。
- 在标签处理类中定义标签属性(Tag Attribute),标签属性可以用来传递参数或配置标签处理类。
- 创建标签描述文件(Tag Library Descriptor,.tld文件),该文件中定义标签的名称、属性、处理类等信息。
- 将标签描述文件和标签处理类打包成JAR文件。
- 在JSP页面中引入标签库(Tag Library),引入方式可以用JSP页面中的<%@ taglib %>指令或者web.xml文件来实现。
- 在JSP页面中使用自定义标签,标签名称和属性根据标签描述文件定义的内容来设置。
自定义JSP标签的好处包括重用性、可维护性、可扩展性和更好的可读性等。自定义标签还可以结合现有的标准标签或其他自定义标签使用,实现更加强大的功能。
最后自定义JSP标签02就到这里,祝大家在敲代码的路上一路通畅!