JSTL标签和EL表达式

JSTL(JavaServer Pages Standard Tag Library)是JSP的标准标签库,它提供了一组JSP自定义标签,用于简化和增强JSP页面的开发。JSTL包含了多个标签库,每个标签库都有不同的功能,例如核心功能、格式化和国际化、XML处理、SQL数据库访问等。通过结合JSTL和EL(Expression Language),开发人员可以在JSP页面中以一种更简洁和模块化的方式编写代码,从而提高开发效率和代码质量。不过在实际开发中,我们通常使用MVC模式开发JavaWeb程序,JSP作为生成Web页面的模板引擎主要还是使用条件渲染、循环渲染等核心功能,很少使用到JSTL的其它非核心标签库。

这篇笔记我们主要介绍JSTL核心标签库的使用。

引入JSTL依赖

在Maven的pom.xml中我们需要引入JSTL的依赖,当前JSTL的最新版本的1.2,这部分并没有被包含在JavaEE SDK中。

<dependency>
    <groupId>javax.servlet</groupId>
    <artifactId>jstl</artifactId>
    <version>1.2</version>
</dependency>

核心标签介绍

JSTL中最常用的就是核心标签库,其余标签库很少使用。核心标签也就是能够让JSP作为模板引擎使用的那部分标签,包含了输出、条件渲染、循环渲染等核心功能,我们可以使用如下taglib指令在JSP页面上引入核心标签库。

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

注意:其中prefix="c"是我们自定义的一个前缀名字,用于引用标签库中的标签,核心标签通常惯用的写法是c,取Core的意思。

out 显示数据

<c:out>标签用于显示一个变量到页面上。

<c:out value="<string>" default="<string>" escapeXml="<true|false>"/>
  • value 输出内容
  • default 输出默认值
  • escapeXml 是否转义XML特殊字符,默认true,转义XML特殊字符能够一定程度上防御XSS攻击,一般来说仅在展示富文本信息时才会将其设置为false

例子:

<c:out value="${user.username}" />

set 保存数据

<c:set>标签用于设置变量供后续使用。

<c:set
   var="<string>"
   value="<string>"
   target="<string>"
   property="<string>"
   scope="<string>"/>
  • value 要存储的值
  • target 要修改的属性所属的对象
  • property 要修改的属性
  • var 存储信息的变量
  • scope var属性所属的作用域,默认为page作用域

例子:

<c:set value="hello" var="str" />

remove 删除数据

<c:remove>标签用于移除已经设置的变量。

<c:remove var="<string>" scope="<string>"/>
  • var 要移除的变量名称
  • scope 所属作用域,默认是所有作用域

catch 处理异常

<c:catch>标签用于异常处理。

<c:catch var="<string>">
</c:catch>
  • var 用来存储错误信息的变量

if 条件分支

<c:if>标签用于条件渲染,它接收一个EL表达式作为条件,决定是否显示内部的内容。

<c:if test="<boolean>" var="<string>" scope="<string>">
</c:if>
  • test EL表达式的值为true显示主体内容
  • var 存储条件结果的变量
  • scope var的作用域,默认为page作用域

例子:

<c:if test="${sessionScope.user != null}">
    <li><a href="http://www.gacfox.com">博客</a></li>
    <li><a href="${pageContext.request.contextPath}/logout">退出系统</a></li>
</c:if>

choose条件分支

<c:choose>标签的作用类似switch...case语句,由于JSP核心标签里没有“else”,因此实际开发中<c:choose><c:if>更加常用。

<c:choose>
    <c:when test="<boolean>"/>
    </c:when>
    <c:when test="<boolean>"/>
    </c:when>
    <c:otherwise>
    </c:otherwise>
</c:choose>
  • test EL表达式判断条件,为true显示内部的内容

forEach迭代

<c:forEach>用于实现循环渲染。

<c:forEach
    items="<object>"
    begin="<int>"
    end="<int>"
    step="<int>"
    var="<string>"
    varStatus="<string>">
</c:forEach>
  • items 被迭代的变量
  • begin 起始索引
  • end 终止索引
  • step 迭代步长
  • var 当前条目的变量名称
  • varStatus 循环的状态变量

例子:

<table border="1">
    <c:forEach items="${collection}" var="v">
        <tr>
            <td><c:out value="${v}"/></td>
        </tr>
    </c:forEach>
</table>

关于EL表达式

EL是JavaEE规范中的一种表达式语言,它可以访问JSP中的变量或动态计算变量的值。JSP中嵌入EL表达式的格式为${},EL表达式提供了.[]运算符,写法形如${user.username}${user[2]},其中[]内可以是数组的索引值也可以是一个变量,用于动态取值。

EL表达式中可以使用丰富的运算符来进行数学运算、逻辑运算、关系运算等,包括:

数学运算符:+ - * /或div %或mod

关系运算符:==或eq !=或ne <或lt >或gt <=或le >=或ge

逻辑运算符:&&或and ||或or !或not

empty运算符:empty

三目运算符::?

关于EL表达式中变量的作用域,如果EL表达式中不明确指定变量的作用域,它会依次从page、request、session、application中查找该变量,也可以用pageScoperequestScopesessionScopeapplicationScope明确指定变量的作用域,例如${requestScope.user.username}

JSP中的其它隐式对象

JSP中除了之前介绍过的9大内置对象,还有一些隐式对象。

cookie

通过EL表达式可以直接读取Cookie值。

下面例子中,我们获得了cookie对象、cookie键和cookie值并打印出来。

<c:out value="${cookie.username}" />
<c:out value="${cookie.username.name}" />
<c:out value="${cookie.username.value}" />

header

通过EL表达式可以读取请求头信息,下面是一个例子。

<c:out value="${header['User-Agent']}" />

如果请求头中一个键对应多个值,可以用headerValues属性。

initParam

initParam隐式对象相当于application.getInitParam(),不常用。

pageContext

pageContext即JSP页面上下文,用于取得一些页面的其他信息。

下面是一些常见的例子。

  • ${pageContext.request.queryString} 取得请求的参数字符串
  • ${pageContext.request.requestURL} 取得请求的URL,但不包括请求之参数字符串
  • ${pageContext.request.contextPath} 服务的web application 的名称
  • ${pageContext.request.method} 取得HTTP 的方法(GET、POST)
  • ${pageContext.request.protocol} 取得使用的协议(HTTP/1.1、HTTP/1.0)
  • ${pageContext.request.remoteUser} 取得用户名称
  • ${pageContext.request.remoteAddr} 取得用户的IP 地址
  • ${pageContext.session.new} 判断session 是否为新的
  • ${pageContext.session.id} 取得session 的ID
  • ${pageContext.servletContext.serverInfo} 取得主机端的服务信息
作者:Gacfox
版权声明:本网站为非盈利性质,文章如非特殊说明均为原创,版权遵循知识共享协议CC BY-NC-ND 4.0进行授权,转载必须署名,禁止用于商业目的或演绎修改后转载。
Copyright © 2017-2024 Gacfox All Rights Reserved.
Build with NextJS | Sitemap