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>

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

posted @ 2011-10-30 19:30  liuping  阅读(1851)  评论(0编辑  收藏  举报