我们可以使用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>
转载:http://blog.csdn.net/foreverling/article/details/50342543