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自定义mvc【框架配置及功能】
1、在增删改的方法里面我们这两行代码是一样的、重复的。类里面增加了一个通用的增删改的方法,我们在。我们新建一个web包,在里面新建一个。进行一个搜索,新增、修改、删除。进行一个通用的增删改的方法。BookDaoTest测试。测试我们的数据库能否连接。增加,修改的jsp界面。我们删除ID:16、22。导入之后我们选中所有的。2、代码逻辑是重复的。书籍名:圣墟1234。
|
11月前
|
XML 存储 开发框架
J2EE之XML解析(超详细)
J2EE之XML解析(超详细)
66 0
|
11月前
|
XML 存储 开发框架
J2EE XML最详细解析
J2EE XML最详细解析
50 0
|
10月前
|
XML 开发框架 Java
J2EE之自定义标签库的使用01(详情解答)
J2EE之自定义标签库的使用01(详情解答)
53 0
|
10月前
|
XML 开发框架 JavaScript
J2EE(XML的解析)
J2EE(XML的解析)
56 0
|
10月前
|
XML 数据采集 开发框架
J2EE基础之XML解析
J2EE基础之XML解析
44 0
|
11月前
|
XML Java 数据格式
J2EE&JSP自定义标签库01&out标签&if标签
J2EE&JSP自定义标签库01&out标签&if标签
|
XML 设计模式 SQL
Web---JSTL(Java标准标签库)-Core核心标签库、I18N国际化、函数库(1)
Web---JSTL(Java标准标签库)-Core核心标签库、I18N国际化、函数库(1)
198 0
Web---JSTL(Java标准标签库)-Core核心标签库、I18N国际化、函数库(1)