自定义JSP标签->概念->生命周期

简介: 自定义JSP标签->概念->生命周期

1:什么是标签


所谓的标签其实就是标记语言,是一种注释文本语言,以便于计算机可以操作。说白了就是计算机可以识别的一种语言


2:jsp标签库是什么


是一个JSP标签集合,它封装了JSP应用的通用核心功能, 基于JSP标签我们可以理解为,是JSP应该通用功能的一种封装方式。你可以直接看成JSP标签集合,可以更方便我们使用JSP标签


3:jsp标签能做什么


通过JSP标签可以使网页变得简洁并且能更方便我们维护,还可以方便实现同一个JSP文件支持多种语言版本(说白了就是JSP标签是一种跨平台语言,其他语言都能使用)。


JSP标签生命周期讲解


当我们实例化标签助手类后就可以开始通过doStartTag方法来处理JSP标签,在我们发送响应时,在doStartTag内部会开始判断是否有标签体。如果有标签体就会进入到doAFterBody方法中,在doAFterBody方法里会继续判断里面是否有方法体,如果里面还有方法体未执行完会继续执行doAFterBody方法。当doAFterBody方法里面的标签体处理完了就会执行doEndTag,这样一个JSP生命周期就结束了    注意:JSP标签是通过Java反射来实现的


流程A:

                                     SKIP_BODY

 3.1  实例化标签助手类->doStartTag()------------->doEndTag()

      //主要用开发简单标签


 流程B:

                                     EVAL_BODY_INCLUDE         SKIP_BODY

 3.2  实例化标签助手类->doStartTag()------------->doAfterBody---------------->doEndTag()...

                                                             EVAL_BODY_AGAIN


doStartTag

doStartTag方法是遇到JSP标签开始处理的方法,它会有两个返回值。一个是SKIP_BODY,另一个是EVAL_BODY_INCLUDE。SKIP_BODY表示不显示标签间的文字,EVAL_BODY_INCLUDE表示显示标签间的文字


doAFterBody

doAFterBody方法是显示完标签间的文字后响应的,其返回值为EVAL_BODY_AGAIN与SKIP_BODY。EVAL_BODY_AGAIN表示会再次显示一次标签间的文字,SKIP_BODY表示执行下一步


doEndTag

doEndTag方法是标签结束时处理的,其返回值为EVAL_PAGE与SKIP_PAGE。EVAL_PAGE表示处理完当前标签后继续执行下面的JSP网页,SKIP_PAGE表示不处理下面的JSP网页


1. 标签语言特点

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


  空标签

 


  <开始标签>

  <开始标签/>


2. 自定义标签的开发及使用步骤(浏览器使用:google/firefox)

编写助手类

2.1 创建一个标签助手类(继承BodyTagSupport)

     标签属性必须与助手类的属性对应、且要提供对应get/set方法

     rtexprvalue

package com.zking.jsptag.tag;
import javax.servlet.jsp.JspException;
import javax.servlet.jsp.tagext.BodyTagSupport;
/**
 * 自定义标签开发步骤
 * 1) 创建一个标签助手类(继承BodyTagSupport)
 * 注:标签属性必须与助手类的属性对应、且要提供对应get/set方法
 * 2)创建标签库描述文件(tld),必须放置到WEN-INF或其子目录下
 * 
 * 3)在页面通过taglib指令引入自定义标签库
 * @author Administrator
 *
 */
public class TestTag extends BodyTagSupport {
  private Object name;
  private int count=0;
  public Object getName() {
  return name;
  }
  public void setName(Object name) {
  this.name = name;
  }
  /**
  * doStartTag():表示<开始标签>所对应执行的动作
  * 例如:对应<z:test>标签所执行的动作
  * 返回值:
  * 1)SKIP_BODY:跳过主体内容不执行
  * 2)EVAL_BODY_INCLUDE:计算主体内容并包含在输出中
  */
  @Override
  public int doStartTag() throws JspException {
  // TODO Auto-generated method stub
  count=0;
  System.out.println("name="+this.name);
  System.out.println("doStartTag():表示<开始标签>所对应执行的动作");
  return EVAL_BODY_INCLUDE;
  }
  /**
  * doAfterBody():介于<开始标签>标签体<结束标签>之间所执行的动作
  * 例如:介于<z:test>888与</z:test>之间所执行的动作
  * 返回值:
  * 1):SKIP_BODY:跳过主体内容不输出(在此处可以把它理解为for循环中的break)
  * 2):EVAL_BODY_AGAIN:再次计算主体内容并包含在输出中(可以理解为continue)
  */
  @Override
  public int doAfterBody() throws JspException {
  // TODO Auto-generated method stub
  System.out.println("doAfterBody():介于<开始标签>标签体<结束标签>之间所执行的动作");
  //count=3不输出
  if(count<3) {
    count++;
    return EVAL_BODY_AGAIN;
  }
  return SKIP_BODY;
  }
  /**
  * doEndTag():表示<结束标签>所对应执行的动作
  * 例如:对应</z:test>所执行的对象
  * 返回值:
  * 1):SKIP_PAGE:跳过页面的后续内容
  * 2):EVAL_PAGE:计算页面的后续内容
  */
  @Override
  public int doEndTag() throws JspException {
  // TODO Auto-generated method stub
  System.out.println("doEndTag():表示<结束标签>所对应执行的动作");
  return EVAL_PAGE;
  } 
}

编写助手类其实就是定义实体类,只是多了三个实现JSP标签方法。


编写标签库描述文件

 2.2 创建标签库描述文件(tld),添加自定义标签的配置

     注:tld文件必须保存到WEB-INF目录或其子目录

     jstl标签库

<!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的版本 -->
  <jsp-version>1.2</jsp-version>
  <!-- 你的标签库的简称 -->
  <short-name>z</short-name>
  <!-- 你标签库的引用uri -->
  <uri>/zking</uri>
  <tag>
  <!-- 标签名 -->
  <name>test</name>
  <!-- 标签工具类 -->
  <!-- Class.forName("com.zking.jsptag.tag.TestTag") -->
  <tag-class>com.zking.jsptag.tag.TestTag</tag-class>
  <!-- 标签的内容类型:empty表示空标签,jsp表示可以为任何合法的JSP元素 -->
  <body-content>jsp</body-content>
  <!-- 自定义标签的属性定义,请注意一定要在标签类中提供对应的get/set方法 -->
  <attribute>
    <!-- 自定义标签的属性名称 -->
    <name>name</name>
    <!-- true表示必填 -->
    <required>true</required>
    <!-- true支持动态值,可以向值里面填jsp表达式、EL表达式,false则不支持 -->
    <rtexprvalue>true</rtexprvalue>
  </attribute>
  </tag>
</taglib>

注意: 在定义tag-class中必须使用完整类名。在定义属性名时必须与助手类中的属性相匹配

在页面上引入JSP标签

 2.3 在JSP通过taglib指令导入标签库,并通过指定后缀访问自定义标签

<%@page import="java.util.Arrays"%>
<%@page import="java.util.List"%>
<%@ page language="java" contentType="text/html; charset=UTF-8"
    pageEncoding="UTF-8"%>
<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">
<%@taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core" %>
<%@taglib prefix="z" uri="/zking" %>
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
<title>Insert title here</title>
</head>
<body>
<%
  List<String> lst = Arrays.asList(new String[]{"zs","ls","ww"});
  //page->requset->session->application
  request.setAttribute("lst", lst);
  request.setAttribute("name", "xq");
%>
<!-- requestScope隐式作用域 -->
<c:forEach items="${lst }" var="n">
${n }
</c:forEach>
<h2>1.自定义test标签</h2>
<z:test name="${name }">888</z:test>
1234<br/>
1213223<br/>
123131313<br/>
231424242424<br/>
</body>
</html>

注意: 在界面引入自己定义的JSP标签时,路径必须要与你自己定义的路径保持一致

总结:在jsp页面中,我们使用了自定义jsp标签。它首先会通过你引入的路径uri找到你自己编写的tld文件。在tld文件中通过你引入的标签名找到标签助手类。在我的示例中,我在jsp页面中使用的是out标签。他首先找到out标签,然后在out标签下通过tag-class路径来找到我的助手类。在助手类中通过Java反射来调用你的set方法,然后就开始调用doStartTag方法,在dostartTag中就开始处理你的业务。我的示例中我只写了一个dostartTag方法,为什么只写一个呢?因为我是继承BodTagsupprt的,在这里面已经实现dostartTag,doAFterBody,doEndTag方法。我写的dostartTag方法只是重写父类的方法。而且我要做的业务只是输出,是一个空标签,没有必要再写其他两个方法

 SKIP_BODY:跳过主体

 EVAL_BODY_INCLUDE:计算标签主体内容并[输出]

 EVAL_PAGE:计算页面的后续部分

 SKIP_PAGE:跳过页面的后续部分

 EVAL_BODY_AGAIN:再计算主体一次

相关文章
|
7月前
|
存储 缓存 Java
JSP页面生命周期详解及优化建议
JSP页面生命周期详解及优化建议
146 0
|
6月前
|
SQL XML Java
JSP 教程 之 JSP 标准标签库(JSTL) 4
**JSP的JSTL是用于简化Web开发的标签库,包括核心、格式化、SQL、XML和函数5个部分。SQL标签库允许与数据库交互,如设定数据源、执行查询和更新,以及处理参数。例如, `&lt;sql:setDataSource&gt;` 定义数据源, `&lt;sql:query&gt;` 执行查询。通过使用JSTL,开发者能更整洁地处理JSP页面。**
55 8
|
6月前
|
XML SQL Java
JSP 教程 之 JSP 标准标签库(JSTL) 1
JSP的JSTL是用于简化页面逻辑的标签库,涵盖核心、格式化、SQL、XML和函数五大类标签。要安装,下载Apache的JSTL包,将jar文件放入WEB-INF/lib,tld文件复制到WEB-INF,并在web.xml中配置相应的taglib信息。JSTL促进了JSP页面的清洁和结构化。
51 5
|
3月前
|
自然语言处理 Java 数据库连接
探索研究JSP 生命周期
【9月更文挑战第29天】
37 0
|
6月前
|
XML SQL Java
JSP 教程 之 JSP 标准标签库(JSTL) 6
**JSP JSTL 摘要:** JSTL是JSP的标签库,包含核心、格式化、SQL、XML和函数5类标签。它用于执行常见任务,如迭代、条件判断和XML操作。JSTL函数库提供字符串处理函数,如`contains()`, `endsWith()`, `escapeXml()`等,方便XML和HTML处理。通过`&lt;%@ taglib %&gt;`导入,如`fn:trim()`用于去除字符串两端空白。
46 5
|
7月前
|
Java 容器
JSP 教程 之 JSP 生命周期 3
了解JSP生命周期对掌握其核心功能至关重要。它包括编译、初始化、执行和销毁四个阶段。在编译阶段,JSP被转化成servlet源码并编译为类。初始化阶段加载servlet,创建实例并执行初始化方法。执行阶段调用_servletService()处理请求和响应,每次请求都会触发该方法处理GET、POST等HTTP操作。最后,销毁阶段调用servlet的销毁方法并删除实例。
57 2
|
7月前
|
Java 数据库连接 容器
JSP 教程 之 JSP 生命周期 4
JSP生命周期包括编译、初始化、执行和销毁四个阶段。在编译阶段,JSP转换为servlet。初始化阶段加载并实例化servlet。执行阶段调用服务方法响应请求。销毁阶段调用销毁方法,如`jspDestroy()`,用于资源释放。示例代码展示了`jspInit()`、`_jspService()`和`jspDestroy()`方法在生命周期中的应用。浏览器显示初始化、服务请求和销毁的计数。
48 1
|
7月前
|
Java 数据库连接 开发者
JSP 教程 之 JSP 生命周期 2
JSP教程探讨了JSP生命周期,包括编译、初始化、执行和销毁四个阶段。当浏览器请求页面时,JSP引擎可能先编译JSP,将其转化为servlet并执行初始化方法jspInit()。在执行阶段,调用servlet的服务方法。最后,通过调用jspDestroy()销毁servlet实例。开发者可覆盖jspInit()进行自定义初始化操作,如建立数据库连接。
49 1
|
7月前
|
Java 容器
JSP 教程 之 JSP 生命周期 1
**JSP生命周期概览**: JSP的生命周期从编译开始,当需要时,servlet容器将JSP转换为servlet类。接着是初始化,加载servlet并实例化,调用初始化方法。执行阶段涉及调用服务方法响应客户端请求。最后,销毁阶段servlet实例的销毁方法被调用,实例被释放。此过程与servlet生命周期相似,但多了编译步骤。
58 1
|
6月前
|
Java 应用服务中间件 Android开发
完成你的自定义JSP Tag标签-Basic Coustom Tag
完成你的自定义JSP Tag标签-Basic Coustom Tag
35 0