【Java.Web】JSP —— 标签库taglib —— 第三方标签库 —— JSTL Core

JSTL Core标签库

在JSP文件中使用Core标签库,要先通过 taglib 指令引入该标签库:

<%@ taglib uri="http://java.sun.com/jsp/jstl/core" prefix="c" %>


JSTL Core标签库的标签描述文件位于 JAR/META-INF/c.tld 中。


一般用途的标签

一般用途的标签包括一下几种:

  • <c:out> —— 把一个表达式的结果打印到网页上
  • <c:set> —— 设定命名变量的值,如果命名变量为JavaBean,还可以设定JavaBean的属性的值;如果命名变量为Map类型,还可以设定与其中的Key对应的值
  • <c:remove> —— 删除一个命名变量
  • <c:catch> —— 用于捕获异常,并把异常对象放在指定的命名变量中

(命名变量的定义在 EL表达式基础 一节中;实际上是指存放在特定范围内的属性,命名变量的名字就是属性的名字;)


<c:out>标签

能够把一个表达式的结果打印到网页中,这个表达式可以为基于<%%>,EL表达式;如果value指定的命名变量不存在(null),则什么也不输出;

<c:out>标签可以采用两种方式设定默认值:设定defautl属性,或者在body中设定默认值。


测试coretest.jsp

<%@ page language="java" contentType="text/html; charset=utf-8"
    pageEncoding="utf-8"%>
<%@ 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>

<%-- JSTL Core --%>
<%-- c:out --%>
<c:out value="${param.username}" default="default username" />
<br/>

</body>
</html>

访问上面的URL:

http://localhost:8080/base-webapp/jsp/jstl/coretest.jsp?username=test user

浏览器显示:


不加request parameter - username,

http://localhost:8080/base-webapp/jsp/jstl/coretest.jsp

显示为:

<c:set>标签

<c:set>标签具有一下作用:

  • 为String类型的命名变量设定值
  • 如果命名变量为JavaBean,那么为这个JavaBean对象的特定属性设定值
  • 如果命名变量为Map类型,那么为这Map对象中的特定key设定值


  • 为String类型的命名变量设定值

语法为:

<c:out var="命名变量的名字" value="表达式" scope="page|request|session|application" />

scope的默认值为page

以下代码在session scope设置了一个命名变量,然后打印出来:

<%-- c:set --%>
c:set<br/>
<c:set var="user" value="new user" scope="session" />
${user}
<br/>


访问这个JSP,显示如下:



  • 为特定范围内的JavaBean对象的属性设定属性值

语法:

<c:set target="代表JavaBean的命名变量" property="JavaBean的属性名" value="表达式" />

一下代码先通过<jsp:useBean>动作定义一个命名变量,然后通过c:set标签设置id属性的值为new id,打印出结果:

<jsp:useBean id="mytestbean" class="com.gof.test.bean.TestBean" scope="application" />
<c:set target="${mytestbean}" property="id" value="new id" />
${mytestbean.id}
<br/>

访问JSP,显示为:



  • 为特定范围内的Map对象的Key设定值

语法:

<c:set target="代表Map对象的命名变量" property="key的名字" value="表达式" />


示例:

<jsp:useBean id="weeks" scope="request" class="java.util.HashMap" />
<c:set target="${weeks}" property="1" value="Monday" />
<c:set target="${weeks}" property="2" value="Thuesday" />
${weeks}
<br/>

访问JSP,显示为:



<c:remove>标签

用于删除特定范围内命名变量,语法为:

<c:remove var="命名变量的名字" scope="page|request|session|application" />


若不指定scope的值,那么会从所有范围内删除var指定的命名变量。

示例:

<%--c:remove --%>
c:remove<br/>
<c:remove var="user" />
${user}
<br/>


删除c:set中设置的命名变量user,无任何输出内容。


<c:catch>标签

用于捕获标签主题中可能出现的一场,并且把一场对象作为命名变量保存在页面范围内,语法为:

<c:catch var="代表异常对象的命名变量的名字" />

示例:

<%-- c:catch --%>
c:catch<br/>
<c:catch var="ex">
<%
    int a = 1;
    int b = 0;
    int c = a / b; // will throw an exception
%>
</c:catch>
<c:out value="${ex.message}" default="No exception" />

上面代码等价:

<%
    try{
        int a = 1;
        int b = 0;
        int c = a / b;
    }catch (Exception e){
        pageContext.setAttribute("ex", e, PageContext.PAGE_SCOPE);
    }
%>
<c:out value="${ex.message}" default="No exception" />

显示为:




条件标签

条件标签能实现Java语言中的if语句以及if-else语句的功能,包括:

  • <c:if> —— if
  • <c:choose> <c:when> <c:otherwise> —— if-else


<c:if>标签

语法为:

<c:if test="逻辑表达式" var="代表逻辑表达式的值的命名变量的名字" scope="page|request|session|application" />


<c:if>标签可以包含标签主体,只有当逻辑表达式的值为true时,才会执行标签主体。

示例:

<%-- c:if --%>
c:if <br/>
<c:if test="${param.user=='me'}" var="result" scope="request">
    the parameter.user is ${param.user }
    <br/>
</c:if>
${result}

访问如下URL:

http://localhost:8080/base-webapp/jsp/jstl/coretest.jsp?user=me


<c:choose> <c:when> <c:otherwise>标签

  • <c:when>和<c:otherwise>不能单独使用,必须位于<c:choose>父标签中
  • <c:choose>标签中可以包含一个或多个<c:when>标签
  • <c:choose>标签中可以不包含<c:otherwise>标签
  • <c:choose>标签中如果同事包含<c:when> <c:otherwise>标签,那么<c:otherwise>必修位于<c:when>标签之后

示例:

<%-- choose when otherwise --%>
c:choose c:when c:otherwise<br/>
<c:choose>
    <c:when test="${empty param.username }">
        Unknown User.
    </c:when>
    <c:when test="${param.username == 'New' }">
        ${param.username} is New.
    </c:when>
    <c:otherwise>
        ${param.username } is others.
    </c:otherwise>
</c:choose>


以此访问如下URL:

http://localhost:8080/base-webapp/jsp/jstl/coretest.jsp
http://localhost:8080/base-webapp/jsp/jstl/coretest.jsp?username=New
http://localhost:8080/base-webapp/jsp/jstl/coretest.jsp?username=Old


迭代标签

  • <c:forEach> —— 用于遍历集合中的对象,并且能重复执行标签主体
  • <c:forTokens> —— 遍历字符串中用特定分隔符分隔的子字符串,并且能够重复执行标签主体

<c:forEach>标签可以遍历的集合包括

  • Set, List, Map, Iterator ,Enumeration接口的实现类
  • Java数组
  • 以逗号“,”分割字符串


<c:forEach>标签

  • 基本语法为:

<c:forEach var="代表集合中的一个元素的命名变量的名字" items="集合">
    标签主体
</c:forEach>

每次从集合中去除一个元素,并且把它存放在NESTED范围内的命名变量中,在标签主体中可以访问这个命名变量。NESTED范围是指当前标签主体构成的范围。只有当前标签主体才能够访问NESTED范围内的命名变量。


示例:

<%-- c:forEach --%>
c:forEach<br/>
<%
    HashMap maps = new HashMap();
    maps.put("1","the first value");
    maps.put("2","the second value");
%>
<c:forEach var="mapitem" items="<%= maps%>">
    ${mapitem.key}   ${mapitem.value}<br/>
</c:forEach>
<br/>

输出:



<c:forEach>标签的varStatus属性

varStatus属性用于设定一个javax.servlet.jsp.jstl.core.LoopTagStatus类型的命名变量,它位于NESTED范围,这个命名变量包含了从集合中取出的当前元素的状态信息。

  • count —— 当前元素在集合中的序号,从1开始计数
  • index —— 当前元素在集合中的索引,从0开始计数
  • first —— 当前元素是否是集合中的第一个元素
  • last —— 当前元素是否是集合中的最后一个元素

示例:继续上面的例子

c:forEach varStatus<br/>
<table border="1">
    <tr>
        <td>序号</td>
        <td>索引</td>
        <td>是否是第一个元素</td>
        <td>是否是最后一个元素</td>
        <td>元素的key</td>
        <td>元素的value</td>
    </tr>
    <c:forEach var="mapitem" items="<%= maps %>" varStatus="status">
        <tr>
            <td>${status.count }</td>
            <td>${status.index }</td>
            <td>${status.first }</td>
            <td>${status.last }</td>
            <td>
              <c:choose>
                <c:when test="${status.last }">
                    <font color="red">${mapitem.key}</font>
                </c:when>
                <c:otherwise>
                    <font color="green">${mapitem.key}</font>
                </c:otherwise>
              </c:choose>
            </td>
            <td>${mapitem.value}</td>
        </tr>
    </c:forEach>
</table>

访问URL显示为:

【Java.Web】JSP —— 标签库taglib —— 第三方标签库 —— JSTL Core_第1张图片

<c:forEach>标签的begin, end step属性

begin end step属性分别指定循环的起始索引,结束索引和步长。


<c:forTokens>标签

用于遍历字符串中用特定分隔符分隔的子字符串,并且能重复执行标签主体。

基本语法如下:

<c:forTokens var="代表子字符串的命名变量的名字" items="被分隔的字符串" delims="分隔符" >
    标签主体
</c:forTokens>


示例:

c:forToken<br/>
<%
    String str = "First:Second:Third:Forth";
%>
<c:forTokens var="stritem" items="<%= str %>" delims=":">
    ${stritem } <br/>
</c:forTokens>
<br/>


显示为:

【Java.Web】JSP —— 标签库taglib —— 第三方标签库 —— JSTL Core_第2张图片

URL相关的标签

  • <c:import> —— 包含其他Web资源,雨<jsp:include>指令的类型有些类似
  • <c:url> —— 按照特定的重写规则重新构造URL
  • <c:redirect> —— 负责重定向

<c:import>标签

用于包含其他Web资源,它与<jsp:include>动作的作用有些类似。

<c:import>标签雨<jsp:include>动作的区别在于,牵着不仅可以包含同一个Web应用中的资源,还能包含其他Web应用中的资源,甚至是其他网站的资源。

基本语法为:

<c:import url="Web资源的URL" />


url路径的格式:

  • 不以“/”开头的相对于当前JSP文件的相对路径
  • 以“/”开头的当前应用的绝对路径
  • 以“http://”开头的绝对路径


<c:import>标签还可以通过var属性设定一个String类型的命名变量。如果设定了var属性,那么<c:import>标签不会把url属性设定的目标文件的内容直接包含到当前文件中,而是把目标文件中的文本内容保存在var属性设定的命名变量中。

例如:

一下标签把target.jsp文件中的文本内容存放在target命名变量中,通过EL表达式输出target.jsp文件中的内容。

<c:import url="dir/target.jsp" var="target" />
${target}


<c:url>标签

按照特定的重写规则重新构造URL。

基本语法为:

<c:url value="原始URL" var="存放新的URL的命名变量" scope="page|request|session|application" />

标签把重新生成的URL存放在var属性指定的命名变量中,scope默认值为page。


例如,一下<c:url>标签中的value属性以“/”开头,标签会在重新生成的URL中加上当前Web应用的跟路径,因此,myurl命名变量的值为

/base-webapp/dir1/dir2/test.jsp

<%-- c:url --%>
c:url<br/>
<c:url value="/dir1/dir2/test.jsp" var="myurl" />
<a href="${myurl}">test.jsp</a>
<br/>


<c:url>标签中可以包含<c:param>子标签,用于设定请求参数。

例如:

<%-- c:url --%>
c:url<br/>
<c:url value="/dir1/dir2/test.jsp" var="myurl" >
    <c:param name="username" value="New" />
</c:url>
<a href="${myurl}">test.jsp</a>
<br/>


则myurl的值为:

/base-webapp/dir1/dir2/test.jsp?username=New


<c:redirect>标签

用于把请求重定向到其他Web资源。

基本语法为:

<c:redirect url="目标Web资源的URL" />























你可能感兴趣的:(java,Web)