目录
- JavaWeb基础 (五):EL 表达式与JSTL 标签库简介
- EL表达式
- 表达式语言的语法
- EL 执行表达式以及关键字
- .运算符
- EL表达式取不同域数据时的优先级
- JSTL
- JSTL 使用
- 常用标签
- JSTL foreach标签
- foreach 标签的属性
- set标签
- out标签
- remove标签
- catch标签
- 条件标签
- if 标签
- choose标签
- 格式化标签库
- formatDate 标签
- formatNumber 标签
- 函数标签库
JavaWeb基础 (五):EL 表达式与JSTL 标签库简介
EL表达式是JSP 2.0及其更高版本中最重要的特性之一。 它有助于编写更简短、更高效的JSP页面,还能帮助编写免脚本的页面。JSP用户可以使用EL表达式来访问应用程序数据。
JSTL可以完成一般的任务(如遍历、集合和条件)、处理XML文档、格式化文本、访问数据库以及操作数据,等等。
EL表达式
Expression Language (EL) 表达式语言, 替代JSP 页面中数据访问时的复杂编码, 更方便的取出存入 (page/request/session/application) 域中的对象, 使用EL表达式相当于简化了getAttribute 的操作
表达式语言的语法
${expression}
取数据时与JSP表达式的对比
存数据: key 为 name
<%
request.setAttribute("name", "Jack");
%>
JSP表达式+JSP脚本:
<%
String name = (String) request.getAttribute("name");
%>
<%=name%>
EL表达式: (此处name 为setAttribute 时的key 值)
${name}
EL 执行表达式以及关键字
&& (and)
|| (or)
! (not)
< (lt)
> (gt)
<= (le)
>= (ge)
== (eq)
!= (ne)
${key1 == key2} -> ${key1 eq key2}
${key1 > key2} -> ${key1 gt key2}
${key1 && key2} -> ${key1 and key2}
...
.运算符
<%
User user = new User(1, "Li", 18, 120.0);
pageContext.setAttribute("userKey", user);
%>
${userKey.id}
${userKey.name}
${userKey.age}
${userKey.score}
此处EL表达式${userKey.id} 可以翻译为:
<%
((User) pageContext.getAttribute("userKey")).getId();
%>
实际上是通过反射调用类的getId()方法, 即与方法名绑定,而非变量名 .id = getId()
要访问当前JSP的pageContext对象
${pageContext.request}
要访问HttpSession,可以使用以下语法:
${pageContext.session}
<!--获取sessionID-->
${pageContext.session.id}
<!--同等于-->
<%
session.getId();
%>
EL表达式取不同域数据时的优先级
当有不同域时 EL表达式取数据的优先级:
- 默认查找优先级
<%
pageContext.setAttribute("name", "page");
request.setAttribute("name", "request");
session.setAttribute("name", "session");
application.setAttribute("name", "application");
%>
${name}
四个域同时存在时, EL表达式通过key 取到的value 是 存储在page域中的对象
当不同域中有同名的key时, EL表达式对于4种域对象的查找顺序:
page -> request -> session -> application
按照上述顺序默认查找, 若在 application域中也查找不到则返回null
- 指定作用域进行查找
page作用域查找: ${pageScope.name}
request作用域查找: ${requestScope.name}
session作用域查找: ${sessionScope.name}
application作用域查找: ${applicationScope.name}
JSTL
JSP标准标签库(JavaServer Pages Standard Tag Library,JSTL)是一个定制标签库的集合
JSTL为开发者提供的一系列标签, 能够完成一些逻辑处理, 比如循环遍历, 避免JSP脚本穿插
JSTL 侧重逻辑处理, EL 负责展示数据
JSTL 使用
- 导入Jar包 (jstl.jar standard.jar)
- 在JSP页面开始的地方导入JSTL 标签库
<%@ taglib prefix=“c” uri=“http://java.sun.com/jsp/jstl/core” %>
- 在需要的地方使用
常用标签
foreach, set, out, remove, catch
JSTL foreach标签
使用JSTL foreach读取 List 数据示例:
MyJstlServlet.java
public class MyJstlServlet extends HttpServlet {
@Override
protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
List<User> users = new ArrayList<>();
users.add(new User(1, "Li", 18, new Address(1, "中国")));
users.add(new User(2, "Been", 18, new Address(1, "中国")));
users.add(new User(3, "Dog", 5, new Address(2, "美国")));
users.add(new User(4, "Cat", 3, new Address(3, "韩国")));
req.setAttribute("usersList", users);
req.getRequestDispatcher("jstl_index.jsp").forward(req, resp);
}
}
jstl_index.jsp
<%@ page isELIgnored="false" %>
<%@ taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core" %>
<table>
<tr>
<th>编号</th>
<th>姓名</th>
<th>年龄</th>
<th>地址</th>
</tr>
<!--items="keyName" 需要遍历的集合-->
<!--var="..." 每次遍历得到的对象-->
<c:forEach items="${usersList}" var="user">
<tr>
<td>${user.id}</td>
<td>${user.name}</td>
<td>${user.age}</td>
<td>${user.address.location}</td>
</tr>
</c:forEach>
</table>
foreach 标签的属性
- items 属性
需要遍历的集合 - var 属性
每次遍历得到的对象 - begin 属性
设置遍历的起始索引 - end 属性
设置遍历的结束索引 - step 属性
设置遍历的步数,默认是1(设置为2遍历的索引:0,2,4,…) - varStatus 属性
每次遍历获得的对象存储到状态信息(当前索引index,序号count,…)
set标签
set: 向域对象中添加数据 (等于 xxxx.setAttribute(String key, Object value))
<c:set var="name" value="Jack" scope="page/request/session/application"></c:set>
${pageContext.name}
修改对象属性
<%
User user = new User(1, "Jack", 18, new Address(1, "沿江路"));
request.setAttribute("userKey", user);
%>
<c:set target="${userKey}" property="name" values="been"></c:set>
out标签
out: 输出域对象中的数据
<c:set var="nameKey" value="Jack"></c:set>
<c:out value="${nameKey}"></c:out>
这段代码等于 ${nameKey}
当没有向域中存储过key为nameKey的数据,则显示default中定义的数据
<c:out value="${nameKey}" default="未定义"></c:out>
remove标签
remove: 删除域对象中的数据
<c:remove var="nameKey" scope="page/request/session/application"></c:remove>
<c:out value="${nameKey}" default="未定义"></c:out>
这段代码中remove标签删除了key 为nameKey的数据, 则下面out标签无法取到key为 nameKey的数据, 会输出"未定义"
catch标签
catch: 捕获异常
<c:catch var="error">
<%
int i = 10/0;
%>
</c:catch>
<%=error%>
catch 会将异常信息存储到error对象中
条件标签
if, choose
if 标签
<c:set var="num1" values="1"></c:set>
<c:set var="num2" values="2"></c:set>
<!--if-->
<c:if test="${num1 > num2}">true</c:if>
<!--else-->
<c:if test="${num1 <= num2}">false</c:if>
choose标签
<c:choose>
<!--if-->
<c:when test="${num1>num2}">ok</c:when>
<!--else-->
<c:otherwise>fail</c:otherwise>
</c:choose>
格式化标签库
导入:
<%@ taglib prefix=“fmt” uri=“http://java.sun.com/jsp/jstl/fmt” %>
formatDate 标签
<%
request.setAttribute("date", new Date());
%>
<fmt:formatDate value="${date}" pattern="yyyy-MM-dd HH:mm:ss"></fmt:formatDate>
formatNumber 标签
<fmt:formatNumber value="12345.2345" maxIntegerDigits="2" maxFractionDigits="3"></fmt:formatNumber>
<!--输出45.234-->
函数标签库
略… …