JSP EL表达式&标签库

EL表达式的基本语法及运算符

EL 是 JSP 2.0 规范中新增加的,它的基本语法如下:

${表达式}

EL 表达式类似于 JSP 表达式 <%=表达式%>,EL 语句中的表达式值会被直接送到浏览器显示,通过 page 指令的 isELIgnored 属性来说明是否支持 EL 表达式。

当 isELIgnored 属性值为 false 时,JSP 页面可以使用 EL 表达式,当 isELIgnored 属性值为 true 时,JSP 页面不能使用 EL 表达式。isELIgnored 属性值默认为 false。

EL 的语法简单、使用方便,它以${开始、以}结束。

1. “[]”与“.”运算符

EL 使用“[]”和“.”运算符来访问数据,主要使用 EL 获取对象的属性,包括获取 JavaBean 的属性值、获取数组中的元素以及获取集合对象中的元素。

对于 null 值直接以空字符串显示,而不是 null,在运算时也不会发生错误或空指针异常,所以在使用 EL 访问对象的属性时不需要判断对象是否为 null 对象,这样就为编写程序提供了方便。
1)获取 JavaBean 的属性值
假设在 JSP 页面中有这样一句话:

<%=user.getAge()%>

那么可以使用 EL 获取 user 对象的属性 age,代码如下:

${user.age}

或
${user["age"]}

其中,点运算符前面为 JavaBean 的对象 user,后面为该对象的属性 age,表示利用 user 对象的 getAge 方法取值并显示在网页上。
2)获取数组中的元素
假设在 Controller 或 Servlet 中有这样一段话:

String dogs[] = {"lili","huahua","guoguo"};
request.setAttribute("array",dogs);

那么在对应视图 JSP 中可以使用 EL 取出数组中的元素,代码如下:

${array[0]}
${array[1]}
${array[2]}

3)获取集合对象中的元素
假设在 Controller 或 Servlet 中有这样一段话:

ArrayList<UserBean> users = new ArrayList<UserBean>();
UserBean ub1 = new UserBean("zhang",20);
UserBean ub2 = new UserBean("zhao",50);
users.add(ub1);
users.add(ub2);
request.setAttribute("array",users);

其中,UserBean 有两个属性 name 和 age,那么在对应视图 JSP 页面中可以使用 EL 取出 UserBean 中的属性,代码如下:

${array[0].name} ${array[0].age}
${array[1].name} ${array[1].age}

2. 算术运算符

在这里插入图片描述

3. 关系运算符

在 EL 表达式中有 6 个关系运算符,如表 2 所示。在这里插入图片描述

4. 逻辑运算符

在 EL 表达式中有 3 个逻辑运算符,如表 3 所示。在这里插入图片描述

5. empty 运算符

empty 运算符用于检测一个值是否为 null,例如变量 A 不存在,则 ${empty A} 返回的结果为 true。

6. 条件运算符

EL 中的条件运算符是“? :”,例如 ${A ? B:C},如果 A 为 true,计算 B 并返回其结果,如果 A 为 false,计算 C 并返回其结果。

EL表达式常用隐含对象

EL 隐含对象共有 11 个,本节只介绍几个常用的 EL 隐含对象,即 pageScope、requestScope、sessionScope、applicationScope、param 以及 paramValues。
1)与作用范围相关的隐含对象
与作用范围相关的 EL 隐含对象有 pageScope、requestScope、sessionScope 和 applicationScope,分别可以获取 JSP 隐含对象 pageContext、request、session 和 application 中的数据。

如果在 EL 中没有使用隐含对象指定作用范围,则会依次从 page、request、session、application 范围查找,若找到就直接返回,不再继续找下去;如果所有范围都没有找到,就返回空字符串。获取数据的格式如下:

${EL隐含对象.关键字对象.属性}

或
${EL隐含对象.关键字对象}

例如:

<jsp:useBean id="user" class="bean.UserBean" scope="page"/><!--bean标签-->
<jsp:setProperty name="user" property="name" value="EL隐含对象"/>
name:${pageScope.user.name}

再如,在 Controller 或 Servlet 中有这样一段话:

ArrayList<UserBean> users = new ArrayList<UserBean>();
UserBean ub1 = new UserBean("zhang",20);
UserBean ub2 = new UserBean("zhao",50);
users.add(ub1);
users.add(ub2);
request.setAttribute("array",users);

其中,UserBean 有两个属性 name 和 age,那么在对应视图 JSP 中 request 有效的范围内可以使用 EL 取出 UserBean 的属性,代码如下:

${array[0].name} ${array[0].age}
${array[1].name} ${array[1].age}

2)与请求参数相关的隐含对象
与请求参数相关的 EL 隐含对象有 param 和 paramValues。获取数据的格式如下:
${EL隐含对象.参数名}

例如,input.jsp 的代码如下:

<form method="post" action="param.jsp">
    <p>
        姓名:<input type="text" name="username" size=" 15" />
    </p>
    <p>
        兴趣:
        <input type="checkbox" name="habit" value="看书" />看书
        <input type="checkbox" name="habit" value="玩游戏"/>玩游戏
        <input type="checkbox" name="habit" value="旅游"/>旅游
    </P>
        <input type="submit" value="提交" />
</form>

那么在 param.jsp 页面中可以使用 EL 获取参数值,代码如下:

<%request.setCharacterEncoding("GBK");%>
<body>
<h2>EL隐含对象param、paramValues</h2>
姓名:${param.username}</br>
兴趣:
${paramValues.habit[0]}
${paramValues.habit[1]}
${paramValues.habit[2]}

示例

编写一个 Controller,在该控制器类处理方法中使用 request 对象和 Model 对象存储数据,然后从处理方法转发到 show.jsp 页面,在 show.jsp 页面中显示 request 对象的数据。

运行控制器的处理方法,在 IE 地址栏中输入“http://localhost:8080/springMVCDemo11/input”。程序运行结果如图 1 所示。
在这里插入图片描述
实现具体步骤如下:
1)创建控制器类
在 src 目录下创建一个名为 controller 的包,并在该包下创建一个名为 InputController 的控制器类。代码如下:

package controller;
import javax.servlet.http.HttpServletRequest;
import org.springframework.stereotype.Controller;
import org.springframework.ui.Model;
import org.springframework.web.bind.annotation.RequestMapping;
@Controller
public class InputController {
    @RequestMapping("/input")
    public String input(HttpServletRequest request, Model model) {
        String names[] = { "zhao", "qian", "sun", "li" };
        request.setAttribute("name", names);
        String address[] = { "beijing", "shanghai", "shenzhen" };
        model.addAttribute("address", address);
        return "show";
    }
}

2)创建 show.jsp 页面
在 WEB-INF 目录下创建 jsp 文件夹,在该文件夹中创建 show.jsp 页面。代码如下:

<%@ page language="java" contentType="text/html; charset=UTF-8"
    pageEncoding="UTF-8"%>
<!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>Insert title here</title>
</head>
<body>
    从Controller转发过来的request内置对象的数据如下:
    <br> ${requestScope.name[0]}
    <br> ${requestScope.name[1]}
    <br> ${requestScope.name[2]}
    <br> ${requestScope.name[3]}
    <br>
    <hr>
    从Controller转发过来的Model对象的数据如下:
    <br> ${address[0]}
    <br> ${address[1]}
    <br> ${address[2]}
    <br>
</body>
</html>

JSP标准标签库(JSTL)

JSTL 规范由 Sun 公司制定,由 Apache 的 Jakarta 小组负责实现。JSTL 由 5 个不同功能的标签库组成,包括 Core、I18N、XML、SQL 以及 Functions,本节只简要介绍 JSTL 的 Core 和 Functions 标签库中几个常用的标签。

配置 JSTL

JSTL 现在已经是 Java EE5 的一个组成部分,如果采用支持 Java EE5 或以上版本的集成开发环境开发 Web 应用程序,就不需要再配置 JSTL 了。

如果你再用的是 Eclipse 平台,则需要配置 JSTL。配置 JSTL 的步骤如下:
1)复制 JSTL 的标准实现
在 Tomcat 的 \webapps\examples\WEB-INF\lib 目录下找到 taglibs-standard-impl-1.2.5.jar 和 taglibs-standard-spec-1.2.5.ja r文件,然后复制到 Web 工程的 WEB-INF\lib 目录下。
2)使用 taglib 标记定义前缀与 uri 引用
如果使用 Core 标签库,首先需要在 JSP 页面中使用 taglib 标记定义前缀与 uri 引用,代码如下:

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

如果使用 Functions 标签库,首先需要在 JSP 页面中使用 taglib 标记定义前缀与 uri 引用,代码如下:

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

核心标签库之通用标签

1. <c:out> 标签
<c:out> 标签用来显示数据的内容,与 <%=表达式%> 或 ${表达式} 类似。格式如下:

<c:out value="输出的内容" [default="defaultValue"]/><c:out value="输出的内容">
    defaultValue
</c:out>

其中,value 值可以是一个 EL 表达式,也可以是一个字符串;default 可有可无,当 value 值不存在时输出 defaultValue。例如:

<c:out value="${param.data}" default="没有数据"/>
<br>
<c:out value="${param.nothing}"/>
<br>
<c:out value="这是一个字符串"/>

程序输出的结果如图 1 所示。
在这里插入图片描述
2. <c:set>标签
1)设置作用域变量
用户可以使用 <c:set> 在 page、request、session、application 等范围内设置一个变量。格式如下:

<c:set value="value" var="varName"[scope="page|request|session|application"]/>

该代码将 value 值赋给变量 varName。

<c:set value="zhao" var="userName" scope="session"/>

相当于
<%session.setAttribute("userName","zhao");%>

2)设置 JavaBean 的属性
在使用 <c:set> 设置 JavaBean 的属性时必须使用 target 属性进行设置。格式如下:

<c:set value="value" target="target" property="propertyName"/>

该代码将 value 值赋给 target 对象(JaveBean 对象)的 propertyName 属性。如果 target 为 null 或没有 set 方法则抛出异常。
3. <c:remove>标签
如果要删除某个变量,可以使用 <c:remove> 标签。例如:

<c:remove var="userName" scope="session"/>

相当于
<%session.removeAttribute("userName")%>

核心标签库之流程控制标签

1. <c:if> 标签
<c:if> 标签实现 if 语句的作用,具体语法格式如下:

<c:if test="条件表达式">
    主体内容
</c:if>

其中,条件表达式可以是 EL 表达式,也可以是 JSP 表达式。如果表达式的值为 true,则会执行 <c:if> 的主体内容,但是没有相对应的 <c:else> 标签。如果想在条件成立时执行一块内容,不成立时执行另一块内容,可以使用 <c:choose>、<c:when> 及 <c:otherwise> 标签。
2. <c:choose>、<c:when>及<c:otherw ise>标签
<c:choose>、<c:when> 及 <c:otherwise> 标签实现 if/elseif/else 语句的作用,具体语法格式如下:

<c:choose>
    <c:when test="条件表达式1">
        主体内容1
    </c:when>
    <c:when test="条件表达式2">
        主体内容2
    </c:when>
    <c:otherwise>
        表达式都不正确时执行的主体内容
    </c:otherwise>
</c:choose>

核心标签库之迭代标签

1. <c:forEach> 标签
<c:forEach> 标签可以实现程序中的 for 循环。语法格式如下:
<

c:forEach var="变量名" items="数组或Collection对象">
    循环体
</c:forEach>

其中,items 属性可以是数组或 Collection 对象,每次循环读取对象中的一个元素,并赋值给 var 属性指定的变量,之后就可以在循环体中使用 var 指定的变量获取对象的元素。例如,在 Controller 或 Servlet 中有这样一段代码:

ArrayList<UserBean> users=new ArrayList<UserBean>();
UserBean ub1=new UserBean("zhao",20);
UserBean ub2=new UserBean("qian",40);
UserBean ub3=new UserBean("sun",60);
UserBean ub4=new UserBean("li",80);
users.add(ub1);
users.add(ub2);
users.add(ub3);
users.add(ub4);
request.setAttribute("usersKey", users);

那么在对应 JSP 页面中可以使用 <c:forEach> 循环遍历出数组中的元素。代码如下:

<table>
    <tr>
        <th>姓名</th>
        <th>年龄</th>
    </tr>
    <c:forEach var="user" items="${requestScope.usersKey}">
        <tr>
            <td>${user.name}</td>
            <td>${user.age}</td>
        </tr>
    </c:forEach>
</table>

在有些情况下需要为 <c:forEach> 标签指定 begin、end、step 和 varStatus 属性。begin 为迭代时的开始位置,默认值为 0。

  • end 为迭代时的结束位置,默认值是最后一个元素。
  • step 为迭代步长,默认值为 1。
  • varStatus 代表迭代变量的状态,包括 count(迭代的次数)、index(当前迭代的索引,第一个索引为0)、first(是否为第一个迭代对象)和 last(是否为最后一个迭代对象)。
    例如:
<%@ 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 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>Insert title here</title>
</head>
<body>
    <table border=1>
        <tr>
            <th>Value</th>
            <th>Square</th>
            <th>Index</th>
        </tr>
        <c:forEach var="x" varStatus="status" begin="0" end="10" step="2">
            <tr>
                <td>${x }</td>
                <td>${x*x }</td>
                <td>${status.index }</td>
            </tr>
        </c:forEach>
    </table>
</body>
</html>

在这里插入图片描述
2. <c:forTokens> 标签
<c:forTokens> 用于迭代字符串中由分隔符分隔的各成员,它通过 java.util.StringTokenizer 实例来完成字符串的分隔,属性 items 和 delims 作为构造 StringTokenizer 实例的参数。语法格式如下:

<c:forTokens var="变量名" items="要迭代的String对象" delims="指定分隔字符串的分隔符">
    循环体
</c:forTokens>

例如:

<c:forTokens var="name" items="chenheng1:chenheng2:chenheng3" delims=":">
    ${name}<br>
</c:forTokens>

上述程序的运行结果如图 3 所示。
在这里插入图片描述
<c:forTokens> 标签与 <c:forEach> 标签一样,也有 begin、end、step 和 varStatus 属性,并且用法相同,这里不再赘述。

JSP函数标签库

在 JSP 页面中调用 JSTL 中的函数时需要使用 EL 表达式,调用语法格式如下:

${fn:函数名(参数1,参数2,...)}

下面介绍几个常用的函数。
1)contains函数
该函数的功能是判断一个字符串中是否包含指定的子字符串,如果包含,则返回 true,否则返回 false。其定义如下:

contains(string,substring)

该函数的调用示例代码如下:

${fn:contains("I am studying","am")}

上述 EL 表达式将返回 true。
2)contain sIgnoreCase函数
该函数与 contains 函数的功能相似,但判断是不区分大小写的。其定义如下:

containsIgnoreCase(string,substring)

该函数的调用示例代码如下:

${fn:containsIgnoreCase("I AM studying","am")}

上述 EL 表达式将返回 true。
3)endsWith 函数
该函数的功能是判断一个字符串是否以指定的后缀结尾。其定义如下:

endsWith(string,suffix)

该函数的调用示例代码如下:

${fn:endsWith("I AM studying","am")}

上述 EL 表达式将返回 false。
4)indexOf 函数
该函数的功能是返回指定子字符串在某个字符串中第一次出现时的索引,找不到时将返回 −1。其定义如下:

indexOf(string,substring)

该函数的调用示例代码如下:

${fn:indexOf("I am studying","am")}

上述 EL 表达式将返回 2。
5)join 函数
该函数的功能是将一个 String 数组中的所有元素合并成一个字符串,并用指定的分隔符分开。其定义如下:

join(array,separator)

例如,假设一个 String 数组 my,它有 3 个元素,即“I”“am”和“studying”,那么下列 EL 表达式将返回“I, am, studying”。
${fn:join(my,",")}

6)length 函数
该函数的功能是返回集合中元素的个数或者字符串中字符的个数。其定义如下:

length(input)

该函数的调用示例代码如下:

${fn:length("aaa")}

上述 EL 表达式将返回 3。
7)replace 函数
该函数的功能是将字符串中出现的所有 beforestring 用 afterstring 替换,并返回替换后的结果。其定义如下:

replace(string,beforestring,afterstring)

该函数的调用示例代码如下:

${fn:replace("I am am studying","am","do")}

上述 EL 表达式将返回“I do do studying”。
8)split 函数
该函数的功能是将一个字符串使用指定的分隔符 separator 分离成一个子字符串数组。其定义如下:

该函数的调用示例代码如下:

<c:set var="my" value="${fn:split('I am studying','')}"/>
<c:forEach var="myArrayElement" items="${my}">
    ${myArrayElement}</br>
</c:forEach>

上述示例代码的显示结果如图 1 所示。
9)startsWith函数
该函数的功能是判断一个字符串是否以指定的前缀开头。其定义如下:

startsWith(string,prefix)

该函数的调用示例代码如下:

${fn:startsWith("I AM studying","am")}

上述 EL 表达式将返回 false。
10)substring 函数
该函数的功能是返回一个字符串的子字符串。其定义如下:

substring(string,begin,end)

该函数的调用示例代码如下:

${fn:substring("abcdef",1,3)}

上述 EL 表达式将返回“bc”。
11)toLowerCase函数
该函数的功能是将一个字符串转换成它的小写版本。其定义如下:

toLowerCase(string)

该函数的调用示例代码如下:

${fn:toLowerCase("I AM studying")}

上述 EL 表达式将返回"i am studying"。
12)toUpperCase 函数
该函数的功能与 toLowerCase 函数的功能相反,这里不再赘述。
13)trim 函数
该函数的功能是将一个字符串开头和结尾的空白去掉。其定义如下:

trim(string)

该函数的调用示例代码如下:

${fn:trim("I AM studying")}

上述 EL 表达式将返回“I AM studying”。

内容出处http://c.biancheng.net/view/4493.html

发布了96 篇原创文章 · 获赞 396 · 访问量 6208

猜你喜欢

转载自blog.csdn.net/Bonport/article/details/105162704
今日推荐