JSP学习笔记(十)jstl标签库

一、相关概述

JSTL(JavaServer Pages Standard Tag Library),JSP标准标签库,是一组JSP自定义标签。这些标签原本由第三方开发实现,由于效果质量非常好,sun公司就把这些标签作为标准标签打包成库并加以推广

二、分类

JSTL按照标签功能分为多个库,主要有:
在这里插入图片描述

核心标签库

主要包含<c:out>、<c:if>、<c:forEach>标签,要想在JSP页面中使用这些标签,需要使用<%@ taglib >指令引入核心标签库的配置文件
<%@ taglib uri="http://java.sun.com/jsp/jstl/core" prefix="c" %>

<c:out>
先把EL表达式计算结果中的特殊字符比如<、& 转换为对应的实体字符,再输出到HTML格式的响应中

<c:out value="${ '<hello>' }" ></c:out>

<c:if>
相当于Java中的if语句,当EL表达式的值为true时,就会执行其标签体内容,也就是说会把标签体内容加入到HTML格式的响应中。如果为false,就会跳过标签体内容

<c:if test="${ param.age<18 }">
    
</c:if>

<c:forEach>
可以实现普通for循环和增强for循环两种效果
普通:

<c:forEach var="i" begin="0" step="1" end="5">
    <c:out value="${ i }"></c:out> <br/>
</c:forEach>

增强型for循环:

<c:forEach items="${ requestScope.userList }" var="user">
    <c:out value="${ user.name }"></c:out> <br/>
</c:forEach>

格式化标签库

提供了fmt:formatDate标签用来在JSP页面中把Date对象转换为指定格式的字符串,并输出到HTML格式的响应中

函数库

函数库中提供了很多可以在EL表达式中使用的函数,其实就是一些静态方法,绝大部分都是操作字符串的,比如fn:length、fn:contains、fn:toLowerCase、fn:toUpperCase、fn:trim、fn:split、fn:join、fn:indexOf、fn:replace、fn:startsWith、fn:endWith、fn:substring

${ fn:length('hello') }
${ fn:contains('hello','el') }

定义自己的自定义标签

定义并使用自己的标签分为三个步骤:
1 编写自定义标签类
2 在.tld文件中标签类
3 在JSP页面中引入tld文件后便可使用自定义标签
下面以模仿<c:if test=””>为例说明

1 MyIfTag.java

`public class MyIfTag extends SimpleTagSupport {

    private Boolean test; //对应标签的test属性

    @Override
    public void doTag() throws JspException, IOException {
        if (test != null && test) {
            Writer writer = getJspContext().getOut();
            JspFragment tagBody = getJspBody();
            tagBody.invoke(writer);
        }
    }
    public Boolean getTest() {
        return test;
    }
    public void setTest(Boolean test) {
        this.test = test;
    }
}`

标签中需要用到到属性,需要对应标签类中的字段,并为字段提交get/set方法

如果标签中有default属性,由于default在Java中是关键字,可以使用_default变量名,并提供setDefault()方法给_default赋值

JspFragment表示标签体内容,标签体内容可能为空,也可能包含其他标签,也可能嵌入Java代码,其invoke(writer)方法会执行标签体内容,并使用指定writer把执行结果输出到响应中

这里并没有出现前面说的doStartTag()方法,原因是doStartTag()属于早期标签类实现方式,有些复杂。这里使用的是简易的实现方式,即继承SimpleTagSupport

2 mytag.tld

<?xml version="1.0" encoding="UTF-8" ?>
<taglib xmlns="http://java.sun.com/xml/ns/javaee"
    xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
    xsi:schemaLocation="http://java.sun.com/xml/ns/javaee http://java.sun.com/xml/ns/javaee/web-jsptaglibrary_2_1.xsd"
    version="2.1">
    
    <tlib-version>1</tlib-version>   <!-- 标签库内部版本号 -->
    <short-name>my</short-name>   <!-- 建议前缀 -->
    <uri>/my-tag</uri>   <!-- 标签库uri -->
    
    <tag>   <!-- 用来定义标签 -->
        <name>if</name>   <!-- 标签名称 -->   
        <tag-class>com.rupeng.web.tag.MyIfTag</tag-class>   <!-- 标签类 -->
        <body-content>scriptless</body-content>   <!-- 表示标签体中不可嵌入Java代码 -->
        <attribute>   <!-- 用来定义标签属性 -->
            <name>test</name>   <!-- 属性名称 -->
            <required>true</required>   <!-- 属性是否必须 -->
            <rtexprvalue>true</rtexprvalue>   <!-- 属性是否支持EL表达式 -->
        </attribute>
    </tag>
</taglib>

3 JSP页面中

<%@ page language="java" contentType="text/html; charset=UTF-8" pageEncoding="UTF-8" %>
<%@ taglib uri="/my-tag" prefix="my" %>
<!DOCTYPE html>
<html>
    <head>
        <meta charset="UTF-8">
        <title>自定义标签</title>
    </head>
    <body>
        <my:if test="${ param.age<18 }"></my:if>
    </body>
</html>
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值