J2EE之自定义标签库的使用01(详情解答)

简介: J2EE之自定义标签库的使用01(详情解答)

J2EE之jsp自定义标签01

前言

自定义标签可以轻松地为不同的应用程序应用于不同的JSP页面,从而提高JSP页面的可重用性和可维护性。所以今天由我来分享一些有关jsp自定义标签相关的知识,让我们根据下面的思维导图一起来了解吧。

1 了解jsp自定义标签

1.1 概念:

JSP自定义标签是一种自定义的JSP标签,它允许开发人员将Java代码片段封装成一个可复用的标签,从而在JSP页面上实现更复杂的逻辑和功能。JSP页面中的自定义标签可以和HTML标签或其他JavaServer Pages (JSP) 标签混合使用。

1.2 作用:

  • 提高代码的可重用性和可维护性。通过JSP自定义标签,可以将页面分离为视图、控制器等模块,简化JSP页面的代码结构,减少代码重复,提高代码的可维护性。
  • 实现更复杂的逻辑和功能。JSP自定义标签可以封装Java代码,实现更复杂的逻辑和功能,同时提高JSP页面的灵活性和扩展性。
  • 简化JSP页面的开发和维护。使用JSP自定义标签可以把逻辑代码从JSP页面中移出,从而简化JSP页面的开发和维护,提高代码的可读性和可维护性。
  • 提高页面的可扩展性。通过自定义标签,可以方便地扩展页面的功能,为后续开发提供了更好的扩展的基础。
  • 降低了耦合度。通过自定义标签,不同的代码模块可以通过标签处理类之间进行数据传递和交互,从而降低了应用程序代码间的耦合度,使代码更具有可重用性和可维护性。

1.3 特点:

  • 可扩展性:JSP自定义标签是一种可扩展标签,它允许开发人员将Java代码片段封装成一个可复用的标签,从而实现更复杂的逻辑和功能。
  • 可扩展性:JSP自定义标签是一种可扩展标签,它允许开发人员将Java代码片段封装成一个可复用的标签,从而实现更复杂的逻辑和功能。
  • 灵活性:JSP自定义标签的使用方式非常灵活,可以与HTML标签或其他JSP标签混合使用,且其标识符可以自定义。
  • 解耦合性:通过JSP自定义标签,不同的代码模块可以通过标签处理类之间进行数据传递和交互,从而降低了应用程序代码间的耦合度。
  • 可维护性:JSP自定义标签的使用,可以降低程序的复杂度和代码的冗余程度,便于开发人员进行程序的维护和修改。

1.4 jsp自定义标签分类

标签类 实例
空标签 例如:br、hr
ui标签 例如:input、table
控制标签 例如:if、foreach
数据标签 例如:out标签

1.5 标签的书写格式

<开始标签 属性="属性值">标签体</结束标签>

2. jsp自定义标签的开发和使用步骤

2.1 jsp开发自定义标签的步骤:

  1. 创建Java包:在Servlet容器的 /WEB-INF/classes 目录中创建一个Java包。包名应该与你的标签描述文件的uri属性的值相匹配。
  2. 创建标签处理类:在刚才创建的Java包中创建一个类,类名应该与标签描述文件中定义的标签名称相同。该类必须扩展TagSupport类并实现doStartTag()、doEndTag()和doAfterBody()方法之一或全部。
  3. 创建标签描述符文件:在 WEB-INF 目录下创建一个 XML 文件,该文件应该包含完整的自定义标签描述符定义,包括标签名称、映射URI、属性和标签处理类等信息。
  4. 在 JSP 页面中使用标签:在 JSP 页面中包含刚刚创建的标签描述符,并调用你自定义的标签名称并设置标签属性。当 JSP 页面被处理时,自定义标签处理类中的相应方法将被调用。
  5. 安装自定义标签库:将标签描述符文件复制到 WEB-INF/tlds 目录下,并且在 JSP 页面中包含标签描述符文件。
  6. 发布应用程序并测试:部署你的应用程序并运行它以确保标签库已经正确安装并在 JSP 页面中正常运行。

2.2 jsp自定义标签的使用:

1.导入标签库:在 JSP 页面中的 <%@ page %> 指令中导入标签库。指令的格式如下:

<%@ taglib prefix="prefixName" uri="tagLibraryURI" %>

其中,prefixName 是前缀名,tagLibraryURI 是库的 URL。

2.使用自定义标签:在 JSP 页面中调用自定义标签,格式如下:

<prefixName:tagName attribute1="value1" attribute2="value2">

其中,prefixName 是前缀名,tagName 是自定义标签的名称,attribute1 和 attribute2 是自定义标签的属性名,value1 和 value2 是自定义标签的属性值。

3.关闭标签:在 JSP 页面中使用 </prefixName:tagName> 语法来关闭标签。示例如下:

<prefixName:tagName attribute1="value1" attribute2="value2"></prefixName:tagName>

4.显示结果:自定义标签的结果将在 JSP 页面中显示。

总之,要使用自定义标签,你需要知道自定义标签库的前缀和 URL。然后,你可以使用标签名称和属性来调用标签,并在 JSP 页面中显示标签的结果。

2.3 案例展示(y:out标签)

2.3.1 创建一个标签助手类(OuutTag.java)
package com.YX.JSP.tag;
import java.io.IOException;
import javax.servlet.jsp.JspException;
import javax.servlet.jsp.JspWriter;
import javax.servlet.jsp.tagext.BodyTagSupport;
/***
 * 自定义标签助手类 继承BodyTagSupport类说明此类是jsp自定义标签的助手类
 * 
 * @author 86158
 *
 */
public class OuutTag extends BodyTagSupport {
  private String val;
  private String defaultVal;
  // 分别获取两个属性的get和set的方法
  public String getVal() {
    return val;
  }
  public void setVal(String val) {
    this.val = val;
  }
  public String getDefaultVal() {
    return defaultVal;
  }
  public void setDefaultVal(String defaultVal) {
    this.defaultVal = defaultVal;
  }
  @Override // 用于和对方法是否编写的和继承的父类一致
  public int doStartTag() throws JspException {// 抛出异常处理
    // 实例化回显工具类,将指定的数值输出到页面上
    // pageContext是页面上下文对象,用户和jsp共享数据
    JspWriter out = this.pageContext.getOut();
    try {
      if (this.val == null || this.val.equals("")) {// 判断传输到页面的值是否为空,为空则输出默认值到页面上
        // 利用JspWriter对象将默认值输出到页面上
        out.println(this.defaultVal);
      } else {
        // 利用JspWriter对象将传输值输出到页面上
        out.println(this.val);
      }
    } catch (IOException e) {
      // 如果异常,在控制台抛出异常提示
      throw new JspException("out标签异常", e);
    }
    return SKIP_BODY;// 返回SKIP_BODY
  }
}
2.3.2 编写 tld文件,(必须放在 WEB-INF同目录或WebContext目录下)(示例YXmvc.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>/YX</uri>
  <tag>
    <!-- 标签名 -->
    <name>ouut</name>
    <!--标签助手类 -->
    <tag-class>com.YX.JSP.OuutTag</tag-class>
    <!-- 标签的内容类型:empty表示空标签,jsp表示可以为任何合法的JSP元素 -->
    <body-content>empty</body-content>
    <!-- 定义属性 -->
    <attribute>
      <!--属性名 OutTag类中的val属性相匹配 -->
      <name>val</name>
      <!--表示该属性为必要的属性 -->
      <required>true</required>
      <!-- 该属性可以接受EL表示式的值 -->
      <rtexprvalue>true</rtexprvalue>
      <!-- 标签描述,用于说明标签的作用 -->
      <description>out标签val属性,用于输出val的值</description>
    </attribute>
    <attribute>
      <!-- 属性名, OutTag类中的defaultVal属性相匹配 -->
      <name>defaultVal</name>
      <!-- 表示该属性为必要的属性 -->
      <required>false</required>
      <!-- 该属性可以接受EL表示式的值 -->
      <rtexprvalue>false</rtexprvalue>
      <!-- 标签描述,用于说明标签的作用 -->
      <description>out标签,如val属性值为空,则输出该默认值</description>
    </attribute>
  </tag>
</taglib>
2.3.3 新建一个jsp文件引入所写的标签
<%@page import="java.util.List"%>
<%@ page language="java" contentType="text/html; charset=UTF-8"
  pageEncoding="UTF-8"%>
<%@taglib prefix="yx" uri="/YX"%>
<!DOCTYPE>
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
<title>自定义标签</title>
</head>
<body>
  <!--自定义out标签输出 -->
  <yx:ouut val="你好我是自定义标签out,val属性输出" />
  <!--自定义out标签EL表达式使用  -->
  <%
    request.setAttribute("name", "我是在作用域的文件,利用EL表达式获取");
  %>
  <yx:ouut val="${name }" />
</body>
</html>
</body>
</html>

页面显示结果

3. jsp自定义标签生命周期

3.1 图解:

3.2 阶段:

1.加载阶段(Loading Phase):当JSP页面被请求时,容器会读取该页面对应的标签库文件,检查其中所有的自定义标签,并将它们编译成Java类。这个过程只会在第一次请求时执行一次。

2.初始化阶段(Initialization Phase):在加载完所有的标签类后,容器会对这些类进行初始化,根据标签的不同实现类的初始化也会不同。

3.执行阶段(Execution Phase):当页面请求需要执行自定义标签时,容器会使用相应的标签处理器,通过调用标签处理器的相应方法来执行标签。

4.销毁阶段(Destroy Phase):当JSP页面的请求完成后,容器会销毁所有与该页面相关的资源,包括初始化过的标签类。在这个阶段,可以对自定义标签的属性和内部对象进行清理操作,以释放系统资源。

3.3 返回值

返回值 返回值说明
SKIP_BODY 跳过主体
EVAL_BODY_INCLUDE 计算标签主体内容并输出
EVAL_BODY_AGAIN 再计算主题一次
EVAL_PAGE 计算页面的后续部分
SKIP_PAGE 跳过页面的后续部分

3.4 开发场景

如图示

doStartTag()----->doEndTag()场景一般用于像上面的out标签

doStartTag()------->doAfterBody()场景一般用于像if标签----------->doEndTag()

doStartTag()------->doAfterBody(循环)----------->doEndTag()场景一般用于像foreach的标签。

4. 自定义的if标签

4.1 编写if自定义标签助手类

package com.YX.JSP.tag;
import javax.servlet.jsp.JspException;
import javax.servlet.jsp.tagext.BodyTagSupport;
/**
 * 标签助手类(if标签)
 * @author 86158
 *
 */
public class IfTag extends BodyTagSupport{
  private boolean test;//定义一个属性代表if标签判断的结果
//  获取set的方法
  public void setTest(boolean test) {
    this.test = test;
  }
//  编写doStartTag方法
  @Override
  public int doStartTag() throws JspException {
    System.out.println("=========doStartTag======");
    if (this.test) {//结果为true就执行计算后面的语句体
      return EVAL_BODY_INCLUDE;
    }
    return SKIP_BODY;
  }
  //后面的方法方便看到if标签的一个生命周期
  @Override
  public int doAfterBody() throws JspException {
    System.out.println("=========doAfterBody======");
    return super.doAfterBody();
  }
  @Override
  public int doEndTag() throws JspException {
    System.out.println("=========doAfterBody======");
    return super.doEndTag();
  }
}

4.2 在.tld文件中添加if标签

<!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>
    <!-- 添加if标签 -->
    <name>if</name>
    <!--设置标签助手类 -->
    <tag-class>com.YX.JSP.tag.IfTag</tag-class>
    <!-- 标签的内容类型:empty表示空标签,jsp表示可以为任何合法的JSP元素 -->
    <body-content>JSP</body-content>
    <!--设置属性名 -->
    <attribute>
      <name>test</name>
      <required>true</required>
      <rtexprvalue>true</rtexprvalue>
    </attribute>
  </tag>
</taglib>

4.3 在jsp页面中引入if标签

![if标签控制台输出](C:\Users\86158\Desktop\截图\jsp自定义标签01\if标签控制台输出.png)<%@page import="java.util.List"%>
<%@ page language="java" contentType="text/html; charset=UTF-8"
  pageEncoding="UTF-8"%>
<%@taglib prefix="yx" uri="/YX"%>
<!DOCTYPE>
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
<title>自定义标签</title>
</head>
<body>
  <!-- 自定义if标签的使用 -->
  <yx:if test="${100==100}">
     测试text结果是为true
</yx:if>
<br>
<yx:if test="${100!=100}">
     测试text结果是为true
</yx:if>
</body>
</html>
</body>
</html>

页面输出结果

控制台输出结果

5. 自定义set标签和out标签

out标签2.3案例演示中包含了

5.1 新建一个set标签助手类和out标签助手类

set标签助手类
package com.YX.JSP.tag;
import javax.servlet.jsp.JspException;
import javax.servlet.jsp.tagext.BodyTagSupport;
/**
 * Set标签助手类
 * 数据标签,存储数据
 * 作用:page.Context,request,session,application
 * 
 * 要存储数据以键值对的形式存储,分析得来两个标签属性
 * @author 君易--鑨
 *
 */
public class SetTag extends BodyTagSupport{
      private String var;//set标签要存入的属性名
      private Object value;//set标签要存入的属性值
//      获取set、get方法
  public String getVal() {
    return var;
  }
  public void setVal(String val) {
    this.var = val;
  }
  public Object getValue() {
    return value;
  }
  public void setValue(Object value) {
    this.value = value;
  }
  @Override
  public int doStartTag() throws JspException {
    pageContext.setAttribute(var, value);
    return super.doStartTag();
  }
}
out标签助手类
package com.YX.JSP.tag;
import java.io.IOException;
import javax.servlet.jsp.JspException;
import javax.servlet.jsp.JspWriter;
import javax.servlet.jsp.tagext.BodyTagSupport;
/**
 * out标签助手类
 * @author 君易--鑨
 *
 */
public class OutTag extends BodyTagSupport{
       private Object value;//页面要输出的值
//       获取set和get方法
  public Object getValue() {
    return value;
  }
  public void setValue(Object value) {
    this.value = value;
  }
//  编写doStartTag方法
  @Override
  public int doStartTag() throws JspException {
//    获取输出流对象
    JspWriter out = pageContext.getOut();
    try {
//      向页面输出对象值
      out.print(value);
    } catch (IOException e) {
      // TODO Auto-generated catch block
      e.printStackTrace();
    }
    return super.doStartTag();
  }
}

5.2 在后缀名.tld中添加set和out标签

<taglib>
<!-- 添加set标签 -->
<tag>
<name>set</name>
<!--设置标签助手类 -->
    <tag-class>com.YX.JSP.tag.SetTag</tag-class>
    <!-- 标签的内容类型:empty表示空标签,jsp表示可以为任何合法的JSP元素 -->
    <body-content>JSP</body-content>
<!--设置属性名 -->
    <attribute>
      <name>var</name>
      <required>true</required>
      <rtexprvalue>false</rtexprvalue>
    </attribute>
    <attribute>
      <name>value</name>
      <required>true</required>
      <rtexprvalue>true</rtexprvalue>
    </attribute>
</tag>
<!--添加out标签  -->
<tag>
<!--标签名  -->
<name>out</name>
<!-- 标签助手类 -->
<tag-class>com.YX.JSP.tag.OutTag</tag-class>
<body-content>JSP</body-content>
<!--设置属性名 -->
    <attribute>
      <name>value</name>
      <required>true</required>
      <rtexprvalue>true</rtexprvalue>
    </attribute>
</tag>
</taglib>

5.3 在jsp页面中运用

<%@page import="java.util.List"%>
<%@ page language="java" contentType="text/html; charset=UTF-8"
  pageEncoding="UTF-8"%>
<%@taglib prefix="yx" uri="/YX"%>
<!DOCTYPE>
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
<title>自定义标签</title>
</head>
<body>
<!-- set与out -->
<%-- <yx:set var="name" value="君易--鑨"></yx:set> --%>
<yx:set var="name" value="君易--鑨"></yx:set>
<yx:out value="${name }"></yx:out>
</body>
</html>
</body>
</html>

页面输出结果

目录
相关文章
|
8月前
|
开发框架 前端开发 Java
J2EE 通用分页01(超详细解析)
J2EE 通用分页01(超详细解析)
17 0
|
8月前
|
关系型数据库 MySQL
|
8月前
|
SQL 搜索推荐 数据库
|
8月前
|
SQL 存储 搜索推荐
J2EE&通用分页01
J2EE&通用分页01
|
7月前
|
XML 开发框架 Java
J2EE之自定义标签库的使用02
J2EE之自定义标签库的使用02
37 0
|
8月前
|
前端开发 Java
通用分页进阶之jsp之自定义标签
通用分页进阶之jsp之自定义标签
21 1
|
8月前
|
SQL 开发框架 Java
J2EE之通用分页(上)
J2EE之通用分页(上)
21 0
|
8月前
|
开发框架 Java API
J2EE之通用分页(下)
J2EE之通用分页(下)
19 0
|
8月前
|
XML Java 数据格式
J2EE&JSP自定义标签库01&out标签&if标签
J2EE&JSP自定义标签库01&out标签&if标签