JSP--使用JSTL
JSP提供了<jsp:xxx>开头的标准标签及EL,可用来减少JSP页面上的Scriptlet的使用,将请求相关与业务逻辑封装到Servlet或JavaBean中,网页上仅留下与页面显示相关的逻辑。但即使是这样,依然使网页设计与维护困难重重。我们可以使用JSTL来替换JSP中用来实现页面逻辑的Scriptlet让网页上使用与HTML类似的标签,使得设计变得简单。
1.核心标签库
JSTL的标签种类很多,下面将主要介绍JSTL的核心标签库。要使用核心标签库必须在JSP上使用taglib指令定义前置名称以及uri引用。
<%@taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core"%>
流程处理标签
<c:if>
<%@page contentType="text/html" pageEncoding="UTF-8"%>
<%@taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core"%>
<!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>登录页面</title>
</head>
<body>
<c:if test="<%= true %>">
<h1>${param.name} 登录成功</h1>
</c:if>
</body>
</html>
<c:if>标签仅在test属性的结果为true时,显示主题内容,不过没有相应的<c:else>标签,如果想实现if else结构可以使用<c:choose>、<c:when>和<c:otherwise>标签。
<%@page contentType="text/html" pageEncoding="UTF-8"%>
<%@taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core"%>
<jsp:useBean id="user" class="cc.openhome.User"/>
<jsp:setProperty name="user" property="*"/>
<!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>登录页面</title>
</head>
<body>
<c:choose>
<c:when test="${user.valid}">
<h1><jsp:getProperty name="user" property="name"/>登录成功</h1>
</c:when>
<c:otherwise>
<h1>登录失败</h1>
</c:otherwise>
</c:choose>
</body>
</html>
<c:when>和<c:otherwise>必须放在<c:choose>之中。<c:when>的test运算为true时,会输出<c:when>的主体内容,可以有多个<c:when>,此时会依次进行测试,遇到test结果为true就输出,之后的<c:when>不会测试,如果所有<c:when>都不成立,就输出<c:otherwise>。
<c:forEach>标签用来实现for循环。
<%@page contentType="text/html" pageEncoding="UTF-8"%>
<%@taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core"%>
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN"
"http://www.w3.org/TR/html4/loose.dtd">
<jsp:useBean id="messageService" class="cc.openhome.MessageService"/>
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
<title>留言版</title>
</head>
<body>
<table style="text-align: left; width: 100%;" border="1">
<tr><td>名称</td><td>信息</td></tr>
<c:forEach var="message" items="${messageService.messages}">
<tr><td>${message.name}</td><td>${message.text}</td></tr>
</c:forEach>
</table>
</body>
</html>
<c:forEach>标签的items属性可以是数组或Collection对象,每次会循序读取数组或Collection对象的一个元素,并指定给var属性所设置的变量,之后可以使用变量取得元素。
<c:forTokens>的使用
<c:forTokens var="token" delims="," items="java,c++,c,javascript">
S{token}<br>
</c:forTokens>
错误处理标签
<c:catch>标签
<%@page contentType="text/html" pageEncoding="UTF-8"%>
<%@taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core"%>
<!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>加法网页</title>
</head>
<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>
</html>
可以使用<c:catch>将可能产生异常的段落包起来,如果异常真的发生,这个异常对象会设置给var属性所指定的变量。
网页导入、重定向标签
<c:import>的使用
<c:import url="add.jsp">
<c:param name="a" value="1" />
<c:param name="b" value="2" />
</c:import>
还可以导入非当前web应用的网页
<c:import url="http://openhome.cc " charEncoding="BIG5" />
<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>标签
<c:set var="login" value="hopestar" scope="session">
相当于:
<% sessinn.setAttribute("login", "hopestar"); %>
不设置scope时,会从page、request、session、application的范围内寻找属性名称,如果找到,则设置属性。如果没找到,则会在page范围中添加属性。<c:set>也可以直接来设置JavaBean的属性或Map对象的键/值。
<c:set target="${user}" proeprty="name" value="${param.name}" />
如果${user}运算结果是个JavaBean,则调用setName()将请求参数name的值传入。如果运算结果是个Map,则上例就是以proeprty属性作为键,以value作为值调用Map对象的put()方法。
<c:out value="${param.message}" />
为什么不直接写${param.message},如果${param.message}来自于用户的留言板,而用户故意留下了HTML,则<c:out>会自动将角括号、引号等用替代字符替代。另外,EL的运算结果为null时不显示任何值,如果想显示一个默认值,可以这么做:
<c:out value="${param.a}" default="0" />
URL处理标签
<c:url>的用法
<c:url value="some.jsp">
<c:param name="username" value="hopestar">
</c:url>