[Servlet&JSP] JSTL的使用

  1. 云栖社区>
  2. 博客>
  3. 正文

[Servlet&JSP] JSTL的使用

shy丶gril 2016-05-18 11:59:55 浏览1440
展开阅读全文

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

JSTL简介

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

  1. 核心标签库
    提供条件判断、属性访问、URL处理及错误处理等标签。
  2. 格式标签库
    提供数字、日期等的格式化功能,以及区域(Locale)、信息、编码处理等国际化功能的标签。
  3. SQL标签库
    提供基本的数据库查询、更新、设置数据源等功能的标签。
  4. XML标签库
    提供XML剖析、流程控制、转换等功能的标签。
    5.函数标签库
    提供用于字符串处理的自定义EL函数标签库

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

  1. JSTL下载
    网址:http://tomcat.apache.org/taglibs/standard/
    版本: Standard 1.1.2
  2. 配置
    解压下载文件jakarta-taglibs-standard-1.1.2.zip,将lib目录下的jstl.jar和standard.jar复制到项目的WEB-INF/lib目录下。
  3. 使用
    在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

网友评论

登录后评论
0/500
评论
shy丶gril
+ 关注