01.JSTL标签库

1. JSTL

  • 描述:JSP Standard Tag Library,JSP标准标签库
  • 作用
    • 提供给Java Web开发人员一个标准通用的标签函数库
    • 取代传统直接在页面嵌入Java代码,以提高程序可读性、维护性和方便性
  • 依赖:
    • standard.jar
    • jstl.jar
  • 引入:
<%@ taglib prefix=*"c"* uri=*"http://java.sun.com/jsp/jstl/core" %>

2. out标签

2.1 用法

  • 作用:取值
  • 语法
<!-- 语法 -->
<c:out value="${requestScope.username}"/>

<!-- 参数 -->
value:要输出的值
default:默认值(value指定的值找不到就输出默认值)
escapeXml:是否进行转义,默认为true转义

2.2 实例

<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<%-- 引入JSTL标签库 --%>
<%@ taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core" %>
<html>
  <head>
      <title>测试</title>
      <meta http-equiv="Content-Type" content="text/html;charset=utf-8"/>
      <meta name="author" content="周威"/>
  </head>
  <body>
    <%-- 通过页面嵌套Java代码向request域中存入一个username变量 --%>
    <%
      request.setAttribute("username", "张三");
    %>
    <%-- 通过JSTL的out标签从request域中取出username变量的值 --%>
    <c:out value="${requestScope.username}"/>
  </body>
</html>

在这里插入图片描述

3. set标签

3.1 用法

  • 作用:存值
  • 语法
<!-- 语法 -->
<c:set var="password" value="123456" scope="request"/>

<!-- 参数 -->
var:变量标识
value:变量值
scope:指定变量存入的域

3.2 实例

<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<%-- 引入JSTL标签库 --%>
<%@ taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core" %>
<html>
  <head>
      <title>测试</title>
      <meta http-equiv="Content-Type" content="text/html;charset=utf-8"/>
      <meta name="author" content="周威"/>
  </head>
  <body>
    <%-- 通过JSTL的set标签向request域中存入一个username变量 --%>
    <c:set var="username" value="张三" scope="request"/>
    <%-- 通过JSTL的out标签从request域中取出username变量的值 --%>
    <c:out value="${requestScope.username}"/>
  </body>
</html>

在这里插入图片描述

4. if标签

4.1 用法

  • 作用:进行判断
  • 语法
<!-- 语法 -->
<c:if test="${requestScope.username eq 'baby'}">
    执行块
</c:if>

<!-- 参数 -->
test:判断条件

4.2 实例

<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<%-- 引入JSTL标签库 --%>
<%@ taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core" %>
<html>
  <head>
      <title>测试</title>
      <meta http-equiv="Content-Type" content="text/html;charset=utf-8"/>
      <meta name="author" content="周威"/>
  </head>
  <body>
    <%-- 通过JSTL的set标签向request域中存入一个status变量 --%>
    <c:set var="status" value="true" scope="request"/>
    <%-- 通过JSTL的if标签从request域中取出status变量的值进行判断 --%>
    <c:if test="${requestScope.status}">
      Hello World
    </c:if>
  </body>
</html>

在这里插入图片描述

5. choose标签

5.1 用法

  • 作用:多重判断
  • 语法
<!-- 语法 -->
<c:choose>
	<c:when test="判断条件1">
        执行块1
    </c:when>
    <c:when test="判断条件2">
        执行块2
    </c:when>
    <c:when test="判断条件3">
        执行块3
    </c:when>
    <c:otherwise>
    	执行块n
    </c:otherwise>
</c:choose>

<!-- 参数 -->
test:判断条件

如果所有的when都不满足就执行otherwise块类似java中的多重if...else结构
if(判断条件1)
{
	执行块1
}
else if(判断条件2)
{
	执行块2
}
else if(判断条件3)
{
	执行块3
}
else
{
	执行块n
}

5.2 实例

<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<%-- 引入JSTL标签库 --%>
<%@ taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core" %>
<html>
  <head>
      <title>测试</title>
      <meta http-equiv="Content-Type" content="text/html;charset=utf-8"/>
      <meta name="author" content="周威"/>
  </head>
  <body>
    <%-- 通过JSTL的set标签向request域中存入一个age变量 --%>
    <c:set var="age" value="50" scope="request"/>
    <%-- 通过JSTL的choose标签从request域中取出age变量的值进行判断 --%>
    <c:choose>
      <c:when test="${requestScope.age > 0 and requestScope.age < 18 }">
        未成年
      </c:when>
      <c:when test="${requestScope.age < 25}">
        年轻人
      </c:when>
      <c:when test="${requestScope.age < 40}">
        中年人
      </c:when>
      <c:when test="${requestScope.age < 120}">
        老年人
      </c:when>
      <c:otherwise>
        这个超出了年龄范围
      </c:otherwise>
    </c:choose>
  </body>
</html>

在这里插入图片描述

6. forEach标签

6.1 用法

  • 作用:进行循环
  • 用法一
<!-- 语法 -->
<c:forEach var="user" items="${requestScope.users}">
    循环体
</c:forEach>

<!-- 类比 -->
for(User user : users)
{
	循环体
}

<!-- 参数 -->
var:每次遍历得到的变量
items:指定需要遍历的集合
  • 用法二
<!-- 语法 -->
<c:forEach begin="0" end="10" step="1" var="index" items="requestScope.array">
	循环体
</c:forEach>

<!-- 类比 -->
for(int i = 0;i < 10;i++)
{
      循环体                               
}

<!-- 参数 -->
begin:起始索引
end:结束索引
step:步长
var:每次遍历得到的变量
items:指定需要遍历的集合

6.2 普通for循环

<%@ page import="java.util.*" %>
<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<%-- 引入JSTL标签库 --%>
<%@ taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core" %>
<html>
  <head>
      <title>测试</title>
      <meta http-equiv="Content-Type" content="text/html;charset=utf-8"/>
      <meta name="author" content="周威"/>
  </head>
  <body>
    <%-- 通过嵌套Java代码向request域中存入一个List集合 --%>
    <%
      List<Integer> list = new ArrayList<Integer>();
      for(int index=0;index < 10;index++)
        list.add(index);
      request.setAttribute("list", list);
    %>
    <%-- 通过JSTL的forEach标签对集合进行普通for循环遍历 --%>
    <c:forEach var="index" items="${requestScope.list}" begin="0" end="${requestScope.list.size()}" step="2">
      ${index}<br/>
    </c:forEach>
  </body>
</html>

在这里插入图片描述

6.3 增强for循环

<%@ page import="java.util.*" %>
<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<%-- 引入JSTL标签库 --%>
<%@ taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core" %>
<html>
  <head>
      <title>测试</title>
      <meta http-equiv="Content-Type" content="text/html;charset=utf-8"/>
      <meta name="author" content="周威"/>
  </head>
  <body>
    <%-- 通过嵌套Java代码向request域中存入一个List集合 --%>
    <%
      List<Integer> list = new ArrayList<Integer>();
      for(int index=0;index < 10;index++)
        list.add(index);
      request.setAttribute("list", list);
    %>
    <%-- 通过JSTL的forEach标签对集合进行增强for循环遍历 --%>
    <c:forEach var="index" items="${requestScope.list}">
      ${index}<br/>
    </c:forEach>
  </body>
</html>

在这里插入图片描述

6.4 遍历map

<%@ page import="java.util.*" %>
<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<%-- 引入JSTL标签库 --%>
<%@ taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core" %>
<html>
  <head>
      <title>测试</title>
      <meta http-equiv="Content-Type" content="text/html;charset=utf-8"/>
      <meta name="author" content="周威"/>
  </head>
  <body>
    <%-- 通过嵌套Java代码向request域中存入一个Map集合 --%>
    <%
      Map<Integer, String> map = new HashMap<Integer, String>();
      map.put(1, "Tom");
      map.put(2, "Angle");
      map.put(3, "Baby");
      request.setAttribute("map", map);
    %>
    <%-- 通过JSTL的forEach标签对Map集合进行增强for循环遍历 --%>
    <c:forEach var="entry" items="${requestScope.map}">
      <p>${entry.key}-----${entry.value}</p>
    </c:forEach>
  </body>
</html>

在这里插入图片描述

7. EL函数库

7.1 用法

  • 描述:JSTL标签库提供了一些操作字符相关的函数,通过它我们可以对字符串进行一些简单处理
  • 引入:
<%-- 引入JSTL对EL表达式操作字符串的函数库 --%>
<%@ taglib prefix="fn" uri="http://java.sun.com/jsp/jstl/functions" %>
  • 语法
# 操作字符串
${fn:函数名(参数列表)}

7.2 实例

<%@ page import="java.util.*" %>
<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<%-- 引入JSTL标签库 --%>
<%@ taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core" %>
<%-- 引入JSTL对EL表达式操作字符串的函数库 --%>
<%@ taglib prefix="fn" uri="http://java.sun.com/jsp/jstl/functions" %>
<html>
  <head>
      <title>测试</title>
      <meta http-equiv="Content-Type" content="text/html;charset=utf-8"/>
      <meta name="author" content="周威"/>
  </head>
  <body>
    <%-- 通过页面嵌套Java代码向request域中存入一个content字符串变量 --%>
    <%
      String content = "abcdefg";
      request.setAttribute("content", content);
    %>
    <c:set var="content" value="abcdefg" scope="request"/>
    <%-- 通过JSTL的EL函数库对字符串进行小写转大写 --%>
    ${fn:toUpperCase(requestScope.content)}
  </body>
</html>

在这里插入图片描述

8. 日期格式化

8.1 用法

  • 描述:STL标签库提供了一些操作日期相关的标签,通过它我们可以日期进行一些简单处理
  • 引入
<%-- 引入JSTL对日期操作标签库 --%>
<%@ taglib prefix="fmt" uri="http://java.sun.com/jsp/jstl/fmt" %>
  • 语法
# 操作日期
<fmt:formatDate value="${requestScope.date}" pattern="yyyy-MM-dd HH:mm:ss"/>

8.2 实例

<%@ page import="java.util.*" %>
<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<%-- 引入JSTL标签库 --%>
<%@ taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core" %>
<%-- 引入JSTL对EL表达式操作日期的函数库 --%>
<%@ taglib prefix="fmt" uri="http://java.sun.com/jsp/jstl/fmt" %>
<%@ taglib prefix="fn" uri="http://java.sun.com/jsp/jstl/functions" %>
<html>
  <head>
      <title>测试</title>
      <meta http-equiv="Content-Type" content="text/html;charset=utf-8"/>
      <meta name="author" content="周威"/>
  </head>
  <body>
    <%-- 通过页面嵌套Java代码向request域中存入一个date日期变量 --%>
    <%
      Date date = new Date();
      request.setAttribute("date", date);
    %>
    <%-- 通过JSTL的EL函数库对日期进行格式化 --%>
    <fmt:formatDate value="${requestScope.date}" pattern="yyyy-MM-dd HH:mm:ss" />
  </body>
</html>

在这里插入图片描述

9. 自定义EL函数

  • 步骤:
    • (1)编写一个Java类,提供一个方法,该方法必须是静态方法,必须有返回值
    • (2)在WEB-INF目录下编写一个以.tld结尾的文件进行函数配置
    • (3)在JSP页面引入自己编写的EL函数库
    • (4)使用自定义的EL函数

9.1 El.java

package zw.demo.el;

/**
 * @ClassName El
 * @Description 自定EL函数类
 * @Author 周威
 * @Date 2020-07-15 - 21:41
 */
public class El
{
    public static String sayHello(String name)
    {
        return "Hello " + name;
    }
}

9.2 el.tld

<?xml version="1.0" encoding="UTF-8"?>
<taglib
        xmlns="http://java.sun.com/xml/ns/j2ee"
        xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
        xsi:schemaLocation="http://java.sun.com/xml/ns/j2ee http://java.sun.com/xml/ns/j2ee/web-jsptaglibrary_2_0.xsd"
        version="2.0">

    <!-- 指定版本信息 -->
    <tlib-version>1.0</tlib-version>
    <!-- 指定函数前缀 -->
    <short-name>zw</short-name>
    <!-- 指定函数地址 -->
    <uri>http://zw.jstl.el</uri>

    <function>
        <!-- 指定函数名,对应java类中的方法名 -->
        <name>sayHello</name>
        <!-- 指定方法所在的类路径 -->
        <function-class>zw.demo.el.El</function-class>
        <!-- 对方法进行描述,返回值类型 方法名 参数类型 -->
        <function-signature>java.lang.String sayHello(java.lang.String)</function-signature>
    </function>
</taglib>

9.3 index.jsp

<%@ page language="java" contentType="text/html;charset=utf-8" %>
<%-- 引入JSTL标签库 --%>
<%@ taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core" %>
<%-- 引入自定义EL函数库 --%>
<%@ taglib prefix="zw" uri="http://zw.jstl.el"%>
<html>
    <head>
        <title>测试</title>
        <meta http-equiv="Content-Type" content="text/html;charset=utf-8"/>
        <meta name="author" content="周威"/>
    </head>
    <body>
        <%-- 使用自定义EL函数 --%>
        ${zw:sayHello("tom")}
    </body>
</html>

9.4 运行结果

在这里插入图片描述

10. 自定义标签

  • 步骤
    • (1)编写一个Java类,继承SimpleTagSupport类,重写三个方法
    • (2)在WEB-INF目录下编写一个以.tld结尾的文件进行标签配置
    • (3)在JSP页面引入自己编写的标签库
    • (4)使用自己的标签

在这里插入图片描述

10.1 自定义不带主体的标签

10.1.1 Tag.java

package zw.demo.tag;

import javax.servlet.jsp.JspContext;
import javax.servlet.jsp.JspException;
import javax.servlet.jsp.JspWriter;
import javax.servlet.jsp.PageContext;
import javax.servlet.jsp.tagext.JspFragment;
import javax.servlet.jsp.tagext.SimpleTagSupport;
import java.io.IOException;

/**
 * @ClassName Tag
 * @Description 自定义标签类
 * @Author 周威
 * @Date 2020-07-15 - 22:00
 */
public class Tag extends SimpleTagSupport
{
    private PageContext pc;
    private JspFragment bd;

    @Override
    public void setJspContext(JspContext pc)
    {
        this.pc = (PageContext) pc;
    }

    @Override
    public void setJspBody(JspFragment bd)
    {
        this.bd = bd;
    }

    @Override
    public void doTag() throws JspException, IOException
    {
        JspWriter jw = pc.getOut();
        jw.write("Hello World");
    }
}

10.1.2 tag.tld

<?xml version="1.0" encoding="UTF-8"?>
<taglib
        xmlns="http://java.sun.com/xml/ns/j2ee"
        xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
        xsi:schemaLocation="http://java.sun.com/xml/ns/j2ee http://java.sun.com/xml/ns/j2ee/web-jsptaglibrary_2_0.xsd"
        version="2.0">
    <!-- 指定便签库版本 -->
    <tlib-version>1.0</tlib-version>
    <!-- 指定标签前缀 -->
    <short-name>zw</short-name>
    <!-- 指定标签库地址 -->
    <uri>http://zw.jstl.tag</uri>
    <tag>
        <!-- 指定标签名称 -->
        <name>out</name>
        <!-- 指定标签对应的类路径 -->
        <tag-class>zw.demo.tag.Tag</tag-class>
        <!-- 指定标签的输出内容 empty:标签主体不能有内容-->
        <body-content>empty</body-content>
    </tag>
</taglib>

10.1.3 index.jsp

<%@ page language="java" contentType="text/html;charset=utf-8" %>
<%-- 引入JSTL标签库 --%>
<%@ taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core" %>
<%-- 引入自定义标签库 --%>
<%@ taglib prefix="zw" uri="http://zw.jstl.tag"%>
<html>
    <head>
        <title>测试</title>
        <meta http-equiv="Content-Type" content="text/html;charset=utf-8"/>
        <meta name="author" content="周威"/>
    </head>
    <body>
        <%-- 使用自定义标签 --%>
        <zw:out/>
    </body>
</html>

10.1.4 运行结果

在这里插入图片描述

10.2 自定义带标签主体的标签

10.2.1 Tag.java

package zw.demo.tag;

import javax.servlet.jsp.JspContext;
import javax.servlet.jsp.JspException;
import javax.servlet.jsp.JspWriter;
import javax.servlet.jsp.PageContext;
import javax.servlet.jsp.tagext.JspFragment;
import javax.servlet.jsp.tagext.SimpleTagSupport;
import java.io.IOException;
import java.io.Writer;

/**
 * @ClassName Tag
 * @Description 自定义标签类
 * @Author 周威
 * @Date 2020-07-15 - 22:00
 */
public class Tag extends SimpleTagSupport
{
    private PageContext pc;
    private JspFragment bd;

    @Override
    public void setJspContext(JspContext pc)
    {
        this.pc = (PageContext) pc;
    }

    @Override
    public void setJspBody(JspFragment bd)
    {
        this.bd = bd;
    }

    @Override
    public void doTag() throws JspException, IOException
    {
        Writer writer = pc.getOut();
        bd.invoke(writer);
    }
}

10.2.2 tag.tld

<?xml version="1.0" encoding="UTF-8"?>
<taglib
        xmlns="http://java.sun.com/xml/ns/j2ee"
        xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
        xsi:schemaLocation="http://java.sun.com/xml/ns/j2ee http://java.sun.com/xml/ns/j2ee/web-jsptaglibrary_2_0.xsd"
        version="2.0">
    <!-- 指定便签库版本 -->
    <tlib-version>1.0</tlib-version>
    <!-- 指定标签前缀 -->
    <short-name>zw</short-name>
    <!-- 指定标签库地址 -->
    <uri>http://zw.jstl.tag</uri>
    <tag>
        <!-- 指定标签名称 -->
        <name>print</name>
        <!-- 指定标签对应的类路径 -->
        <tag-class>zw.demo.tag.Tag</tag-class>
        <!-- 指定标签的输出内容 scriptless:标签主体内容不能是Java代码,但可以是EL、JSTL等-->
        <body-content>scriptless</body-content>
    </tag>
</taglib>

10.2.3 index.jsp

<%@ page language="java" contentType="text/html;charset=utf-8" %>
<%-- 引入JSTL标签库 --%>
<%@ taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core" %>
<%-- 引入自定义标签库 --%>
<%@ taglib prefix="zw" uri="http://zw.jstl.tag"%>
<html>
    <head>
        <title>测试</title>
        <meta http-equiv="Content-Type" content="text/html;charset=utf-8"/>
        <meta name="author" content="周威"/>
    </head>
    <body>
        <%-- 使用自定义标签 --%>
        <zw:print>Hello World</zw:print>
    </body>
</html>

10.2.4 运行结果

在这里插入图片描述

10.3 自定义带标签属性的标签

10.3.1 Tag.java

package zw.demo.tag;

import javax.servlet.jsp.JspContext;
import javax.servlet.jsp.JspException;
import javax.servlet.jsp.JspWriter;
import javax.servlet.jsp.PageContext;
import javax.servlet.jsp.tagext.JspFragment;
import javax.servlet.jsp.tagext.SimpleTagSupport;
import java.io.IOException;

/**
 * @ClassName Tag
 * @Description 自定义标签类
 * @Author 周威
 * @Date 2020-07-15 - 22:00
 */
public class Tag extends SimpleTagSupport
{
    private PageContext pc;
    private JspFragment bd;

    //标签属性要添加set方法
    private boolean test;

    @Override
    public void setJspContext(JspContext pc)
    {
        this.pc = (PageContext) pc;
    }

    @Override
    public void setJspBody(JspFragment bd)
    {
        this.bd = bd;
    }

    @Override
    public void doTag() throws JspException, IOException
    {
        if(test)
            bd.invoke(pc.getOut());
    }

    public void setTest(boolean test)
    {
        this.test = test;
    }

}

10.3.2 tag.tld

<?xml version="1.0" encoding="UTF-8"?>
<taglib
        xmlns="http://java.sun.com/xml/ns/j2ee"
        xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
        xsi:schemaLocation="http://java.sun.com/xml/ns/j2ee http://java.sun.com/xml/ns/j2ee/web-jsptaglibrary_2_0.xsd"
        version="2.0">
    <!-- 指定便签库版本 -->
    <tlib-version>1.0</tlib-version>
    <!-- 指定标签前缀 -->
    <short-name>zw</short-name>
    <!-- 指定标签库地址 -->
    <uri>http://zw.jstl.tag</uri>
    <tag>
        <!-- 指定标签名称 -->
        <name>if</name>
        <!-- 指定标签对应的类路径 -->
        <tag-class>zw.demo.tag.Tag</tag-class>
        <!-- 指定标签的输出内容 scriptless:标签主体内容不能是Java代码,但可以是EL、JSTL等-->
        <body-content>scriptless</body-content>
        <!-- 配置标签属性 -->
        <attribute>
            <!-- 属性名称 -->
            <name>test</name>
            <!-- 是否必须有 -->
            <required>true</required>
            <!-- 是否支持EL -->
            <rtexprvalue>true</rtexprvalue>
            <!-- 属性类型 -->
            <type>java.lang.Boolean</type>
        </attribute>
    </tag>
</taglib>

10.3.3 index.jsp

<%@ page language="java" contentType="text/html;charset=utf-8" %>
<%-- 引入JSTL标签库 --%>
<%@ taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core" %>
<%-- 引入自定义标签库 --%>
<%@ taglib prefix="zw" uri="http://zw.jstl.tag"%>
<html>
    <head>
        <title>测试</title>
        <meta http-equiv="Content-Type" content="text/html;charset=utf-8"/>
        <meta name="author" content="周威"/>
    </head>
    <body>
        <%-- 通过嵌套java代码向request域中存入boolean类型status变量 --%>
        <%
            request.setAttribute("status", true);
        %>
        <%-- 使用自定义标签 --%>
        <zw:if test="${requestScope.status}">
            自定义if标签
        </zw:if>
    </body>
</html>

10.3.4 运行结果

在这里插入图片描述

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值