J2EE之自定义标签库的使用02

简介: J2EE之自定义标签库的使用02

J2EE之自定义标签的使用02

前言

前面我们学习了一些jsp自定义标签的一些基础知识,有out标签、if标签、set标签,今天我们来继续学习有关jsp自定义标签的知识,让我们根据思维导图一起来看看吧。

1. 自定义yx:foreach标签

1.1 创建yx:foreach标签的助手类

ForeachTag助手类
package com.YX.JSP.Tag;
import java.util.Iterator;
import java.util.List;
import javax.servlet.jsp.JspException;
import javax.servlet.jsp.tagext.BodyTagSupport;
/***
 * 自定义foreach标签的标签助手类
 * 格式分析:<yx:foreach items="${}" var = "c"> 分析属性 items: list<Object>(类型) var :
 * String(类型)
 *
 * 分析线路: 第二条:Eval_body_include 第三条:eval_body_again
 * 
 * @author 君易--鑨
 *
 */
public class ForeachTag extends BodyTagSupport {
  // 定义标签里面的两个属性
  private List<Object> items;// 存储数据的数据源
  private String var;// 指针指向集合对象中的一个对象数据
  // 获取两个属性的set和get方法
  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;
  }
  // 编写doStarTag()方法
  @Override
  public int doStartTag() throws JspException {
    if (items==null || items.size()==0) //数据源为空
      return SKIP_BODY;//跳过主体
    // 获取到集合对象的迭代器
    Iterator<Object> it = items.iterator();
    // 通过pageContext.setAttribute的方法将集合中的每一个对象数据存储到对象数据容器中
    pageContext.setAttribute(var, it.next());
    // 为保留迭代器时针先有的位置,将Iterator对象利用setAttribute保存起来,方便后面调用
    pageContext.setAttribute("it", it);
    return EVAL_BODY_INCLUDE;
  }
  // 编写doAfter()方法
  @Override
  public int doAfterBody() throws JspException {
    // 获取之前保存的迭代器对象
    Iterator<Object> it = (Iterator<Object>) pageContext.getAttribute("it");// 强转
    if (it.hasNext()) {// 判断it迭代器中中是否有下一个数值;有
      // 将迭代器中的下一个对象数值存储到对象容器中
      pageContext.setAttribute(var, it.next());
      // 再次保存迭代器时针原有的位置,方便下次再次调用
      pageContext.setAttribute("it", it);
      // 返回EVAL_BODY_AGAIN再次计算主体
      return EVAL_BODY_AGAIN;
    } else {// 迭代器后面没有下一个数据了
      return SKIP_BODY;// 继续往下执行
    }
  }
}

1.2 在后缀名为.tld的文件中添加自定义foreach标签(for)

<!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>/YX</uri>
  <!--添加标签 -->
  <tag>
    <!-- 设置标签名 -->
    <name>for</name>
    <!-- 绑定标签助手类 -->
    <tag-class>com.YX.JSP.Tag.ForeachTag</tag-class>
    <!--设置标签内容信息类型 -->
    <body-content>JSP</body-content>
    <!--添加属性 -->
    <attribute>
      <!-- 设置属性名(与助手类定义的要一致 ) -->
      <name>var</name>
      <!-- 设置是否为必要属性 -->
      <required>true</required>
      <!-- 设置是否接受El表达式 -->
      <rtexprvalue>false</rtexprvalue>
      <description>是对象数据用于输出页面</description>
    </attribute>
         <!--添加属性 -->
    <attribute>
      <!-- 设置属性名(与助手类定义的要一致 ) -->
      <name>items</name>
      <!-- 设置是否为必要属性 -->
      <required>true</required>
      <!-- 设置是否接受El表达式 -->
      <rtexprvalue>true</rtexprvalue>
      <description>是集合数据对象用于将数据带到页面上</description>
    </attribute>
  </tag>
</taglib>

1.3 定义一个实体类用于创建数据实现效果

Student实体类
package com.YX.JSP.entity;
/**
 * 实体对象:学生
 * 属性:sid,sname,ssex,sage
 * 
 * @author 君易--鑨
 *
 */
public class Student {
//  封装属性
   private int sid;//学号
   private String sname;//姓名
   private String ssex;//性别
   private int sage;//年龄
/**
 * 无参构造
 */
public Student() {
  // TODO Auto-generated constructor stub
}
//   获取属性的get和set方法
public int getSid() {
  return sid;
}
public void setSid(int sid) {
  this.sid = sid;
}
public String getSname() {
  return sname;
}
public void setSname(String sname) {
  this.sname = sname;
}
public String getSsex() {
  return ssex;
}
public void setSsex(String ssex) {
  this.ssex = ssex;
}
public int getSage() {
  return sage;
}
public void setSage(int sage) {
  this.sage = sage;
}
/**
 * 全参构造
 * @param sid
 * @param sname
 * @param ssex
 * @param sage
 */
public Student(int sid, String sname, String ssex, int sage) {
  super();
  this.sid = sid;
  this.sname = sname;
  this.ssex = ssex;
  this.sage = sage;
}
@Override
public String toString() {
  return "Student [sid=" + sid + ", sname=" + sname + ", ssex=" + ssex + ", sage=" + sage + "]";
}
}

1.5 在jsp中引入自定义标签并使用

<%@page import="java.util.ArrayList"%>
<%@page import="com.YX.JSP.entity.Student"%>
<%@page import="java.util.List"%>
<%@ page language="java" contentType="text/html; charset=UTF-8"
  pageEncoding="UTF-8"%>
  <!-- 导入自定义的yx标签 -->
  <%@ taglib uri="/YX" prefix="yx" %>
<!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>
  <!--嵌套java代码存储要输出的数据  -->
  <%
//实例化一个list集合对象
  List<Student> list=new ArrayList<Student>();
//向集合中添加数据方便后续遍历显示到页面
   list.add(new Student(1,"君易","男",18));
   list.add(new Student(2,"木易","男",19));
   list.add(new Student(3,"君易--鑨","男",20));
   list.add(new Student(4,"木易鑫","男",22));
//利用request对象将list集合传输到页面上
   request.setAttribute("list", list);
%>
<p>自定义yx:foreach标签实现结果</p>
<yx:for items="${list }" var="yx">
  <!--数据遍历  -->
<p>编号:${yx.sid },姓名:${yx.sname },性别:${yx.ssex },年龄:${yx.sage }</p>
</yx:for>
</body>
</html>

页面输出的结果

1.6 注意事项:

  • 在jsp中记得导入自己写的自定义标签

2. 数据标签

2.1 概念:

JSP(JavaServer Pages)中,数据标签通常被称为JSP标签库(JSP tag library)或JSTL标签(JSTL tag),是一种使用XML与Java编写的模板标记语言,用于简化JSP页面的开发。

2.2 作用:

当某一些数据在多个页面或者多个地方被频繁的使用时,就可以制作成数据标签用于减少代码量,提高开发效率。

2.3 使用:

2.3.1 创建一个数据标签助手类
YxTag助手类
package com.YX.JSP.Tag;
import java.util.ArrayList;
import java.util.List;
import javax.servlet.jsp.JspException;
import javax.servlet.jsp.tagext.BodyTagSupport;
import com.YX.JSP.entity.Student;
public class YxTag extends BodyTagSupport {
//      定义一个存放数据的名称
  private String var;
//  获取var的set和get标签
  public String getVar() {
    return var;
  }
  public void setVar(String var) {
    this.var = var;
  }
//  编写doStartTag()方法
  @Override
    public int doStartTag() throws JspException {
//     模拟访问获取数据库里的数据
    //实例化一个list集合对象
      List<Student> list=new ArrayList<Student>();
    //向集合中添加数据方便后续遍历显示到页面
       list.add(new Student(1,"君易","男",18));
       list.add(new Student(2,"木易","男",19));
       list.add(new Student(3,"君易--鑨","男",20));
       list.add(new Student(4,"木易鑫","男",22));
//       利用pageContext将数据库里的数据放入var中存储起来
       pageContext.setAttribute(var, list);
      return SKIP_BODY;
    }
}
2.3.2 在.tld文件中添加数据标签
lly标签
<!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>/YX</uri>
  <!--添加数据标签 -->
  <tag>
    <!-- 设置标签名 -->
    <name>lly</name>
    <!--绑定助手类 -->
    <tag-class>com.YX.JSP.Tag.YxTag</tag-class>
    <!--标签信息内容类型 -->
    <body-content>JSP</body-content>
    <!--添加属性 -->
    <attribute>
      <!-- 设置属性名 -->
      <name>var</name>
      <!-- 是否为必要属性 -->
      <required>true</required>
      <!-- 是否遵循el表达式 -->
      <rtexprvalue>false</rtexprvalue>
      <description>该标签是数据标签</description>
    </attribute>
  </tag>
</taglib>
2.3.3 在jsp中运用数据标签:
<%@page import="java.util.ArrayList"%>
<%@page import="com.YX.JSP.entity.Student"%>
<%@page import="java.util.List"%>
<%@ page language="java" contentType="text/html; charset=UTF-8"
  pageEncoding="UTF-8"%>
  <!-- 导入自定义的yx标签 -->
  <%@ taglib uri="/YX" prefix="yx" %>
<!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>
<p>自定义yx:lly数据标签实现结果</p>
<yx:lly var="yx"></yx:lly>
老师所管理的学生:${yx }
</body>
</html>

页面输出的结果

3. select自定义标签

3.1 新建一个标签助手类(SelectTag)

package com.YX.JSP.Tag;
import java.lang.reflect.Field;
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 optionVal;
//  option标签的文本内容
  private String optionText;
//  数据库中存储的数据回显到页面上,用下拉框绑定对应的选项
  private String selectedVal;
//  获取对应属性的set和get方法
  public List<Object> getItems() {
    return items;
  }
  public void setItems(List<Object> items) {
    this.items = items;
  }
  public String getOptionVal() {
    return optionVal;
  }
  public void setOptionVal(String optionVal) {
    this.optionVal = optionVal;
  }
  public String getOptionText() {
    return optionText;
  }
  public void setOptionText(String optionText) {
    this.optionText = optionText;
  }
  public String getSelectedVal() {
    return selectedVal;
  }
  public void setSelectedVal(String selectedVal) {
    this.selectedVal = selectedVal;
  }
//  编写doStart方法
  @Override
    public int doStartTag() throws JspException {
//    由于yx:select标签没有标签体,页面又要输出下拉框的内容,所以要获取jsp流对象输出
    JspWriter out = pageContext.getOut();
      try {
//        输出到页面上
      out.print(toJSp());
    } catch (Exception e) {
      // TODO Auto-generated catch block
      e.printStackTrace();
    }
      return super.doStartTag();
    }
  /**
   * 拼接的方法
   * @return
   * @throws SecurityException 
   * @throws NoSuchFieldException 
   * @throws Exception 
   */
  private String toJSp() throws Exception {
    StringBuffer sb=new StringBuffer("<select>");
//    中间的选项利用for循环遍历items
    for (Object object : items) {
//      获取某个对象的某个属性值
      String val=getObjAttrValue(object,optionVal);//id
      String text=getObjAttrValue(object,optionText);//name
//      拼接选项
      sb.append("<option "+(val.equals(selectedVal)? "selected" :"")+" value='"+val+"'>"+text+"</option>"); 
      }
//    拼接select结束标签
    sb.append("</select>");
    return sb.toString();
  }
  /**
   * 获取某个对象的某个属性值
   * @param object   
   * @param attr   id/name
   * @return
   * @throws SecurityException 
   * @throws NoSuchFieldException 
   * @throws IllegalAccessException 
   * @throws IllegalArgumentException 
   */
  private String getObjAttrValue(Object object, String attr) throws Exception{
//获取类类
    Class c = object.getClass();
//    根据所传的值获取对应的属性
    Field f = c.getDeclaredField(attr);
//    获取私有化的访问权限
    f.setAccessible(true);
//    返回对应属性的值
    return f.get(object).toString();
  }
}

3.2 在.tld文件中添加select标签

<!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>/YX</uri>
  <!-- 添加select标签 -->
  <tag>
    <!-- 设置标签名 -->
    <name>select</name>
    <!-- 绑定标签熟手类 -->
    <tag-class>com.YX.JSP.Tag.SelectTag</tag-class>
    <!--设置标签内容信息类型 -->
    <body-content>JSP</body-content>
    <!--添加属性 -->
    <attribute>
      <!-- 设置属性名 -->
      <name>items</name>
      <!-- 是否为必要属性 -->
      <required>true</required>
      <!-- 是否遵循el表达式 -->
      <rtexprvalue>true</rtexprvalue>
      <!-- 标签说明 -->
      <description>该标签是数据标签</description>
    </attribute>
    <!--添加属性 -->
    <attribute>
      <!-- 设置属性名 -->
      <name>optionVal</name>
      <!-- 是否为必要属性 -->
      <required>true</required>
      <!-- 是否遵循el表达式 -->
      <rtexprvalue>false</rtexprvalue>
      <!-- 标签说明 -->
      <description>该标签是数据标签</description>
    </attribute>
    <!--添加属性 -->
    <attribute>
      <!-- 设置属性名 -->
      <name>optionText</name>
      <!-- 是否为必要属性 -->
      <required>true</required>
      <!-- 是否遵循el表达式 -->
      <rtexprvalue>false</rtexprvalue>
      <!-- 标签说明 -->
      <description>该标签是数据标签</description>
    </attribute>
    <!--添加属性 -->
    <attribute>
      <!-- 设置属性名 -->
      <name>selectedVal</name>
      <!-- 是否为必要属性 -->
      <required>false</required>
      <!-- 是否遵循el表达式 -->
      <rtexprvalue>true</rtexprvalue>
      <!-- 标签说明 -->
      <description>该标签是数据标签</description>
    </attribute>
  </tag>
</taglib>

3.3创建实体类(Student )

package com.YX.JSP.entity;
/**
 * 实体对象:学生
 * 属性:sid,sname,ssex,sage
 * 
 * @author 君易--鑨
 *
 */
public class Student {
//  封装属性
   private int sid;//学号
   private String sname;//姓名
   private String ssex;//性别
   private int sage;//年龄
/**
 * 无参构造
 */
public Student() {
  // TODO Auto-generated constructor stub
}
//   获取属性的get和set方法
public int getSid() {
  return sid;
}
public void setSid(int sid) {
  this.sid = sid;
}
public String getSname() {
  return sname;
}
public void setSname(String sname) {
  this.sname = sname;
}
public String getSsex() {
  return ssex;
}
public void setSsex(String ssex) {
  this.ssex = ssex;
}
public int getSage() {
  return sage;
}
public void setSage(int sage) {
  this.sage = sage;
}
/**
 * 全参构造
 * @param sid
 * @param sname
 * @param ssex
 * @param sage
 */
public Student(int sid, String sname, String ssex, int sage) {
  super();
  this.sid = sid;
  this.sname = sname;
  this.ssex = ssex;
  this.sage = sage;
}
@Override
public String toString() {
  return "Student [sid=" + sid + ", sname=" + sname + ", ssex=" + ssex + ", sage=" + sage + "]";
}
}

3.4 在jsp文件中运用select标签

3.4.1 模拟添加下拉框选项
jsp代码
<%@page import="java.util.ArrayList"%>
<%@page import="com.YX.JSP.entity.Student"%>
<%@page import="java.util.List"%>
<%@ page language="java" contentType="text/html; charset=UTF-8"
  pageEncoding="UTF-8"%>
  <!-- 导入自定义的yx标签 -->
  <%@ taglib uri="/YX" prefix="yx" %>
<!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>
  <!--嵌套java代码存储要输出的数据  -->
  <%
//实例化一个list集合对象
  List<Student> list=new ArrayList<Student>();
//向集合中添加数据方便后续遍历显示到页面
   list.add(new Student(1,"君易","男",18));
   list.add(new Student(2,"木易","男",19));
   list.add(new Student(3,"君易--鑨","男",20));
   list.add(new Student(4,"木易鑫","男",22));
//利用request对象将list集合传输到页面上
   request.setAttribute("list", list);
%>
<p>自定义select标签实现结果</p>
<!--items取上面的list   optionVal取对象中的sid  optionText取对象中的sname  -->
<p>模拟添加下拉框的选项</p>
<yx:select items="${list }" optionVal="sid" optionText="sname"></yx:select>
</body>
</html>
页面输出结果

3.4.2 模拟从数据库中获取数据进行相应绑定
jsp代码
<%@page import="java.util.ArrayList"%>
<%@page import="com.YX.JSP.entity.Student"%>
<%@page import="java.util.List"%>
<%@ page language="java" contentType="text/html; charset=UTF-8"
  pageEncoding="UTF-8"%>
  <!-- 导入自定义的yx标签 -->
  <%@ taglib uri="/YX" prefix="yx" %>
<!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>
  <!--嵌套java代码存储要输出的数据  -->
  <%
//实例化一个list集合对象
  List<Student> list=new ArrayList<Student>();
//向集合中添加数据方便后续遍历显示到页面
   list.add(new Student(1,"君易","男",18));
   list.add(new Student(2,"木易","男",19));
   list.add(new Student(3,"君易--鑨","男",20));
   list.add(new Student(4,"木易鑫","男",22));
//利用request对象将list集合传输到页面上
   request.setAttribute("list", list);
%>
<p>自定义select标签实现结果</p>
<p>模拟从数据中获取数据绑定下拉框的选项</p>
<yx:select items="${list }" optionVal="sid" optionText="sname" selectedVal="2"></yx:select>
<yx:select items="${list }" optionVal="sid" optionText="sname" selectedVal="3"></yx:select>
<yx:select items="${list }" optionVal="sid" optionText="sname" selectedVal="1"></yx:select>
</body>
</html>

页面输出结果

3.5 注意事项

  1. 事项1

  2. 事项2
  3. 事项3
  4. 事项4

目录
相关文章
|
XML 存储 开发框架
J2EE之XML解析(超详细)
J2EE之XML解析(超详细)
74 0
|
6月前
|
前端开发 Oracle Java
JSF(JavaServer Face)标签库简介(JavaEE)
JSF(JavaServer Faces)是JavaEE框架,用于简化Web应用开发,采用组件驱动方式和MVC模式确保可维护性。主要实现包括PrimeFaces、Apache MyFaces和ICEFaces。JSF通过JCP标准化,Oracle提供了JSF2.2和2.3的实现库。JSF应用涉及UI设计、前后端分离及JavaBean交互。实现过程包括网站结构创建、库文件配置、Tomcat的JSF标签库设置以及启动验证。通过创建JSF页面如hello.xhtml,展示其工作原理。
219 2
|
12月前
|
XML 开发框架 Java
J2EE之自定义标签库的使用01(详情解答)
J2EE之自定义标签库的使用01(详情解答)
67 0
|
XML 数据采集 开发框架
J2EE基础之XML解析
J2EE基础之XML解析
46 0
|
前端开发 搜索推荐 Java
javaEE之自定义框架
javaEE之自定义框架
46 0
|
XML Java 数据格式
J2EE&JSP自定义标签库01&out标签&if标签
J2EE&JSP自定义标签库01&out标签&if标签
|
SQL XML Java
JSTL标签库(JSP标准标签库)
JSTL(JSP Standard Tag Library,核心标签库)是 JSP 标签的集合,它封装了 JSP 应用的通用核心功能。 JSP 标签是一组与 HTML 标签相似,但又比 HTML 标签强大的功能标签。JSTL 用来简化 JSP 开发,可以使我们不用嵌入 Java 代码就能够开发出复杂的 JSP 页面。 JSTL 包含 5 类标签库:core 标签库、fmt 标签库、fn 标签库、XML 标签库和 SQL 标签库。这 5 类标签库基本覆盖了 Web 开发中的所涉及的技术展示。
|
XML SQL Java
JSTL 标签库,以及 out 和 set 标签|学习笔记
快速学习 JSTL 标签库,以及 out 和 set 标签
146 0
JSTL 标签库,以及 out 和 set 标签|学习笔记
|
SQL XML Java
12.标准标签库(JSTL)
1.JSTL标签库安装     JSTL的概念:   JSP标准标签库(JSP Standard Tag Library)是一个实现 Web 应用程序中常见的通用功能的定制标记库集功能包括迭代和条件判断、数据管理格式化、XML 操作以及数据库访问JSTL标签库由几个子标签库组成,主要分为以下几种:核心标签、XML标签、格式化标签(I18N)、SQL标签、函数标签库。
1878 0