动态页面_玩转jstl

1.jstl标签库

标签库功能描述标签库的URI建议前缀
核心标签库http://java.sun.com/jsp/jstl/corec
XML标签库http://java.sun.com/jsp/jstl/xmlx
国际化/格式化标签库http://java.sun.com/jsp/jstl/fmtfmt
数据库标签库http://java.sun.com/jsp/jstl/sqlsql
EL自定义函数http://java.sun.com/jsp/jstl/functionsfn

2.JSTL的各个标签库的作用

(1)核心标签库中包含了实现WEB应用中的通用操作的标签。例如,用于输出一个变量内容的<c:out>标签、用于条件判断的<c:if>标签、用于迭代循环的<c:forEach>标签。

(2)国际化/格式化标签库中包含实现WEB应用程序的国际化的标签。例如,设置JSP页面的本地信息、设置JSP页面的时区、绑定资源文件,使本地敏感的数据(例如数值、日期等)按照JSP页面中设置的本地格式显示。

(3)数据库标签库中包含用于访问数据库和对数据库中的数据进行操作的标签。例如,从数据源中获得数据库连接、从数据库表中检索数据等。由于在软件分层的开发模型中,JSP页面仅用作表现层,我们一般不在JSP页面中直接操作数据库,而是在业务逻辑层或数据访问层操作数据库,所以,JSTL中提供的这套数据库标签库没有多大的实用价值。

(4)XML标签库中包含对XML文档中的数据进行操作的标签。例如,解析XML文档、输出XML文档中的内容,以及迭代处理XML文档中的元素。因为XML广泛应用于WEB开发,对XML文档的处理非常重要,XML标签库使处理XML文档变得简单方便,这也是JSTL的一个重要特征。

(5)JSTL中提供的一套EL自定义函数包含了JSP页面制作者经常要用到的字符串操作。例如,提取字符串中的子字符串、获取字符串的长度和处理字符串中的空格等。

3.核心标签库

3.1.<c:out>标签

目的:输出一段文本内容到客户端浏览器

特殊字符转换:

在这里插入图片描述

3.1.1.<c:out>标签标签有两种语法格式:

语法1,没有标签体的情况:

<c:out value=“value”

[escapeXml="{true|false}"]

[default=“defaultValue”] />

语法2,有标签体的情况,在标签体中指定输出的默认值:

<c:out value=“value”

[escapeXml="{true|false}"] >

default value

</c:out>

3.1.2.<c:out>标签的属性
属性名是否支持EL属性类型属 性 描 述
valuetrueObject指定要输出的内容
escapeXmltrueBoolean指定是否将>、<、&、’、" 等特殊字符进行HTML编码转换后再进行输出。默认值为true
defaulttrueObject指定如果value属性的值为null时所输出的默认值
3.1.3.例程1
<%@ taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core" %>
<%@ page contentType="text/html;charset=gb2312" %>
<%
session.setAttribute("test_session", "testValue_session");
%>
直接输出一个字符串:
<c:out value="test" default="123456" /><br /><hr />
输出Web域中不存在的属性的值:<br />
<c:out value="${test_request}" default="这个属性不存在"/><br /><hr />
输出Web域中的test_session属性的值:<br />
<c:out value="${test_session}" />

输出结果:

在这里插入图片描述

3.1.4.例程2:没有设置escapeXml属性
<%@ taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core" %>
<c:out value="${null}" >
<meta http-equiv="refresh" content="0;url=http://www.it315.org" />
</c:out>

输出结果:

在这里插入图片描述

3.1.5.例程3:escapeXml属性设置为了false
<%@ taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core" %>
  <c:out value="${null}" escapeXml="false">
  	<meta http-equiv="refresh" content="0;url=http://www.it315.org" /> 
  </c:out>

输出结果:

在这里插入图片描述

3.2.<c:set>标签

3.2.1.<c:set>标签的作用

<c:set>标签用于设置各种Web域中的属性,或者设置Web域中的java.util.Map类型的属性对象或JavaBean类型的属性对象的属性。

3.2.2.<c:set>标签有四种语法格式:

语法1,使用value属性设置指定域中的某个属性的值:

<c:set value=“value”

var=“varName”

[scope="{page|request|session|application}"] />

语法2,在标签体中设置指定域中的某个属性的值:

<c:set var=“varName”

[scope="{page|request|session|application}"]>

body content

</c:set>

语法3,使用value属性设置Web域中的一个属性对象的某个属性:

<c:set value=“value”

target=“target”

property=“propertyName” />

语法4,在标签体中设置Web域中的一个属性对象的某个属性性:

<c:set target=“target”

property=“propertyName”>

body content

</c:set>

3.2.3.<c:set>标签的属性
属性名是否支持EL属性类型属 性 描 述
valuetrueObject用于指定属性值
varfalseString用于指定要设置的Web域属性的名称
scopefalseString用于指定属性所在的Web域
targettrueObject用于指定要设置属性的对象,这个对象必须是JavaBean对象或java.util.Map对象
propertytruestring用于指定当前要为对象设置的属性名称
3.2.4.使用<c:set>标签设置某个Web域中的属性的一个演示例子程序
<%@ taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core" %>
<%@ page contentType="text/html;charset=gb2312" %>
<c:set var="userName" scope="session">
zxx
</c:set>
输出session 作用域中的userNamer属性的值:
<c:out value="${userName}" /><br /><hr />
输出session 作用域中的bookname属性的值:
<c:set var="bookname" scope="session" />
<c:out value="${bookname}" />

运行结果:

在这里插入图片描述

3.2.5.使用<c:set>标签设置UserBean对象和Map对象的属性的一个演示例子程序。
<%@ taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core" %>
<%@ page contentType="text/html;charset=gb2312" %>
<%@ page import="java.util.HashMap" %>
<jsp:useBean id="user" class="org.it315.UserBean" />
<%
HashMap preferences = new HashMap();
session.setAttribute("preferences",preferences);
%>
设置和输出UserBean对象的userName属性值:
<c:set value="zxx" target="${user}" property="userName" />
<c:out value="${user.userName}" /><br /><hr />
设置和输出UserBean对象的password属性值:
<c:set target="${user}" property="password" />
<c:out value="${user.password}" /><br /><hr />
设置和输出Map对象的color关键字的值:
<c:set target="${preferences}" property="color" value="${param.color}" />
<c:out value="${preferences.color}" />

输出结果:
在这里插入图片描述

3.3.<c:if>标签

3.3.1.<c:if>标签的作用

语法1,没有标签体的情况:

<c:if test=“testCondition” var=“varName”

[scope="{page|request|session|application}"] />

语法2,有标签体的情况,在标签体中指定要执行的内容:

<c:if test=“testCondition” [var=“varName”]

[scope="{page|request|session|application}"]>

body content

</c:if>

3.3.2.<c:if>标签的属性
属性名是否支持EL属性类型属 性 描 述
testtrueboolean决定是否处理标签体中的内容的条件表达式
varfalseString用于指定将test属性的执行结果保存到某个Web域中的某个属性的名称
scopefalseString指定将test属性的执行结果保存到哪个Web域中
3.3.3.例程1
<%@ taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core" %>
<%@ page contentType="text/html;charset=gb2312" %>
<jsp:useBean id="user" class="org.it315.UserBean" />
<c:set value="${param.count}" target="${user}" property="visitCount" />
<c:if test="${user.visitCount == 1}">
这是您第一次访问本网站,欢迎您!
</c:if>

输入地址:

http://localhost:8080/JSTL/c_if.jsp?count=1 

输出结果:
在这里插入图片描述
3.4.<c:choose>标签

3.4.1.<c:choose>标签的作用

<c:choose>标签用于指定多个条件选择的组合边界,它必须与<c:when>和<c:otherwise>标签一起使用。使用<c:choose>,<c:when>和<c:otherwise>三个标签,可以构造类似 “if-else if-else” 的复杂条件判断结构。
<%@ taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core" %>
<%@ page contentType="text/html;charset=gb2312" %>
<c:set value="${param.count}" var="count" />
<c:choose>
<c:when test="${count == 0}">
对不起,没有符合您要求的记录。
</c:when>
<c:otherwise>
符合您要求的记录共有${count}条.
</c:otherwise>
</c:choose>

在浏览器地址栏输入如下地址访问例程8-11:

http://localhost:8080/JSTL/c_choose.jsp?count=0

例程8-11的运行结果如图8.9所示。如果将参数count的值修改为10,则运行结果如图8.10所示。
在这里插入图片描述
3.3.4.例程2-是一个综合使用<c:if>标签和<c:choose>等标签的例子程序

<%@ taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core" %>
<c:if test="${pageContext.request.method=='POST'}">
<c:choose>
<c:when test="${param.favor == 'computer'}">
Your favourite course is <b>computer</b>.
</c:when>
<c:otherwise>
Your favourite course is <i>other</i>.
</c:otherwise>
</c:choose>
</c:if>
<form method="POST">What is your favourite course?<br/>
<input type="text" name="favor" />
<input type="submit" value="submit" />
</form>

操作:

在浏览器地址栏中直接访问c_customLogic.jsp的运行结果如图8.11所示,在文本框中输入“computer”,单击其中的submit按钮后的运行结果如图8.12所示。

输出结果:

在这里插入图片描述

3.4.<c:forEach>标签

3.4.1.<c:forEach>标签的作用

对一个集合对象中的元素进行循环迭代操作

3.4.2.<c:forEach>标签有两种语法格式

语法1,在集合对象中迭代:

<c:forEach [var=“varName”]

items=“collection”

[varStatus=“varStatusName”]

[begin=“begin”] [end=“end”] [step=“step”]>

body content

</c:forEach>

语法2,迭代固定的次数:

<c:forEach [var=“varName”]

[varStatus=“varStatusName”]

begin=“begin” end=“end” [step=“step”]>

body content

</c:forEach>

3.4.2.<c:forEach>标签的属性
属性名是否支持EL属性类型属 性 描 述
varfalseString指定将当前迭代到的元素保存到page这个Web域中的属性名称
itemstrue任何支持的类型将要迭代的集合对象
varStatusfalseString指定将代表当前迭代状态信息的对象保存到page这个Web域中的属性名称
begintrueint如果指定items属性,就从集合中的第begin个元素开始进行迭代,begin的索引值从0开始编号;如果没有指定items属性,就从begin指定的值开始迭代,直到end值时结束迭代
endtrueint参看begin属性的描述
steptrueint指定迭代的步长,即迭代因子的迭代增量
3.4.3.<c:forEach>标签的items属性的值支持下面的数据类型:
  • 任意类型的数组
  • java.util.Collection
  • java.util.Iterator
  • java.util.Enumeration
  • java.util.Map
  • String

items属性还支持与数据库有关的数据类型java.sql.ResultSet(包括javax.sql.RowSet),这些数据类型将在8.5 节的数据库标签中进行介绍。对字符串的迭代操作通常使用<c:forTokens>标签或JSTL函数,例如fn:split和fn:jion,JSTL函数将在8.7节进行介绍。

3.4.4.例程1-迭代Collection类型的集合对象
<%@ taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core" %>
<%@ page contentType="text/html;charset=gb2312" %>
<%@ page import="java.util.*,org.it315.UserBean" %>
<%
Collection users = new ArrayList();
for(int i=0; i<5; i++)
{
UserBean user = new UserBean();
user.setUserName("user" + i);
user.setPassword("guess" + i);
users.add(user);
}
session.setAttribute("users", users);
%>
<div style="text-align:center">User List
<table border="1">
<tr><td>用户名</td><td>密码</td></tr>
<c:forEach var="user" items="${users}">
<tr>
<td>${user.userName}</td><td>${user.password}</td>
</tr>
</c:forEach>
</table></div>

输出结果:

在这里插入图片描述

3.4.5.例程2-迭代Map对象

使用<c:forEach>标签迭代Map类型的集合对象时,迭代出的每个元素的类型为Map.Entry,Map.Entry代表Map集合中的一个条目项,其中的getKey()方法可获得条目项的关键字,getValue()方法可获得条目项的值。

EL中的requestScope隐含对象代表request作用域中的所有属性的Map对象,所以我们可以使用<c:forEach>标签迭代输出EL中的requestScope隐含对象中的所有元素,如例程8-14所示。

<%@ taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core" %>
<%@ page contentType="text/html;charset=gb2312" %>
<%
request.setAttribute("attr1","value1");
request.setAttribute("attr2","value2");
%>
<div style="text-align:center">Properties(Map)
<table border="1">
<tr><td>Map的关键字</td><td>Map的对应关键字的值</td></tr>
<c:forEach var="entry" items="${requestScope}">
<tr><td>${entry.key}</td><td>${entry.value}</td></tr>
</c:forEach>
</table></div>

输出结果:

在这里插入图片描述

3.4.6.迭代指定的次数
<%@ taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core" %>
<%@ page contentType="text/html;charset=gb2312" %>
从11到16迭代,指定迭代步长为2:
<c:forEach var="i" begin="11" end="16" step="2">
${i}
</c:forEach><br /><hr />
从0到5迭代,没有指定迭代步长:
<c:forEach var="i" begin="0" end="5">
${i}
</c:forEach>

输出结果:在这里插入图片描述

3.4.7.指定迭代集合对象的范围和步长
  <%@ taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core" %>
  <%@ page contentType="text/html;charset=gb2312" %>
  <%@ page import="java.util.*,org.it315.UserBean" %>
  <%
  	Collection users = new ArrayList();
  	for(int i=0; i<6; i++)
  	{
  		UserBean user = new UserBean();
  		user.setUserName("user" + i);
  		user.setPassword("guest" + i);
  		users.add(user);
  	}
  	session.setAttribute("users", users);
  %>
  <div style="text-align:center">User List(指定迭代范围和步长)
  <table border="1">
  	<tr><td>用户名</td><td>密码</td></tr>
  	<c:forEach var="user" items="${users}" end="5" step="2">
  		<tr>
  			<td>${user.userName}</td><td>${user.password}</td>
  		</tr>
  	</c:forEach>
  </table></div>

输出结果:在这里插入图片描述

3.4.8.获取迭代的状态信息

<c:forEach>标签可以将代表当前迭代状态信息的对象保存到page域中,varStatus属性指定了这个对象保存在page域中的属性名称。

  • public java.lang.Integer getBegin()
    • 返回为标签设置的begin属性的值,如果没有设置begin属性则返回null
  • public int getCount()
    • 返回当前已循环迭代的次数
  • public java.lang.Object getCurrent()
    • 返回当前迭代到的元素对象
  • public java.lang.Integer getEnd()
    • 返回为标签设置的end属性的值,如果没有设置end属性则返回null
  • public int getIndex()
    • 返回当前迭代的索引号
  • public java.lang.Integer getStep()
    • 返回为标签设置的step属性的值,如果没有设置step属性则返回null
  • public boolean isFirst()
    • 返回当前是否是第一次迭代操作
  • public boolean isLast()
    • 返回当前是否是最后一次迭代操作
<%@ taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core" %>
<%@ page contentType="text/html;charset=gb2312" %>
<%@ page import="java.util.*,org.it315.UserBean" %>
<%
Collection users = new ArrayList();
for(int i=0; i<6; i++)
{
UserBean user = new UserBean();
user.setUserName("user" + i);
user.setPassword("guest" + i);
users.add(user);
}
session.setAttribute("users", users);
%>
<div style="text-align:center">User List
<table border="1">
<tr><td>用户名</td><td>密码</td><td>index</td>
<td>count</td><td>first?</td><td>last?</td></tr>
<c:forEach var="user" items="${users}" varStatus="sta" begin="1" step="2">
<tr>
<td>${user.userName}</td><td>${user.password}</td>
<td>${sta.index}</td><td>${sta.count}</td>
<td>${sta.first}</td><td>${sta.last}</td>
</tr>
</c:forEach>
</table></div><hr>
<div style="text-align:center">迭代固定的次数
<table border="1">
<tr><td>数值</td><td>index</td><td>count</td>
<td>first?</td><td>last?</td></tr>
<c:forEach var="i" varStatus="sta1" begin="101" end="103">
<tr>
<td>${i}</td><td>${sta1.index}</td><td>${sta1.count}</td>
<td>${sta1.first}</td><td>${sta1.last}</td>
</tr>
</c:forEach>
</table></div>

运行结果:

在这里插入图片描述

3.4.9.与条件标签结合使用
<%@ taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core" %>
<%@ page contentType="text/html;charset=gb2312" %>
<div style="text-align:center">
<table border="1"><tr><td>number</td><td>count</td><td>even|odd</td></tr>
<c:forEach var="i" begin="11" end="13" varStatus="status">
<tr><td>${i}</td><td>${status.count}</td><td>
<c:choose>
<c:when test="${status.count % 2 == 0}">
偶数行
</c:when>
<c:otherwise>
奇数行
</c:otherwise>
</c:choose></td></tr>
</c:forEach>
<table></div>

输出结果:

ikskj3-1566351222412)]

3.4.9.与条件标签结合使用
<%@ taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core" %>
<%@ page contentType="text/html;charset=gb2312" %>
<div style="text-align:center">
<table border="1"><tr><td>number</td><td>count</td><td>even|odd</td></tr>
<c:forEach var="i" begin="11" end="13" varStatus="status">
<tr><td>${i}</td><td>${status.count}</td><td>
<c:choose>
<c:when test="${status.count % 2 == 0}">
偶数行
</c:when>
<c:otherwise>
奇数行
</c:otherwise>
</c:choose></td></tr>
</c:forEach>
<table></div>

输出结果:

在这里插入图片描述

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值