文章目录
EL表达式
EL表达式,简称EL,是Java中的一种特殊的通用编程语言,借鉴于JavaScript和XPath。主要作用是在Java Web应用程序嵌入到网页(如JSP)中,用以访问页面的上下文以及不同作用域中的对象 ,取得对象属性的值,或执行简单的运算或判断操作。EL在得到某个数据时,会自动进行数据类型的转换。
语法
${ }
{ }
中可以是变量,常量,变量和常量以及运算符组合形成的式子。
运算符
算数运算符
+
-
*
/
%
EL表达式支持常见的算数运算符。
示例:
${1+1}
${2-1}
${1*2}
${10/2}
${10%3}
运行结果:
2 1 2 5.0 1
关系运算符
>
>=
<
<=
==
!=
示例:
${2>1} ${1<2}
${2>=2} ${1<=2}
${1==1} ${1!=2}
运行结果:
true true true true true true
逻辑运算符
&&
||
!
示例:
${2>1 && 1!=2}
${2>1 || 1<2}
${!(1>2)}
运行结果:
true true true
三目运算符
a?b:c
示例:
<%int a = 1;int b =2;%>
${a>b?"大":"小"}
运行结果:
小
非空运算符empty
常见的有以下几种情况:
- empty 对象:判断对象是否为空,对象为空
- empty 字符串:判断字符串是否为空(即字符串的长度是否大于0)
- empty list列表 :判断列表长度是否大于0,如果大于0结果为false等于0,结果true
示例:
<%@ page import="java.util.*"%>
<%
request.setAttribute("i", null);
request.setAttribute("s", "");
List<String> list = new ArrayList<String>();
list.add("Hello world!");
request.setAttribute("list", list);
%>
${empty i }
${empty s }
${empty list }
运行结果:
true true false
[]与.运算符
EL 提供.
和[]
两种运算符来存取数据。
当要存取的属性名称中包含一些特殊字符,如.或?等并非字母或数字的符号,就一定要使用 []。
例如:
${user.My-Name}应当改为${user["My-Name"] }
如果要动态取值时,就可以用[]来做,而.无法做到动态取值。例如:
${sessionScope.user[data]}
中data 是一个变量。
EL四大作用域对象
Servlet三大作用域对象:
- HttpServletRequest
- HttpSession
- ServletContext
JSP四大作用域对象:
- pageContext
- request
- session
- application
JSP四大作用域对象在EL中的表示:
JSP | EL | 作用范围 |
---|---|---|
pageContext | pageScope | 当前页面有效 |
request | requestScope | 一次请求有效 |
session | sessionScope | 一次会话有效 |
application | applicationScope | 整个应用运行期间有效 |
el表达式获取作用域对象中的值语法: ${作用域.变量名 或者(对象名.属性名)}
实例:
<%
pageContext.setAttribute("name", "page");
request.setAttribute("name", "request");
session.setAttribute("name", "session");
application.setAttribute("name", "app");
%>
${pageScope.name}
${requestScope.name}
${sessionScope.name}
${applicationScope.name}
运行结果:
page request session app
如果不指定作用域直接用变量名取值,比如${name}
,那么获取数据的顺序是:
pageContext——request——session——application。如果四个作用域对象都没有相应的数据,那么就返回null,而EL会自动将null处理成字符串,所以页面会显示空白。
- 示例:
// 打乱上面存值的顺序
<%
session.setAttribute("name", "session");
application.setAttribute("name", "app");
pageContext.setAttribute("name", "page");
request.setAttribute("name", "request");
%>
// 不指定直接作用域,直接用变量名取值
${name}
- 运行结果:
page
JSTL标签库
JSP标准标签库(JSTL)(JSP Standard Tag Library)是一个JSP标签集合,它封装了JSP应用的通用核心功能。
JSTL支持通用的、结构化的任务,比如迭代,条件判断,XML文档操作,国际化标签,SQL标签。
使用JSTL标签库需要引入两个jar包:standard.jar 和 jstl.jar 文件拷贝到 /WEB-INF/lib/ 下。
核心标签
核心标签是最常用的JSTL标签,引入核心标签的语法是:
<%@ taglib uri="http://java.sun.com/jsp/jstl/core" prefix="c" %>
通用标签
引入核心标签后,我们先来看最简单的存值标签,取值标签,删值标签。
语法:
<c:set>
<c:out>
<c:remove>
示例:存值与取值
<!-- 存值标签 -->
<!-- 没有设置scope默认数据是保存在page里面 -->
<!-- scope存储范围:page request session application -->
<!-- var表示存储信息的变量;value表示要存储的值;scope表示var属性的作用域-->
<c:set var="username0" value="wangwu"></c:set>
<c:set var="username" value="zhangsan" scope="page"></c:set>
<c:set var="username" value="lisi" scope="session"></c:set>
<c:set var="username" value="zhaoliu" scope="request"></c:set>
<c:set var="username" value="tianqi" scope="application"></c:set>
<!-- 取值标签 -->
<!-- 用EL表达式取 -->
<!-- 不指定scope默认从pageContext----》request---》session--》application取第一个匹配到的数据 -->
<c:out value="${username}"></c:out>
<c:out value="${pageScope.username}"></c:out>
<c:out value="${sessionScope.username}"></c:out>
<c:out value="${requestScope.username}"></c:out>
<c:out value="${applicationScope.username}"></c:out>
运行结果:
zhangsan zhangsan lisi zhaoliu tianqi
删值标签:
<c:remove var="username" scope="page" />
<c:out value="${pageScope.username}" />
<!--pageScope中的username已经被删除,浏览器上什么都不会显示-->
<!-- 不指定scope,会默认删除所有的数据 -->
<c:remove var="username" />
<c:out value="${username}" />
<!--删除所有作用域范围内的username,浏览器页面什么都不显示-->
流程控制标签
- 判断标签
<c:if>
- 判断标签的属性
属性 | 描述 | 是否必要 | 默认值 |
---|---|---|---|
test | 条件 | 是 | 无 |
var | 用于存储条件结果的变量 | 否 | 无 |
scope | var属性的作用域 | 否 | page |
示例:
<c:set var="sex" value="1" scope="page"></c:set>
<!-- 判断sex,值为1就是男,值为0就是女 -->
<c:if test="${sex==0}">女</c:if>
<c:if test="${sex==1}">男</c:if>
运行结果:
男
- 分支标签
这三个标签通常配合使用:
<c:choose>
<c:when>
<c:otherwise>
<c:choose>
标签与Java switch语句的功能一样,用于在众多选项中做出选择。
switch语句中有case,而<c:choose>
标签中对应有<c:when>
,switch语句中有default,而<c:choose>
标签中有<c:otherwise>
。
- 语法格式:
<c:choose>
<c:when test="<boolean>">
...
</c:when>
<c:when test="<boolean>">
...
</c:when>
...
...
<c:otherwise>
...
</c:otherwise>
</c:choose>
- 示例:
<c:set var="score" value="75" scope="page"></c:set>
<c:choose>
<c:when test="${score<60}">没有及格</c:when>
<c:when test="${70>score&&score>=60}">一般</c:when>
<c:when test="${80>score&&score>=70}">良好</c:when>
<c:otherwise>优秀</c:otherwise>
</c:choose>
- 运行结果:
良好
- 循环标签
<c:forEach>
,<c:forTokens>
标签封装了Java中的for,while,do-while循环。相比而言,<c:forEach>
标签是更加通用的标签,因为它迭代一个集合中的对象。<c:forTokens>
标签通过指定分隔符将字符串分隔为一个数组然后迭代它们。
- forEach 语法格式
<c:forEach
items="<object>"
begin="<int>"
end="<int>"
step="<int>"
var="<string>"
varStatus="<string>">
...
- forTokens 语法格式
<c:forTokens
items="<string>"
delims="<string>"
begin="<int>"
end="<int>"
step="<int>"
var="<string>"
varStatus="<string>">
- 属性
<c:forEach>
标签有如下属性:
属性 | 描述 | 是否必要 | 默认值 |
---|---|---|---|
items | 要被循环的信息 | 否 | 无 |
begin | 开始的元素(0=第一个元素,1=第二个元素 | 否 | 0 |
end | 最后一个元素(0=第一个元素,1=第二个元素 | 否 | Last element |
step | 每一次迭代的步长 | 否 | 1 |
var | 代表当前条目的变量名称 | 否 | 无 |
varStatus | 代表循环状态的变量名称 | 否 | 无 |
<c:forTokens>
标签与<c:forEach>
标签有相似的属性,不过<c:forTokens>
还有另一个属性:
属性 | 描述 | 是否必要 | 默认值 |
---|---|---|---|
delims | 分隔符 | 是 | 无 |
- 属性值举例:
<c:foreach items="${sessionScope.userList}" var="userItem"
begin="1" end="10" step="3" varStatus="userStatus"> XXX </c:foreach>
解读: 对 session 对象存储的 userList 集合对象进行遍历,每次访问的项暂时存储在 userItem 变量中,从索引 1 开始至索引 10 进行访问,但不是依次访问,每隔 3 个元素访问一次。每次访问项的状态相关值由 userStatus 对象暂存。
- varStatus解读
<c:foreach>
的varStatus
属性暂存项的相关状态属性,可由 EL 表达式引用。
${userStatus.index} 此项的索引,从0开始
${userStatus.count} 此项的计数序号,从1开始
${userStatus.first} 此项是否是第一项,布尔值
${userStatus.last} 此项是否是最后一项,布尔值
${userStatus.begin} 此次迭代的起始索引,对应<c:foreach>中begin属性值
${userStatus.end} 此次迭代的终止索引,对应<c:foreach>中end属性值
${userStatus.step} 此次迭代的跳跃步伐,对应<c:foreach>中step属性值
- 示例一:forEach输出数字1-10:
<c:forEach var="i" begin="1" end="10">
<br/>${i}
</c:forEach>
- 示例二:forEach迭代集合列表:
<%@ page import="java.util.*" %>
<%
List<String> list = new ArrayList<String>();
list.add("hello");
list.add("world!");
pageContext.setAttribute("mylist", list);
%>
<c:forEach var="s" items="${mylist}" >
${s}
</c:forEach>
- 示例三:forEach打印九九乘法表
<c:forEach var="i" begin="1" end="9">
<c:forEach var="j" begin="1" end="${i}">
<span>${j}*${i}=${j*i}</span>
</c:forEach>
<br/>
</c:forEach>
效果展示:
- 示例四:打印九九乘法表,奇数行为红色,偶数行为绿色。
这里我们需要用到这个属性varStatus
(代表循环状态的变量名称)。
<c:forEach var="i" begin="1" end="9" varStatus="row">
<c:forEach var="j" begin="1" end="${i}">
<span
<c:if test="${row.index%2==0}">style="color:red;"</c:if>
<c:if test="${row.index%2!=0}">style="color:green;"</c:if>
>${j}*${i}=${j*i}</span>
</c:forEach>
<br/>
</c:forEach>
效果展示:
- 示例五:forTokens通过指定分隔符将字符串分隔为一个数组然后迭代它们
<c:forTokens items="java;c;c++;python;php" delims=";" var="name">
${name}
</c:forTokens>
运行结果:
java c c++ python php
其他
<c:redirect>
重定向至一个新的URL
示例:
<c:redirect url="new.jsp" context="默认是当前应用程序,你也可以自己指定"/>
<c:url>
该标签将URL格式化为一个字符串,然后存储在一个变量中。这个标签在需要的时候会自动重写URL。var属性用于存储格式化后的URL。<c:url>
标签只是用于调用response.encodeURL()方法的一种可选的方法。它真正的优势在于提供了合适的URL编码,包括<c:param>
中指定的参数。
<c:param>
用来给包含或重定向的页面传递参数
示例:
<h1><c:param> 实例</h1>
<c:url var="myURL" value="main.jsp">
<c:param name="name" value="Runoob"/>
<c:param name="url" value="www.runoob.com"/>
</c:url>
<a href="/<c:out value='${myURL}'/>">
使用 <c:param> 为指定URL发送两个参数。</a>
<c:catch>
用来处理产生错误的异常状况,并且将错误信息储存起来
示例:
<c:catch var ="catchException">
<% int x = 5/0;%>
</c:catch>
<c:if test = "${catchException != null}">
<p>异常为 : ${catchException} <br/>
发生了异常: ${catchException.message}</p>
</c:if>
运行结果:
异常为 : java.lang.ArithmeticException: / by zero
发生了异常: / by zero
格式化标签
JSTL格式化标签用来格式化并输出文本、日期、时间、数字。引用格式化标签库的语法如下:
<%@ taglib uri="http://java.sun.com/jsp/jstl/fmt" prefix="fmt" %>
标签 | 描述 |
---|---|
<fmt:formatNumber> | 使用指定的格式或精度格式化数字 |
<fmt:parseNumber> | 解析一个代表着数字,货币或百分比的字符串 |
<fmt:formatDate> | 使用指定的风格或模式格式化日期和时间 |
<fmt:parseDate> | 解析一个代表着日期或时间的字符串 |
<fmt:bundle> | 绑定资源 |
<fmt:setLocale> | 指定地区 |
<fmt:setBundle> | 绑定资源 |
<fmt:timeZone> | 指定时区 |
<fmt:setTimeZone> | 指定时区 |
<fmt:message> | 显示资源配置文件信息 |
<fmt:requestEncoding> | 设置request的字符编码 |
示例一:格式化日期
<%@ taglib uri="http://java.sun.com/jsp/jstl/fmt" prefix="fmt" %>
<c:set var="now" value="<%=new java.util.Date()%>"/>
<fmt:formatDate pattern="yyyy-MM-dd" value="${now}" />
SQL标签
JSTL SQL标签库提供了与关系型数据库(Oracle,MySQL,SQL Server等等)进行交互的标签。引用SQL标签库的语法如下:
<%@ taglib uri="http://java.sun.com/jsp/jstl/sql" prefix="sql" %>
标签 | 描述 |
---|---|
<sql:setDataSource> | 指定数据源 |
<sql:query> | 运行SQL查询语句 |
<sql:update> | 运行SQL更新语句 |
<sql:param> | 将SQL语句中的参数设为指定值 |
<sql:dateParam> | 将SQL语句中的日期参数设为指定的java.util.Date 对象值 |
<sql:transaction> | 在共享数据库连接中提供嵌套的数据库行为元素,将所有语句以一个事务的形式来运行 |
示例:
<sql:setDataSource var="mydb" driver="com.mysql.jdbc.Driver"
url="jdbc:mysql://localhost/TEST"
user="root" password="12345"/>
<sql:query dataSource="${mydb}" var="result">
SELECT * from Employees;
</sql:query>
JSTL函数
JSTL包含一系列标准函数,大部分是通用的字符串处理函数。引用JSTL函数库的语法如下:
<%@ taglib uri="http://java.sun.com/jsp/jstl/functions" prefix="fn" %>
函数 | 描述 |
---|---|
fn:contains() | 测试输入的字符串是否包含指定的子串 |
fn:containsIgnoreCase() | 测试输入的字符串是否包含指定的子串,大小写不敏感 |
fn:endsWith() | 测试输入的字符串是否以指定的后缀结尾 |
fn:escapeXml() | 跳过可以作为XML标记的字符 |
fn:indexOf() | 返回指定字符串在输入字符串中出现的位置 |
fn:join() | 将数组中的元素合成一个字符串然后输出 |
fn:length() | 返回字符串长度 |
fn:replace() | 将输入字符串中指定的位置替换为指定的字符串然后返回 |
fn:split() | 将字符串用指定的分隔符分隔然后组成一个子字符串数组并返回 |
fn:startsWith() | 测试输入字符串是否以指定的前缀开始 |
fn:substring() | 返回字符串的子集 |
fn:substringAfter() | 返回字符串在指定子串之后的子集 |
fn:substringBefore() | 返回字符串在指定子串之前的子集 |
fn:toLowerCase() | 将字符串中的字符转为小写 |
fn:toUpperCase() | 将字符串中的字符转为大写 |
fn:trim() | 移除首位的空白符 |