目录

  • 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表达式取数据的优先级:

  1. 默认查找优先级
<%
	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

  1. 指定作用域进行查找
    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 使用

  1. 导入Jar包 (jstl.jar standard.jar)
  2. 在JSP页面开始的地方导入JSTL 标签库

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

  1. 在需要的地方使用

常用标签

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-->

函数标签库

略… …