JSTL 基础详解

1.JSTL简介
    > JSP2.0以后,不再推荐在页面中使用脚本片段和表达式
    > 使用EL表达式去替换JSP表达式
    > 使用标签来替换脚本片段
    > 所谓的标签就是指以标签的形式去调用Java代码。
    > JSTL是JSP的标准标签库
    > JSTL的标准由sun公司定义,而由Apache公司实现
    > 我们如果想在项目中使用JSTL,需要导入两个jar包:
        taglibs-standard-impl-1.2.1.jar
        taglibs-standard-spec-1.2.1.jar
    > JSTL为我们提供了一些常用的标签,供我们日常开发使用(if 、 if...else 、遍历 、 日期格式化)

2.标签库
     > core :核心标签库
       核心标签库是JSTL中使用的最多的标签库,它为我们提供如if if else 遍历等等一些常用标签 ,核心标签库我们也称为c标签 .
     > fn :  函数标签库
       函数标签库里定义了一些字符串相关的操作,函数标签库需要结合EL表达式一起使用。
     > fmt : 国际化/格式化标签库
      fmt主要主要用来语言、日期、数字等内容的国际化操作。
     > sql : 数据库标签库
      用来在JSP中操作数据库,执行增删改查的操作(已淘汰)
     > xml : xml标签库
      用来在JSP中解析xml文档的(已淘汰)

3.JSTL的使用:
(1) 先使用taglib指令导入要使用的标签库
     <%@ taglib uri="http://java.sun.com/jsp/jstl/core" prefix="c" %>
     taglib指令需要两个属性:
    uri:标签库的唯一标识,通过uri来导入指定的标签库
    prefix: 标签的前缀,通过前缀去使用标签
(2) 使用标签
     <prefix:标签名></prefix:标签名>

4. JSTL原理:       
     实际上JSTL中标签最终都会转换为一段Java代码
     每个JSTL中的标签实际上都对应着一个Java类,我们在使用标签时,实际上就是去调用的这个类的方法。
     JSTL中有一个xml配置文件,专门来映射标签和标签处理器类之间关系
     每一个标签库都有一个tld文件为其映射,标签的前缀,uri地址,标签名,标签的属性都是在tld文件中进行映射.

5.核心标签库
     核心标签库也叫c标签,是JSTL中最常用的标签库,它里面定义了if else forEach等等这些标签。
     使用方式:<%@ taglib uri="http://java.sun.com/jsp/jstl/core" prefix="c" %>
<%@ page language="java" contentType="text/html; charset=UTF-8"
    pageEncoding="UTF-8"%>
<%--使用taglib将标签库引入到jsp页面中
    uri是标签库的唯一标识,作用相当于java中的全类名
 --%>   
<%@ taglib uri="http://java.sun.com/jsp/jstl/core" prefix="c" %>
<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
<title>Insert title here</title>
</head>
<body>

    <%
        request.setAttribute("name", "唐僧");
        request.setAttribute("hello", "哈喽");
        request.setAttribute("code", "<script>alert('hello')</script>");
    %>

    <%--out标签用来将一个属性在页面中输出 --%>
    <%--value 用来指定要输出的内容,可以是一个EL表达式
        default 可以指定一个默认值,当value值不存在时,将显示默认值
    --%>
    <c:out value="${hello }" default="该值为空"></c:out>

    <hr />

    <%-- ${code} --%>
    <%--escapeXml:表示是否自动转义特殊字符,需要一个布尔值,默认值是true自动转义 --%>
    <c:out value="${code}" escapeXml="true"></c:out>

    <hr />

    <%-- set标签用于向域中设置一个属性
            var 指定一个属性名
            value 指定一个属性值
            默认是将属性设置进page域中
            scope 指定要向哪个域中添加属性page request session application   
     --%>
    <c:set var="age" value="沙和尚" scope="application"></c:set>
    ${sessionScope.age }

    <hr />
    <%--remove用于从域中移除一个属性
        var用来指定要移除的属性名
        默认会移除所有域中的指定属性
        通过scope属性来指定要移除属性的域page request session application   
     --%>
    <c:remove var="age" scope="application"/>
    ${applicationScope.age }

</body>
</html>

6.函数标签库
     导入函数标签库:<%@ taglib uri="http://java.sun.com/jsp/jstl/functions" prefix="fn" %> 
     函数标签库需要结合EL表达式一起使用。
<%@ page language="java" contentType="text/html; charset=UTF-8"
    pageEncoding="UTF-8"%>
<%@ taglib uri="http://java.sun.com/jsp/jstl/functions" prefix="fn" %>   
<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
<title>Insert title here</title>
</head>
<body>
    <%
        String[] strs = {"a","b","c","d"};
        //将strs放入到域中
        pageContext.setAttribute("strs", strs);
    %>

    <!-- contains用来判断一个字符串中是否包含另一个 -->
    fn:contains : ${fn:contains("hello","He") }    <br />

    <!-- 判断一个字符串中是否包含另一个并忽略大小写 -->
    fn:containsIgnoreCase : ${fn:containsIgnoreCase("hello","He") }<br />

    <!-- 转义特殊字符 -->
    ${fn:escapeXml("<script></script>") }<br />

    <!-- join用于将一个字符数组转换为一个字符串 -->
    ${fn:join(strs,",") }<br />

    <!-- 将一个字符串拆根据指定字符串分为一个字符串数组 -->
    ${fn:split("a,b,c,d",",")[2] }<br />

    <!-- 将字母转换为小写 -->
    ${fn:toLowerCase("ABCD") }<br />

</body>
</html>

7.基础练习
     例题1:if  choose
<%@ page language="java" contentType="text/html; charset=UTF-8"
    pageEncoding="UTF-8"%>
<%@taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core" %>   
<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
<title>Insert title here</title>
</head>
<body>

    <%--
        if标签和Java中的if功能类似
        if标签需要一个test属性,test属性需要一个布尔值,可以接收一个EL表达式
        如果test的值为true,则标签体中的内容会执行
        如果test的值为false,则标签体中的内容不会执行
     --%>
    <c:if test="${empty param.username }">
        <h3>请求输入一个用户名!</h3>
    </c:if>
    <c:if test="${!empty param.username }">
        <h3>谁让你输入用户名的!</h3>
    </c:if>

    <hr />

    <%--choose标签的作用和Java中的if else类似 --%>
    <%--choose标签中可以有when子标签,它的用法和if标签一致 --%>
    <%--choose标签中可以有otherwise标签,它的作用和else一样,当所有的when标签都没执行时,则otherwise执行 --%>
    <%--在一个choose标签可以写多个when标签,但是只会有一个执行,当一个满足条件以后,其余将不再判断
        choose标签只能有一个otherwise也可以没有
        when和otherwise必须做完choose标签的子标签使用
    --%>

    <c:choose>
        <c:when test="${param.score == 100 }">
            <h3>恭喜您,考了100分!</h3>
        </c:when>
        <c:when test="${param.score >= 90 }">
            <h3>你的分数是A级!</h3>
        </c:when>
        <c:when test="${param.score >= 80 }">
            <h3>你的分数是B级!</h3>
        </c:when>
        <c:when test="${param.score >= 70 }">
            <h3>你的分数是C级!</h3>
        </c:when>
        <c:when test="${param.score >= 60 }">
            <h3>你的分数是D级!</h3>
        </c:when>
        <c:otherwise>
            <h3>恭喜您,不及格!</h3>
        </c:otherwise>
     </c:choose>

</body>
</html>
     例题2:forEatch
<%@page import="java.util.HashMap"%>
<%@page import="java.util.Map"%>
<%@page import="java.util.ArrayList"%>
<%@page import="java.util.List"%>
<%@ page language="java" contentType="text/html; charset=UTF-8"
    pageEncoding="UTF-8"%>
<%@ taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core" %>   
<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
<title>Insert title here</title>
</head>
<body>

    <%--forEach标签可以实现一些for循环的功能 --%>
    <%--1.用来遍历一组数
            begin:表示遍历开始的位置,最小值是0,不能小于0
            end:表示遍历结束的位置
            for(int i=1 ; i<=10 ; i++)
            var:指定的一个变量的名字
            step:指定是遍历时的步长,每次自增的大小
            forEach会执行多次,需要遍历几个数就执行几次
            每次执行时,都会将当前遍历到的数,以var指定的名字,放入到域对象中
     --%>
    <c:forEach begin="1" end="10" step="1" var="index">
        <a href="#">${index }</a>
    </c:forEach>

    <hr />

    <%--遍历一个集合 --%>
    <%
        //创建一个List
        List<String> list = new ArrayList<String>();
        //向list添加数据
        list.add("刘备");
        list.add("关羽");
        list.add("张飞");
        list.add("赵云");
        //将list放入到域中
        pageContext.setAttribute("list", list);
    %>

    <hr />

    <%--items:要遍历的集合,一般会使用EL表达式 --%>
    <%--var:需要指定一个变量的名字 --%>
    <%--遍历集合时,集合中有几个元素,则标签体就会执行几次,每次执行时都会讲集合中一个元素放入到page域中,使用var指定的属性名
        for(String hero : list)
        varStatus可以用来获取元素遍历的状态,我们可以为该属性指定一个名字
        然后可以通过EL表达式获取到表示遍历状态的对象
        last:判断当前元素是否是最后一个
        first:判断当前元素是否是第一个
        index:获取当前遍历元素的索引
        count:获取当前遍历元素的次序
     --%>
     <c:forEach items="${list}" var="hero">
        ${hero}
    </c:forEach>
    <c:forEach items="${list}" var="hero" varStatus="vs">
        ${vs.last } -- ${vs.first } -- ${vs.count } -- ${vs.index } -- ${hero } <br />
    </c:forEach>

    <hr />

    <%
        //创建一个Map
        Map<String,String> map = new HashMap<String,String>();
        //向map中添加数据
        map.put("name", "孙悟空");
        map.put("age", "18");
        map.put("address", "花果山");
        //将map放入到域中
        pageContext.setAttribute("map", map);
    %>
    <%--遍历map时,读取的是map中的键值对结构,我们可以通过对象.key获取键,对象.value获取值 --%>
    <c:forEach items="${map}" var="user">
        ${user.key } -- ${user.value } <br />
    </c:forEach>

</body>
</html>
     例题3:url
<%@ page language="java" contentType="text/html; charset=UTF-8"
    pageEncoding="UTF-8"%>
<%@ taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core" %>   
<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
<title>Insert title here</title>
</head>
<body>

    <!-- url可以自动为绝对路径加上项目名 -->
    <c:url value="/index.jsp"></c:url>
    <a href='<c:url value="/index.jsp"></c:url>'>去主页</a>

    <hr />
    <!-- var属性可以指定一个变量的名字,如果指定了var,则url地址不会直接在页面中输出 -->
    <!-- 而是以一个属性的方式,保存到域对象中,我们可以额通过EL表达式来获取 -->
    <!-- 还可以使用param标签在地址中附加请求参数,可以自动对中文参数进行URL编码-->
    <c:url value="/if.jsp" var="url">
        <c:param name="username" value="sunwukong"></c:param>
        <c:param name="age" value="18"></c:param>
        <c:param name="teacher" value="唐僧"></c:param>
    </c:url>

    ${url }

    <hr />

    <!-- redirect用于请求的重定向,url指定重定向的地址 -->
    <!-- 它会自动为绝对路径加上项目名,所以这里就不用加了 -->
    <c:redirect url="/forEach.jsp">
        <c:param name="username" value="sunwukong"></c:param>
        <c:param name="age" value="18"></c:param>
        <c:param name="teacher" value="唐僧"></c:param>
    </c:redirect>

</body>
</html>

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

程序员学习圈

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值