JSTL-核心标签库

在JSP页面中使用标签库代替传统Java片段语文来实现页面显示逻辑已经不是新技术了,但是自定义的标签容易造成重复定义和非标准的实现,所以JSTL(JSP Standard Tag Library,JSP标准标签库)诞生了。JSTL是一个不断完善的开放源代码的JSP标签库,是由apache的jakarta小组来维护的(标准是SUN制定,apache实现的,SUN收录了apache的实现)。JSTL只能运行在支持JSP1.2和Servlet2.3规范的容器上。

VersionJSTL versionRequirements
Standard 1.2.3JSTL 1.2Servlet 2.5, JavaServer Pages 2.1
Standard 1.1JSTL 1.1Servlet 2.4, JavaServer Pages 2.0
Standard 1.0JSTL 1.0Servlet 2.3, JavaServer Pages 1.2


Sun 发布的标准 JSTL1.1 标签库有以下几个标签:

  • 核心标签库:包含 Web 应用的常见工作,比如:循环、表达式赋值、基本输入输出等。
  • 格式化标签库:用来格式化显示数据的工作,比如:对不同区域的日期格式化等。
  • 数据库标签库:可以做访问数据库的工作。
  • XML 标签库:用来访问 XML 文件的工作,这是 JSTL 标签库的一个特点。
  • 函数标签库:用来读取已经定义的某个函数。

使用JSTL的步骤:

  • 在项目中引入jstl的相关jar包,确保jar存在:jstl.jar、standard。
<dependency>
    <groupId>javax.servlet</groupId>
    <artifactId>jstl</artifactId>
    <version>1.2</version>
</dependency>
<dependency>
    <groupId>taglibs</groupId>
    <artifactId>standard</artifactId>
    <version>1.1.2</version>
</dependency>
  • 在需要使用标签的JSP页面上使用taglib指令引入标签库。
  • 在需要使用标签的位置直接使用标签库。
核心标签:
<%@ page language="java" contentType="text/html; charset=UTF-8"
    pageEncoding="UTF-8"%>
<%@ page import="java.util.*"%>
<%@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>JSTL_CORE</title>
</head>
<body>

<%
    Emp e1 = new Emp();
    e1.setEmpno("222");
    e1.setEname("KING");

    Emp e2 = new Emp();
    e2.setEmpno("333");

    pageContext.setAttribute("e1",e1);
    pageContext.setAttribute("e2",e2);

    List<Emp> empList = new ArrayList<Emp>();
    empList.add(e1);
    empList.add(e2);
    request.setAttribute("empList",empList);
%>

<!-- ****显示数据【c:out】****
    value="要显示的内容,必填项"
    default="value为null时要输出的默认值,默认为主体内容"
    escapeXml="是否忽略XML特殊字符,默认为true"
 -->
<c:out value="<test/>"/><c:out value="<test/>" escapeXml="false"/> <!-- 这里会把<test/>当标签处理 --><c:out value="${e1.ename }"/><c:out value="${e2.ename }" default="无名氏"/>
<!-- 输出:
<test/> 、 、 KING 、 无名氏  
-->

<hr>
<!-- ****保存数据【c:set】****
    var="存储信息的变更"
    value="要存储的值,默认为标签中的内容"
    target="要修改的属性所属对象"
    property="要修改的属性"
    scope="var属性的作用域(page request session application),默认为page"
    如果指定了target属性,那么property属性也需要被指定,target和scope不能同时使用
 -->
<c:set var="e1" value="${e1}" scope="application"/>
${pageScope.e1 }   
、
${applicationScope.e1}
<br>
<c:set target="${e1}" property="ename" value="Donna"/>
${pageScope.e1 }   
、
${applicationScope.e1}
<!-- 输出:
Emp [empno=222, ename=KING] 、 Emp [empno=222, ename=KING]
Emp [empno=222, ename=Donna] 、 Emp [empno=222, ename=Donna]  
-->

<hr>
<!-- ****删除数据【c:remove】****
    var="要删除的变量名称,必填项"
    scope="变量所属的作用域,默认为所有作用域"
 -->
<c:set var="e1" value="${e1}" scope="session"/>
${sessionScope.e1.ename }
、
<c:remove var="e1" scope="session"/>
${sessionScope.e1.ename }
、
${pageScope.e1.ename } 
、
${applicationScope.e1.ename }
<!-- 输出:
Donna 、 、 Donna 、 Donna 
-->

<hr>
<!-- ****异常处理【c:catch】****
    var="保存异常信息的变量名"
 -->
<c:catch var="exceptionMsg">
<%=5 / 0 %>
</c:catch>
${exceptionMsg }
<!-- 输出:
 java.lang.ArithmeticException: / by zero 
-->

<hr>
<!-- ****IF判断【c:if】****
    test="条件表达式,必填项"
    var="存储结果的变量"
    scope="var属性的作用域(page request session application),默认为page"
 -->
<c:if test="${1 < 2 }" var="t1">
    1 < 2 = ${pageScope.t1 }、
</c:if>
<c:if test="${empty e2.ename }">
    请提供用户名、
</c:if>
<c:if test="${not empty e1.ename }">
    欢迎${e1.ename }、
</c:if>
<!-- 输出:
 1 < 2 = true、 请提供用户名、 欢迎Donna、 
-->

<hr>
<!-- ****模拟if..else if..else..【c:choose c:when c:otherwise】**** -->
<c:set var="salary" value="8000"/>
<c:choose>
    <c:when test="${salary <= 5000 }">
        日子怎么过
    </c:when>
    <c:when test="${salary < 10000 }">
        日子照样过
    </c:when>
    <c:when test="${salary < 20000 }">
        日子还不错
    </c:when>
    <c:otherwise>
        不知道怎么过
    </c:otherwise>
</c:choose>
<!-- 输出:
日子照样过
-->

<hr>
<!-- ****检索一个URL对应的资源【c:import】****
    url="资源的url(绝对路径\相对路径),必填项"
    context="指定资源名字,默认为当前应用程序"
    charEncoding="引入资源的字符编码,默认为ISO-8859-1"
    var="用于存储文本的变量"
    scope="var属性的作用域(page request session application),默认为page"
    varReader="可选的用于提供java.io.Reader对象的变量"
 -->

<c:import var="baidu" url="https://www.baidu.com" charEncoding="utf-8"/>
<c:out value="${baidu}"/>
<!-- 输出:
会打印出百度首页的源代码
-->

<hr>
<!-- ****迭代集合【c:forEach】****
    items="要迭代的集合,必填项"
    begin="开始元素下标,默认为0"
    end="最后元素下标,默认为集合的长度"
    step="迭代步长,默认为1"
    var="当前条目名"
    varStatus="迭代状态变量名"
    varStatus的属性有:
        current 当前条目
        index   当前条目从0开始的迭代索引
        count   当前条目从1开始的迭代计数
        first   用来表明当前这轮迭代是否为第一次迭代的标志
        last    用来表明当前这轮迭代是否为最后一次迭代的标志
 -->
<c:forEach items="${empList}" var="emp" varStatus="empStatus">
    ${emp.empno}、${emp.ename}、
    ${empStatus.current}、${empStatus.index}、
    ${empStatus.count}、${empStatus.first}、${empStatus.last}
    <br/>
</c:forEach>
<!-- 输出:
222、Donna、 Emp [empno=222, ename=Donna]、0、 1、true、false
333、、 Emp [empno=333, ename=null]、1、 2、false、true 
-->

<hr>
<!-- ****迭代分隔符分隔的内容【c:forTokens】****
    相比forEach多一个属性:
        delims="分隔符,必填项"
 -->
<c:forTokens items="重庆|北京|成都" var="addr" varStatus="empStatus" delims="|">
    ${addr}、${empStatus.current}、${empStatus.index}、
    ${empStatus.count}、${empStatus.first}、${empStatus.last}
    <br/>
</c:forTokens>
<!-- 输出:
重庆、重庆、0、 1、true、false
北京、北京、1、 2、false、false
成都、成都、2、 3、false、true 
-->

<hr>
<!-- ****URL【c:url】****
    var="存储URL的变量名,默认直接输出在页面"
    scope="var属性的作用域(page request session application),默认为page"
    value="URL,必填项"
    context="应用程序名称,默认为当前应用程序"
 -->
<c:url value="https://www.baidu.com" />
<br>
<c:url value="http://blog.youkuaiyun.com/i_love_t" var="url_"/>
${url_ }
<!-- 输出:
https://www.baidu.com
http://blog.youkuaiyun.com/i_love_t 
-->

<hr>
<!-- ****URL参数【c:param】****
    name="参数名称,必填项"
    value="参数值"
 -->
<c:url value="https://www.baidu.com/baidu" var="meitu">
    <c:param name="name1">值1</c:param>
    <c:param name="name2" value="值2"></c:param>
</c:url>
${meitu }
<!-- 输出:
https://www.baidu.com/baidu?name1=%e5%80%bc1&name2=%e5%80%bc2 
-->

<hr>
<!-- ****重定向【c:redirect】****
    url="目标url必填项"
    context="应用程序名称,默认当前应用程序"
    支持c:param标签
 -->
<%-- 
<c:redirect url="http://blog.youkuaiyun.com/i_love_t">
    <c:param name="param">I LOVE YOU!</c:param>
</c:redirect>
--%>
<!-- 输出:
会直接重定向到http://blog.youkuaiyun.com/i_love_t
-->

<%-- 声明一个内部类 --%>
<%!
public static class Emp {

    private String empno;
    private String ename;

    public Emp(){}

    public String getEmpno() {
        return empno;
    }

    public String getEname() {
        return ename;
    }

    public void setEmpno(String empno) {
        this.empno = empno;
    }

    public void setEname(String ename) {
        this.ename = ename;
    }

    @Override
    public String toString() {
        return "Emp [empno=" + empno + ", ename=" + ename + "]";
    }
}
%>
</body>
</html>
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值