您的位置:首页 > Web前端 > JavaScript

[Servlet&JSP] JSTL的使用

2015-12-17 16:02 786 查看
我们可以使用JSTL(JSP Standard Tag Library)来替换JSP中用来实现页面逻辑的Scriptlet,让网页上使用与HTML类似的标签,这会使得网页设计变得更加简单,可以随时调整页面而不用费心的修改Scriptlet。

JSTL简介

JSTL提供的标签库可以分为五个大类。

核心标签库

提供条件判断、属性访问、URL处理及错误处理等标签。

格式标签库

提供数字、日期等的格式化功能,以及区域(Locale)、信息、编码处理等国际化功能的标签。

SQL标签库

提供基本的数据库查询、更新、设置数据源等功能的标签。

XML标签库

提供XML剖析、流程控制、转换等功能的标签。

5.函数标签库

提供用于字符串处理的自定义EL函数标签库

JSTL是另一个标准规范,本身并不在JSP的规范当中,所以必须另外下载实现。

JSTL下载

网址:http://tomcat.apache.org/taglibs/standard/

版本: Standard 1.1.2

配置

解压下载文件jakarta-taglibs-standard-1.1.2.zip,将lib目录下的jstl.jar和standard.jar复制到项目的WEB-INF/lib目录下。

使用

在JSP文件中使用taglib元素指定元素定义前置名称与uri引用。

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


前置标签设置了这个标签库在此JSP网页中的名称空间,以避免与其他标签库的标签名称发生冲突,惯例上使用JSTL核心标签库时,会使用c作为前置名称。uri则告知容器,如何引用JSTL标签库实现。

流程处理标签

1
<c:if>
标签

一个实例如下:

<%@ 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>
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=ISO-8859-1">
<title>登录页面</title>
</head>
<body>
<c:if test="${param.name=='abc' && param.password=='123'}">
<h1>${param.name} 登录成功</h1>
</c:if>
</body>
</html>


<c:if>
标签中的test属性中可以设置EL表达式或JSP操作数(
<%= %>
),如果表达式的结果为true,则会将
<c:if>
主体输出。

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

一个实例如下:

<%@ page language="java" contentType="text/html; charset=utf-8"
pageEncoding="utf-8"%>
<%@taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core" %>
<jsp:useBean id="user" class="club.chuxing.User" />
<jsp:setProperty name="user" property="*" />
<!DOCTYPE html>
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=utf-8">
<title>登录页面</title>
</head>
<body>
<c:choose>
<c:when test="${test.valid}">
<h1>
<jsp:geProperty name="user" property="name" />登录成功
</h1>
</c:when>
<c:otherwise>
<h1>登录失败</h1>
</c:otherwise>
</c:choose>
</body>
</html>


<c:when>
<c:otherwise>
必须放在
<c:choose>
之中。
<c:choose>
中可以有多个
<c:when>
标签,此时会从上往下进行测试,如果有个
<c:when>
的test运算结果为true,就输出其主体内容,之后的
<c:when>
就不会做测试,如果若有的
<c:when>
经测试都不成立,则会输出
<c:otherwise>
的内容。

3
<c:forEach>
标签

用于通过循环来产生一连串的输出。
<c:forEach>
标签的items属性可以是数组或Collection对象,每次回循序读取数组或Collection对象中的一个元素,并制定给var属性所设置的变量,之后就可以在
<c:forEach>
标签主体中,使用var属性所设置的变量来取得该元素。例如:

<body>
<table>
<c:forEach var="message" items="${messageService.messages}">
<tr>
<td>${message.name}</td><td>${message.text}</td>
</tr>
</c:forEach>
</table>
</body>


4
<c:forTokens>
标签

用于将某个字符串拆分为数个字符(Token)。例如:

<body>
<c:forTokens var="token" delims="," items="Java,C++,JavaScript">
${token}<br />
</c:forTokens>
</body>


5
<c:catch>
标签

如果要在发生异常的页面直接捕捉异常对象,可以使用将可能发生异常的网页段落包起来。如果异常发生了,这个异常对象会设置给var属性所指定的名称,这样才有机会使用这个异常对象。例如:

<body>
<c:catch var="error">
${param.a} + ${param.b} = ${param.a + param.b}
</c:catch>
<c:if test="${error != null}">
<br /><span style="color:red;">${error.message}</span>
<br />${error}
</c:if>
</body>


网页导入、重定向标签

之前学过了两种包括其他JSP网页至目前网页的方法,一个是include指示元素,另一个时
<jsp:include>
标签。用法如下:

include指示元素:

<%@include file="/WEB-INF/jspf/header.jspf"%>


<jsp:include>
标签:

<jsp:include page="add.jsp">
<jsp:param name="a" value="1" />
<jsp:param name="b" value="2" />
</jsp:include>


在JSTL中,有个
<c:import>
标签,可以视作是
<jsp:include>
标签的加强版,它可以在运行时动态导入另一个网页,也可以搭配
<c:param>
在导入另一网页时带有参数,例如:

<c:import url="add.jsp">
<c:param name="a" value = "1" />
<c:param name="b" value = "2" />
</c:import>


除了可以导入当前web应用程序中的网页之外,该标签还可以导入非目前web应用程序中的网页。例如:

<c:import url="http://chuxing.club" charEncoding="utf-8" />


其中charEncoding用来指定要导入的网页的编码,如果要被导入的网页编码与目前的网页编码不同,就必须使用charEncoding属性加以指定,导入的网页才不至于产生乱码。

<c:redirect>
标签的作用如同sendRedirect()方法,如果重定向时需要参数,也可以通过
<c:param>
来设置。

<c:redirect url="add.jsp">
<c:param name="a" value = "1" />
<c:param name="b" value = "2" />
</c:redirect>


属性处理与输出标签

JSP的
<jsp:setProperty>
功能有限,只能用来设置JavaBean的属性,如果只是要在page、request、session、application等范围内设置一个属性,或者想要设置Map对象的键与值,则可以使用
<c:set>
标签。

例如,用户登录后再session范围内设置一个“login”属性,代表用户已经登录,则可以按如下编写:

<c:set var="login" value="abc" scope="session" />


这段标签的作用相当于

<% session.setAttribute("login", "abc"); %>


也可以使用EL来设置value,例如:

<c:set var="login" value="${user}" scope="session" />


<c:set>
标签也可以将value的设置改为主体的方式,在所要设置的属性值冗长时,采用主体的方式会比较容易编写,例如:

<c:set var="details" scope="session">
abc,chuxing.club,abc.chuxing.club
</c:set>


<c:set>
标签不设置scope时,就会从page、request、session、application的范围寻找属性名称,如果在某个范围内找到属性名称,则在该范围设置属性。如果所有范围都没有找到属性名称,则会在page范围内添加属性。如果要移除某个属性,则可以使用
<c:remove>
标签。例如:

<c:remove var="login" scope="session" />


<c:set>
标签也可以直接用来设置JavaBean或Map对象的键值,此时必须使用target属性进行设置,例如:

<c:set target="${user}" property="name" value="${param.name}" />


<c:out>
标签可以用来输出指定的文字。例如:

<c:out value="${param.message}">


以上代码与直接写
${param.message}
的区别在于,
<c:out>
标签会自动将角括号、单引号、双引号等字符用替代字符替换,这个功能是
<c:out>
标签的escapeXml属性来控制的,默认为true;如果设置为false,就不会做字符的替换。还可以使用default属性设置EL运算结果为null时的默认显示值。

<c:out value="${param.a}" default="0" />


URL处理标签

response的encodeURL()方法可以用来做URL重写,在用户关闭Cookie功能时,仍可以继续利用URL重写来维持使用session进行会话管理。

也可以使用JSTL的
<c:url>
,它会在用户关闭Cookie的功能时,自动用Session ID做URL重写。

<body>
<a href="<c:url value='count.jsp' />">升序</a>
</body>


如果要在URL上携带参数,则可以搭配
<c:param>
标签,参数将被编码后附加在URL上,例如,就以下这个片段而言,最后的URL将成为
some.jsp?name=chu+xing


<c:url value="some.jsp">
<c:param name="name" value="chu xing" />
</c:url>
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: