您好,欢迎访问代理记账网站
移动应用 微信公众号 联系我们

咨询热线 -

电话 15988168939

联系客服
  • 价格透明
  • 信息保密
  • 进度掌控
  • 售后无忧

JavaWeb基础 (五):EL 表达式与JSTL 标签库简介

目录

  • JavaWeb基础 (五):EL 表达式与JSTL 标签库简介
    • EL表达式
      • 表达式语言的语法
        • EL 执行表达式以及关键字
        • .运算符
      • EL表达式取不同域数据时的优先级
    • JSTL
      • JSTL 使用
      • 常用标签
        • foreach标签
        • set标签
        • out标签
        • remove标签
        • catch标签


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

  2. 指定作用域进行查找

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

  3. 在需要的地方使用

常用标签

foreach, set, out, remove, catch

foreach标签

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

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对象中


分享:

低价透明

统一报价,无隐形消费

金牌服务

一对一专属顾问7*24小时金牌服务

信息保密

个人信息安全有保障

售后无忧

服务出问题客服经理全程跟进