自定义JSP标签02

简介: 自定义JSP标签02

通过上一篇博客《自定义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标签的基本流程:

  1. 创建标签处理类(Tag Handler Class),该类实现javax.servlet.jsp.tagext.Tag接口或其子接口。
  2. 在标签处理类中定义标签属性(Tag Attribute),标签属性可以用来传递参数或配置标签处理类。
  3. 创建标签描述文件(Tag Library Descriptor,.tld文件),该文件中定义标签的名称、属性、处理类等信息。
  4. 将标签描述文件和标签处理类打包成JAR文件。
  5. 在JSP页面中引入标签库(Tag Library),引入方式可以用JSP页面中的<%@ taglib %>指令或者web.xml文件来实现。
  6. 在JSP页面中使用自定义标签,标签名称和属性根据标签描述文件定义的内容来设置。

自定义JSP标签的好处包括重用性、可维护性、可扩展性和更好的可读性等。自定义标签还可以结合现有的标准标签或其他自定义标签使用,实现更加强大的功能。


最后自定义JSP标签02就到这里,祝大家在敲代码的路上一路通畅!

感谢大家的观看 !

 

目录
相关文章
|
3月前
|
Java
jsp页面中使用jstl标签报错:javax.servlet.jsp.JspTagException
jsp页面中使用jstl标签报错:javax.servlet.jsp.JspTagException
15 0
|
5月前
|
Java
jsp标签下
jsp标签下
27 0
|
5月前
|
XML Java 数据格式
jsp标签上
jsp标签上
26 0
|
5月前
|
Java
JSP标签(2) -----自定义foreach ,select标签,全网最详细,最完整易懂
JSP标签(2) -----自定义foreach ,select标签,全网最详细,最完整易懂
|
5月前
|
Java API
JSP标签 01 完整详细
JSP标签 01 完整详细
|
5月前
|
Java
JAVA2EE-----jsp标签(02)
JAVA2EE-----jsp标签(02)
26 0
|
5月前
|
Java
JSP标签(01)
JSP标签(01)
29 0
|
5月前
|
Java 数据安全/隐私保护
Shiro - JSP页面标签应用
Shiro - JSP页面标签应用
29 0
|
6月前
|
XML Java 程序员
自定义JSP标签
自定义JSP标签
|
29天前
|
Java
学校教师管理系统【JSP+Servlet+JavaBean】(Java课设)
学校教师管理系统【JSP+Servlet+JavaBean】(Java课设)
21 1

相关课程

更多