JSP 自定义标签第3/3页

我来详细讲解一下 "JSP 自定义标签第3/3页" 的完整攻略。

什么是 JSP 自定义标签

JSP 自定义标签,指的是用户可以自定义自己的标签,在 JSP 页面上使用,达到简化 JSP 页面代码,增加可读性的目的。JSP 自定义标签可以分为两种类型:

  • 动态内容标签:在标签体中执行动态内容,并输出结果。
  • 静态内容标签:输出预定的静态内容,不需要执行动态逻辑。

自定义标签的基本语法

自定义标签的基本语法如下:

<taglib>
  <tag>
    <name>tagName</name> <!-- 标签名 -->
    <tag-class>com.xxx.TagClass</tag-class> <!-- 标签类名 -->
    <body-content>JSP</body-content> <!-- 标签体内容 -->
  </tag>
</taglib>

其中,name 是标签名,tag-class 是标签对应的 Java 类的全限定名,body-content 表示标签体可以有的内容类型,有三种可选值:

  • JSP:标签体内直接写 JSP 代码。
  • empty:标签体为空。
  • scriptless:标签体不能是 JSP 代码,并且无法访问隐含对象。

自定义标签的完整攻略

从定义标签类、定义标签库及部署应用三部分来讲解 JSP 自定义标签的完整攻略。

定义标签类

自定义标签的 Java 类主要包含两个部分:定义属性和业务逻辑的方法。

定义标签属性

使用 Java Bean 的方式,在标签类中定义属性,可以使用 JSP 页面中的属性(即 JSP EL 表达式)或者其他 var 变量来设置自定义标签的属性值。

示例如下:

public class HelloWorldTag extends TagSupport {

    private String message;

    public void setMessage(String message) {
        this.message = message;
    }
    // ...
}

在 JSP 页面中使用自定义标签时,可以使用 JSP EL 表达式或者 var 变量来设置 message 属性的值,例如:

<my:helloWorld message="${param.name}" />
<my:helloWorld message="${user.name}" />

实现业务逻辑的方法

自定义标签的业务逻辑方法必须实现 javax.servlet.jsp.tagext.Tag 接口。在 doStartTag() 方法中处理标签的开始标记,doEndTag() 方法中处理标签的结束标记,doAfterBody() 方法中处理标签之间循环的内容。具体实现方式可以根据不同的标签体内容类型进行定义。

示例如下:

public class HelloWorldTag extends TagSupport {

    private String message;

    @Override
    public int doStartTag() throws JspException {
        JspWriter out = pageContext.getOut();
        try {
            out.println("Hello World!");
            out.println("Message: " + message);
        } catch (IOException e) {
            throw new JspException(e.getMessage());
        }
        return EVAL_BODY_INCLUDE;
    }

    // ...
}

定义标签库

标签库主要包含了用标签名映射标签的信息,可以让 JSP 引擎知道哪些标签由哪些类的哪些方法处理。

标签库需要定义在一个 XML 文件中,如 mytag.tld 中的示例:

<taglib>
  <tlib-version>1.0</tlib-version>
  <tag>
    <name>helloWorld</name>
    <tag-class>com.xxx.HelloWorldTag</tag-class>
    <body-content>empty</body-content>
    <attribute>
      <name>message</name>
      <required>true</required>
      <rtexprvalue>true</rtexprvalue>
    </attribute>
  </tag>
</taglib>

其中,name 是自定义标签的名字,tag-class 是自定义标签的处理类,body-content 是标签体的内容类型,attribute 标签是自定义属性信息。

部署应用

将自定义标签类编译成 class 文件,打成 jar 包,将 jar 包放到 WEB-INF/lib 目录下。然后将 mytag.tld 文件放到 WEB-INF 目录下,配置 web.xml 文件。

web.xml 文件中增加以下内容:

<jsp-config>
  <taglib>
    <taglib-uri>/mytag</taglib-uri>
    <taglib-location>/WEB-INF/mytag.tld</taglib-location>
  </taglib>
</jsp-config>

其中,taglib-uri 是个性化命名空间,taglib-location 是 mytag.tld 文件的路径。

完成以上步骤后,就可以在 JSP 页面中使用自定义标签了,示例如下:

<%@ taglib prefix="my" uri="/mytag" %>
...
<my:helloWorld message="Hello World!" />

示例说明

动态内容标签示例

以自定义标签名为 foreach 的动态内容标签为例,示例如下:

  1. 在 webapp 目录下创建目录 WEB-INF/tags,并在此目录下创建 foreach.tag 文件:
<%@tag body-content="JSP"%>
<%@attribute name="items"%>
<%@variable name-given="item" alias-from="item"%>
<%@variable name-given="index" alias-from="index"%>
<%@variable name-given="count" alias-type="int" scope="AT_BEGIN"%>
<%
    Object[] items = (Object[]) pageContext.getAttribute("items");
    if (items != null) {
        for(int index=0; index<items.length; index++) {
            count = index + 1;
            item = items[index];
            pageContext.setAttribute("item", item);
            pageContext.setAttribute("index", index);
%>
            <%=bodyContent%>
<%
        }
    }
%>

该标签的标签体可以是 JSP 代码,需要使用 attribute 定义标签属性。

  1. 在 webapp 目录下创建目录 WEB-INF/tags,并在此目录下创建 foreach.tld 文件:
<tag>
    <name>foreach</name>
    <tag-class>com.example.tags.ForEachTag</tag-class>
    <body-content>JSP</body-content>
    <attribute>
        <name>items</name>
        <required>true</required>
        <rtexprvalue>true</rtexprvalue>
    </attribute>
</tag>

定义自定义标签的属性,将标签名映射到标签类。

  1. 在 JSP 页面中使用自定义标签:
<%@ taglib prefix="my" tagdir="/WEB-INF/tags" %>
<my:foreach items="${items}">
  <p>item: ${item}, index: ${index}, count: ${count}</p>
</my:foreach>

静态内容标签示例

以自定义标签名为 includeHeader 的静态内容标签为例,示例如下:

  1. 在 webapp 目录下创建目录 WEB-INF/tags,并在此目录下创建 includeHeader.tag 文件:
<%@ tag language="java" pageEncoding="UTF-8"%>
<div class="header">
    <h1>This is header</h1>
</div>

该标签的标签体为空,输出预定义的静态内容。

  1. 在 webapp 目录下创建目录 WEB-INF/tags,并在此目录下创建 includeHeader.tld 文件:
<tag>
    <name>includeHeader</name>
    <tag-class>com.example.tags.IncludeHeaderTag</tag-class>
    <body-content>empty</body-content>
</tag>

将标签名映射到标签类。

  1. 在 JSP 页面中使用自定义标签:
<%@ taglib prefix="my" tagdir="/WEB-INF/tags" %>
<my:includeHeader />

输出定义好的静态内容。

总结

以上就是 “JSP 自定义标签第3/3页” 的完整攻略,主要包括了自定义标签的基本语法、定义标签类、定义标签库及部署应用,以及两个示例说明。自定义标签可以帮助简化 JSP 页面代码,使其更具可读性,也可以根据业务需求灵活自由的定义标签。

本站文章如无特殊说明,均为本站原创,如若转载,请注明出处:JSP 自定义标签第3/3页 - Python技术站

(0)
上一篇 2023年6月15日
下一篇 2023年6月15日

相关文章

  • Java基础异常处理代码及原理解析

    Java基础异常处理代码及原理解析 什么是异常处理? Java中的异常指的是程序在运行过程中遇到的错误或异常情况,比如说除数为零、数组下标越界、空指针等。为了保证程序的正常运行,我们需要对这些异常情况进行处理,避免程序崩溃或者出现无法预料的结果。 在Java中,异常处理机制分为两种:检查性异常和非检查性异常。检查性异常需要在代码中进行处理,如IOExcept…

    Java 2023年5月30日
    00
  • Java Date与String的相互转换详解

    Java Date与String的相互转换详解 在Java开发中,我们经常需要对日期时间进行处理和转换,而Java中常用的日期时间类型有两个:Date和String。本篇攻略将详细讲解Java Date和String的相互转换方法。 Date类型转换为String类型 将Date类型转换为String类型,常用的有以下两种方式: 方法一:使用SimpleDa…

    Java 2023年5月20日
    00
  • 自定义一个异常类模板的简单实例

    让我给你详细讲解一下如何自定义一个异常类模板的简单实例。 自定义异常类的处理方式 当我们进行编程时,经常会遇到一些异常情况,例如用户输入了错误的信息,文件读取失败等等,这时需要在程序中抛出异常并进行处理。有时自带的异常类并不能满足我们的需求,我们需要自定义异常类来处理一些特殊情况。 自定义异常类的定义方式 我们可以通过编写一个类来定义自己的异常,一般继承自E…

    Java 2023年5月27日
    00
  • Spring,hibernate,struts经典面试笔试题(含答案)

    Spring, Hibernate, Struts 经典面试笔试题攻略 Spring、Hibernate、Struts 是 Java Web 开发中常用的三个框架,也是面试中经常被问到的知识点。本文将介绍一些常见的面试笔试题,并提供详细的解答和示例说明。 Spring 面试笔试题 1. 什么是 Spring? Spring 是一个开源的轻量级 Java 开发…

    Java 2023年5月18日
    00
  • IDEA2020.1.2创建web项目配置Tomcat的详细教程

    下面给您讲解详细的“IDEA2020.1.2创建web项目配置Tomcat的详细教程”攻略。 步骤一:安装Tomcat 在安装Tomcat之前,必须先确认JDK是否安装成功,因为Tomcat是依赖于JDK的,若JDK未安装则需要先安装JDK。可在官网上下载Tomcat安装包,解压到指定目录即可。 步骤二:创建WEB项目 1.打开Intellij IDEA,选…

    Java 2023年6月16日
    00
  • 详解Spring极速集成注解redis实录

    详解Spring极速集成注解redis实录 前言 本文主要介绍Spring如何快速集成redis并使用注解方式进行操作。本教程需要你具备基本的Spring MVC框架的了解和redis的使用知识。 正文 一、引入redis依赖 在Spring项目中引入下面的redis依赖: <dependency> <groupId>org.spri…

    Java 2023年6月3日
    00
  • java 处理常量字符串过长 & springboot 项目读取 resouces 文件夹下的文件内容

    长字符串起因 项目里面有一长串的加密字符串(最长的万多个字符),需要拼接作为参数发送给第三方。 如果我们使用 枚举 定义的话,idea 编译的时候就会出现编译报错 Error: java:常量字符串过长 解决想法 网上还有一个说法,说是编译器问题,修改 idea 工具的编译为 eclipse 即可。 但是结果我仍然不满意,所以我决定把他放在文件中,然后需要的…

    Java 2023年4月18日
    00
  • 学java得这样学,学习确实也得这样

    学习Java需要掌握必要的基础知识,同时要注重实践,不断尝试实现具体的代码,以下是学习Java的完整攻略: 基础知识 语言基础 一门编程语言的语言基础,即语法结构和语言特性是学习该语言的基础,Java也不例外。 Java编程语言语言基础包括变量、运算符、控制语句等,学习者需要先掌握语言基础部分,方能打好基础,后续的代码实现才能更加顺利。 面向对象 Java是…

    Java 2023年6月15日
    00
合作推广
合作推广
分享本页
返回顶部