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日

相关文章

  • Spring Web MVC和Hibernate的集成配置详解

    下面我将详细讲解“Spring Web MVC和Hibernate的集成配置详解”的完整攻略,具体过程如下: 第一步:创建Spring Web MVC和Hibernate项目 首先,我们需要在IDE中创建一个Spring Web MVC项目,然后再添加Hibernate框架的支持。这里以使用IntelliJ IDEA为例,具体步骤如下: 打开IntelliJ…

    Java 2023年6月15日
    00
  • 基于Java语言的递归运算例题详解

    针对“基于Java语言的递归运算例题详解”,我的建议如下: 一、什么是递归 在计算机科学中,递归是一种经常被用于解决问题的方法。简单来说,递归就是通过一个函数的不断调用自身来解决复杂问题的方法。 二、递归的基本原则 递归运算的基本原则有三个: 找到和确定基线条件:递归最基本的原则是将问题分解为基本的情况,然后解决这些情况。这个基本情况就是我们所说的基线条件。…

    Java 2023年5月26日
    00
  • 详解Java的Spring框架中bean的注入集合

    关于“详解Java的Spring框架中bean的注入集合”的攻略,我将会分为以下几个步骤来进行讲解: 什么是Spring框架中的bean? Spring中bean的注入集合方式有哪些? 集合注入的使用示例。 下面我们将进入详细讲解的部分: 1. 什么是Spring框架中的bean? Spring框架是目前广泛使用的Java企业应用开发框架,其中的bean指S…

    Java 2023年5月19日
    00
  • Spring实现文件上传(示例代码)

    添加依赖 进行文件上传需要添加相关依赖,包括spring-webmvc、spring-context和commons-fileupload。 <dependency> <groupId>org.springframework</groupId> <artifactId>spring-webmvc</art…

    Java 2023年6月15日
    00
  • Spring启动过程源码分析及简介

    下面是对于“Spring启动过程源码分析及简介”的完整攻略。 1. 概述 Spring是一个流行的基于Java的开源框架,其设计目标是为了提供一个全面的基础设施,使得开发人员可以快速构建企业级应用。Spring启动过程源码分析及简介是一个非常重要的主题,它可以帮助我们更好的理解Spring框架,并在实际应用中更好地使用。 2. Spring启动过程源码分析 …

    Java 2023年5月31日
    00
  • jsp页面使用${}不起作用的解决方法

    当jsp页面中使用${}时,如果无法起作用,通常有以下几个解决方案: 1. 检查EL表达式是否正确 ${}是jsp页面中EL表达式的语法,用于在jsp页面中展示数据。如果${}不起作用,首先需要检查表达式是否正确。正确的表达式应该是以${ }开头和结尾,中间包含一个变量。例如:${variable}。 如果表达式正确,但仍然无法展示数据,那就需要检查下一个解…

    Java 2023年6月15日
    00
  • 基于java实现DFA算法代码实例

    关于“基于java实现DFA算法代码实例”的攻略,我会按照以下流程进行讲解: 1.了解DFA算法2.选择适合的编程环境3.编写DFA代码4.测试DFA代码 首先,我们来了解一下DFA算法(确定有限状态自动机算法)的概念和原理。DFA算法主要应用于文本匹配、编译器词法分析等方面。它是一种状态转移图的形式,其中有一个起始状态和若干个终止状态,通过状态转移,将一个…

    Java 2023年5月19日
    00
  • Android监听事件

    监听事件 ​ 监听事件机制由事件源,事件和事件监听器三类对象组成,事件源一般就是activity中的UI控件。 下面引用别人整理的图来更加形象的表达这些关系。 ​ 事件监听机制的意义就是让事件源的行为委托给事件监听器,让监听器控制事件的发生。 ​ 1.实现监听事件的方法 通过内部类实现 通过匿名内部类实现(大部分都是这样用) 通过事件源所在类实现 也可以直接…

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