JavaWeb学习笔记(十七)--JSTL标签库

1. JSTL标签库

  • 核心标签库(本章重点)
  • 国际化标签库(后面讲)
  • 数据库标签(基本不用)
  • XML标签(基本不用)
  • JSTL函数(EL函数,后面讲)

2. 如何使用JSTL核心标签

首先需要导入JSTL的jar包,访问https://tomcat.apache.org/download-taglibs.cgi 下载如下3个jar包,导入到JaveWeb工程中,
Impl:
taglibs-standard-impl-1.2.5.jar (pgp, sha512)
Spec:
taglibs-standard-spec-1.2.5.jar (pgp, sha512)
EL:
taglibs-standard-jstlel-1.2.5.jar (pgp, sha512)
在JSP中引用核心标签库:
<%@ taglib uri="http://java.sun.com/jsp/jstl/core" prefix="c" %>
uri的地址可以在taglibs-standard-impl-1.2.5.jar中的c.tld的uri标签中获取,所有的核心标签也在此文件中标注说明。

3. JSTL核心标签

3.1 <c:out>标签

<c:out>标签用于输出一段文本内容到pageContext对象当前保存的“out”引用中。

属性名 是否支持EL 属性类型 属性描述
value true Object 指定要输出的内容
escapeXml true Bollean 定是否将> < & ' "等特殊字符进行HTML编码转换后再进行输出。默认值为true
default true Object 如果value属性值为null,输出default所指定的默认值

举例:

<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<%@ taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core" %>
<html>
  <head>
    <title>c:out标签</title>
  </head>
  <body>
  <strong><c:out value="c:out标签:" /></strong><br>
  <c:out value="${aa}" default="value is null, output default string"/><br>
  <c:out value="<a href='http://www.cnblogs.com/'>博客园</a>" /><br>
  <c:out value="<a href='http://www.cnblogs.com/'>博客园</a>" escapeXml="false"/><br>
  </body>
</html>

转换后的HTML源码:

<html>
  <head>
    <title>c:out标签</title>
  </head>
  <body>
  <strong>c:out标签:</strong><br>
  value is null, output default string<br>
  &lt;a href=&#039;http://www.cnblogs.com/&#039;&gt;博客园&lt;/a&gt;<br>
  <a href='http://www.cnblogs.com/'>博客园</a><br>
  </body>
</html>

运行结果:

3.2<c:set>标签

<c:set>标签用于把某一个对象存在指定的域范围内,或者设置Web域中的java.util.Map类型的属性对象或JavaBean对象的属性。

属性名 是否支持EL 属性类型 属性描述
value true Object 用于指定属性值
var false String 用于指定要设置的属性的名称
scope false String 用于指定属性所在的web域
target true Object 用于指定要设置属性的对象,这个对象必须是JavaBean对象或java.util.Map对象
property true String 用于指定当前要为对象设置属性的名称

举例:

package bean;

public class User {
    private String username;
    private String password;

    public User() {
    }

    public User(String username, String password) {
        this.username = username;
        this.password = password;
    }

    public String getUsername() {
        return username;
    }

    public void setUsername(String username) {
        this.username = username;
    }

    public String getPassword() {
        return password;
    }

    public void setPassword(String password) {
        this.password = password;
    }
}
<%@ page import="bean.User" %>
<%@ page import="java.util.Map" %>
<%@ page import="java.util.HashMap" %>
<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<%@ taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core" %>
<html>
  <head>
    <title>c:set标签</title>
  </head>
  <body>
  <strong>c:set标签:</strong><br>
  <!-- 设置普通的属性 -->
  <c:set var="data" value="aaaa" scope="request" ></c:set>
  ${data}
  <br>
  <!-- 设置JavaBean的属性 -->
  <%
    User user = new User();
    session.setAttribute("user", user);
  %>

  <c:set target="${user}" property="username" value="zhangsan" />
  <c:set target="${user}" property="password" value="123456" />
  username=${user.username}, password=${user.password}<br>
  <!-- 设置Map的值 -->
  <%
    Map<String, String> map = new HashMap<>();
    request.setAttribute("map", map);
  %>
  <c:set target="${map}" property="aaa" value="111" />
  ${map.aaa}
  </body>
</html>

运行结果:

3.3 <c:remove>标签

<c:remove>标签用于删除各种web域的属性。语法:

<c:remove var="varName" scope="page|request|session|application" />

举例:

<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<%@ taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core" %>
<html>
  <head>
    <title>c:remove标签</title>
  </head>
  <body>
  <strong>c:remove标签:" </strong><br>

  <c:set var="data1" value="aaaa" scope="request"/>
  删除属性前:
  data1=${data1}<br>
  <c:remove var="data1" scope="application" />
  删除属性后:
  data1=${data1}<br>
  </body>
</html>

运行结果:

3.4 <c:catch>标签

<c:catch>标签用于捕获嵌套在标签中内容抛出的异常,语法:

<c:catch var="varName" >
   代码
</c:catch>

var属性用于保存捕获的异常对象,并保存在page域中。

举例:

<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<%@ taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core" %>
<html>
  <head>
    <title>c:catch标签</title>
  </head>
  <body>
  <strong>c:catch标签:" </strong><br>
  <c:catch var="error" >
    <%
      int i = 10 / 0;
    %>
  </c:catch>
  异常:${error} <br>
  异常 error.getMessage: ${error.message}<br>
  异常 error.getCause: ${error.cause}<br>
  异常 error.getStackTrace: ${error.stackTrace}<br>
  </body>
</html>

运行结果:

 

3.5 <c:if>标签

<c:if test=""/>标签可以构造简单的“if-then”结构的条件表达式。

 

属性名 是否支持EL 属性类型 属性描述
test true Boolean 决定是否处理标签体内容的条件表达式
var false String 用于指定test属性执行结果保存的属性名称
scope false String 用于指定test属性执行结果保存在哪个web域

举例:

<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<%@ taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core" %>
<html>
  <head>
    <title>c:if标签</title>
  </head>
  <body>
  <strong>c:if标签: </strong><br>
  <jsp:useBean id="user" scope="session" class="bean.User">
    <jsp:setProperty name="user" property="username" value="zhangsan" />
    <jsp:setProperty name="user" property="password" value="123" />
  </jsp:useBean>
  <c:if test="${user!=null}">
    欢迎你:${user.username}
  </c:if>
  <c:if test="${user==null}" >
    请登录
  </c:if>
  </body>
</html>

运行结果:

 

3.6 <c:choose>标签

<c:choose>标签用于指定多个条件选择的组合边界,他必须与<c:when>和<c:otherwise>标签一起使用。使用
<c:choose>,<c:when>和<c:otherwise>三个标签,可以构造类似"if-else if-else"的复杂条件判断结构。

举例:

<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<%@ taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core" %>
<html>
  <head>
    <title>c:choose标签</title>
  </head>
  <body>
  <strong>c:choose标签: </strong><br>
  <c:set var="sex" value="female"/>
  <c:choose>
    <c:when test='${sex.equals("male")}'>
      性别:男
    </c:when>
    <c:when test='${sex.equals("female")}'>
      性别:女
    </c:when>
    <c:otherwise>
      性别输入不正确
    </c:otherwise>
  </c:choose>
  </body>
</html>

运行结果:

3.7 <c:forEach>标签

<c:forEach>标签用于对一个集合对象中的元素进行循环迭代操作,或者按照指定的次数重复迭代执行标签体中的内容。

属性名 是否支持EL 属性类型 属性描述
var false String 用于指定当前迭代到的元素的属性名称,保存在page域
items true Object 将要迭代的对象
begin true int 如果指定itmes属性,就从结合中的第begin个元素开始进行迭代,迭代到end的索引值结束,begin的索引值从0开始编号;如果没有指定items属性,就冲begin指定的值开始迭代,直到end值时结束
end true int 参见begin属性描述
step true int 指定迭代的步长
varStatus false String 集合的状态信息

 

属性名 类型 属性描述
begin int 迭代的开始索引
end int 迭代的结束索引
first boolean 是否当前迭代的第一个元素
last boolean 是否当前迭代的最后一个元素
count int 已经迭代的次数
current Object 当前迭代出来的对象
index int 当前迭代的索引
step int 迭代步长

举例:

<%@ page import="java.util.List" %>
<%@ page import="java.util.ArrayList" %>
<%@ page import="bean.User" %>
<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<%@ taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core" %>
<html>
  <head>
    <title>c:forEach标签</title>
  </head>
  <body>
  <strong>c:forEach标签: </strong><br>
  <%
    List<String> list = new ArrayList<>();
    list.add("aa");
    list.add("bb");
    list.add("cc");
    list.add("dd");
    list.add("ee");
    request.setAttribute("list", list);
  %>
  <!-- 指定begin end step属性 -->
  <c:forEach var="str" begin="0" end="4" step="2" items="${list}" varStatus="varStatus" >
    ${str}, begin=${varStatus.begin}, end=${varStatus.end}, count=${varStatus.count}, current=${varStatus.current},
    first=${varStatus.first},last=${varStatus.last}, index=${varStatus.index}, step=${varStatus.step}
    <br>
  </c:forEach>
  <%
    List<User> users = new ArrayList<>();
    users.add(new User("a", "123"));
    users.add(new User("b", "123"));
    users.add(new User("c", "123"));
    users.add(new User("d", "123"));
    users.add(new User("e", "123"));
    request.setAttribute("users", users);
  %>
  <!-- 不指定begin end step属性 -->
  <c:forEach var="user" items="${users}" varStatus="varStatus">
    ${user}, begin=${varStatus.begin}, end=${varStatus.end}, count=${varStatus.count}, current=${varStatus.current},
    first=${varStatus.first},last=${varStatus.last}, index=${varStatus.index}, step=${varStatus.step}
    <br>
  </c:forEach>

  <!-- 不指定items -->
  <c:forEach var="num" begin="1" end="10" >
    ${num},
  </c:forEach>
  </body>
</html>

运行结果:

3.8 <c:forTokens>标签

<c:forTokens>标签主要用于分隔字符串,并迭代。语法:

<c:forTokens var="varName" items="srcString" delims="delimiters" varStatus="varStatus">
属性名 是否支持EL 属性类型 属性描述
var false String 用于指定当前迭代到的元素的属性名称,保存在page域
items true String 要分割的字符串
delims true String 分隔符
begin true int 迭代开始的索引位置
end true int 迭代结束的索引位置
step true int 指定迭代的步长
varStatus false String 状态信息,这个和forEach中的一模一样

 

举例:

<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<%@ taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core" %>
<html>
  <head>
    <title>c:forTokens标签</title>
  </head>
  <body>
  <strong>c:forTokens标签: </strong><br>
  <c:forTokens var="str" items="This is a dog." delims=" " varStatus="varStatus">
    ${str}<br>
  </c:forTokens>
  </body>
</html>

运行结果:

3.9 <c:url>标签

<c:url>标签用于在JSP页面中构造一个URL地址,其主要目的是实现URL的重写。URL重写就是将会话的标识号以参数的形式附加在URL地址后面。 现在使用Chrome浏览器似乎是实现不了重写了。使用<c:url>标签的另一个好处是,访问当前web页面时,会在前面自动添加web应用的路径,而不用像以前那样写pageContext.request.Context。

属性名 是否支持EL 属性类型 属性描述
value true String 指定要构造的URL
var false String 保存构造后的URL结果的的名称
scope false String 构造出的URL结果保存在哪个域

举例:

<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<%@ taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core" %>
<html>
  <head>
    <title>c:url标签</title>
  </head>
  <body>
  <strong>c:url标签: </strong><br>
  <c:url var="url" value="https://www.cnblogs.com/"/>
  ${url}<br>
  <c:url var="url2" value="/url.jsp"/>
  ${url2}
  </body>
</html>

运行结果:

3.10 <c:redirect>标签

<c:redirect>用于重定向

属性名 是否支持EL 属性类型 属性描述
url true   指定要重定向的目标资源的URL
context true  

当要使用相对路径重定向到同一个服务器下的其他web应用程序中的资源时,context属性指定其他web应用程序的名称

举例:

 

<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<%@ taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core" %>
<html>
  <head>
    <title>c:redirect标签</title>
  </head>
  <body>
  <strong>c:redirect标签: </strong><br>
  <c:redirect url="url.jsp" />
  </body>
</html>

 

运行结果:
访问http://localhost:8080/redirect.jsp会自动跳转到url.jsp

3.11 <c:param>标签

URL中经常会附带一些参数。<c:param>标签可以嵌套在<c:import>、<c:url>、<c:redirect>标签内,为这些标签所使用URL地址附加参数。
<c:param>标签在为一个URL地址附加参数时,会自动进行URL编码。

语法:

<c:param name="xxx" value="yyy"/>

举例:

<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<%@ taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core" %>
<html>
  <head>
    <title>c:param标签</title>
  </head>
  <body>
  <strong>c:param标签: </strong><br>
  <c:url var="url" value="https://www.baidu.com/" >
    <c:param name="country" value="中国"/>
    <c:param name="city" value="北京"/>
  </c:url>
  ${url}<br>
  <c:url var="url2" value="https://www.baidu.com/" >
    <c:param name="country" value="china"/>
    <c:param name="city" value="beijing"/>
  </c:url>
  ${url2}
  </body>
</html>

运行结果:

 

 

 

posted @ 2019-06-23 02:51  暴躁的毛毛熊  阅读(285)  评论(0编辑  收藏  举报