EL 与 JSTL 简化 JSP 操作


I. EL

  • EL(Expression Language,表达式语言):主要用来代替 JSP 中脚本的功能,简化对 Java 代码的操作。
  • 语法:${表达式}

1. EL 获取域中的值

  • EL表达式 只能 从域对象(4个域)中获取数据。

a. 语法

i. 标准语法

  1. ${pageScope.键名}
    从 page 域中获取指定键名对应的值。
  2. ${requestScope.键名}
    从 request 域中获取指定键名对应的值。
  3. ${sessionScope.键名}
    从 session 域中获取指定键名对应的值。
  4. ${applicationScope.键名}
    从 servletContext 域中获取指定键名对应的值。

ii. 简化语法

  • ${键名}
    默认从最小域开始找,找到后直接显示,不在继续寻找。
    要求四个域键名唯一。

iii. 代码示例

<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<html>
<head>
    <title>demo.jsp</title>
</head>
<body>
<h3>el表达式基本语法</h3>
<%
    /*模拟servlet向域中存值*/
    // pageContext.setAttribute("username", "Regino");
    request.setAttribute("username", "Regino");
    request.setAttribute("age", 21);
    session.setAttribute("sex", "男");
    application.setAttribute("address", "HK");
%>
<h5>标准语法</h5>
${pageScope.username}<br> <%--不会出现空指针异常问题--%>
${requestScope.age}<br>
${sessionScope.sex}<br>
${applicationScope.address}<br>
<h5>简化语法</h5>
${username}<br>
${age}<br>
${sex}<br>
${address}<br>
</body>
</html>

b. 获取 JSP 动态资源

  1. 获取字符串:
    ${键名}
    之前的内容已经介绍过了。
  2. 获取对象(User):
    ${键名.属性名}
    属性名必须和实体类中的 get 方法返回的变量名称一致。
    el 不会出现 null 和索引角标越界问题。
    遍历要用到 JSTL 标签库,详情可见 。
  3. 获取 List(Array)集合:
    ${键名[索引]}
  4. 获取 Map 集合:
    ${键名.key}
    ${键名["key"]}

i. 获取对象

  • 实体类:
package com.company.up.domain;

public class User {

    private String name;
    private String sex;
    private Integer age;

    public User() {
    }

    public User(String name, Integer age, String sex) {
        this.name = name;
        this.sex = sex;
        this.age = age;
    }

    public String getName() {
        return name;
    }

    public void setName(String name) {
        this.name = name;
    }

    public String getSex() {
        return sex;
    }

    public void setSex(String sex) {
        this.sex = sex;
    }

    public Integer getAge() {
        return age;
    }

    public void setAge(Integer age) {
        this.age = age;
    }

    @Override
    public String toString() {
        return "User{" +
                "name='" + name + '\'' +
                ", sex='" + sex + '\'' +
                ", age=" + age +
                '}';
    }
}
<%@ page import="com.company.up.domain.User" %>
<%@ page import="java.util.ArrayList" %>
<%@ page import="java.util.HashMap" %>
<%@ page import="java.util.List" %>
<%@ page import="java.util.Map" %>
<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<html>
<head>
    <title>demo.jsp</title>
</head>
<body>
<h3>获取user对象</h3>
<%
    User user = new User("Regino", 21, "男");
    request.setAttribute("user", user);
%>
${user}<br><%--执行该对象的toString方法--%>
${user.name} | ${user.age} | ${user.sex}<br>
</body>
</html>

ii. 获取 List 集合

<%@ page import="com.company.up.domain.User" %>
<%@ page import="java.util.ArrayList" %>
<%@ page import="java.util.HashMap" %>
<%@ page import="java.util.List" %>
<%@ page import="java.util.Map" %>
<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<html>
<head>
    <title>demo.jsp</title>
</head>
<body>
<h3>获取list集合</h3>
<%
    List<Object> list = new ArrayList<>();
    list.add("胖虎");
    list.add("小夫");
    list.add("静香");
    User user = new User("Regino", 21, "男");
    list.add(user);
    request.setAttribute("list", list);
%>
${list}<br><%--执行该对象的toString方法--%>
${list[0]} | ${list[1]} | ${list[2]} | ${list[3].name} | ${list[10]}<br> <%--el表达式不会出现 集合(数组)角标越界异常--%>
</body>
</html>

在这里插入图片描述

iii. 获取 Map 集合

<%@ page import="com.company.up.domain.User" %>
<%@ page import="java.util.ArrayList" %>
<%@ page import="java.util.HashMap" %>
<%@ page import="java.util.List" %>
<%@ page import="java.util.Map" %>
<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<html>
<head>
    <title>demo.jsp</title>
</head>
<body>
<h3>获取map集合</h3>
<%
    Map<String, Object> map = new HashMap<>();
    map.put("key1", "胖虎");
    map.put("key2", "小夫");
    map.put("key3", "静香");
    User user = new User("Regino", 21, "男");
    map.put("key.4", user);
    request.setAttribute("map", map);
%>
${map}<br><%--执行该对象的toString方法--%>
${map.key1} | ${map.key2} | ${map.key3} | ${map["key.4"].name}<br>
</body>
</html>

2. EL 执行运算

a. 语法

  • 算数运算符:
    语法: + - * /(div) %(mod)
    可以用单词也可以用符号
  • 比较运算符:
    语法:> < >= <= ==(eq) !=(ne)
  • 逻辑运算符:
    语法:&&(and) ||(or) !(not)
  • 三元运算符:
    语法:${条件表达式?为真:为假}
  • 空运算符:
    语法:${not empty 对象}
    功能:
    可以判断字符串和对象是否为空
    可以判断一个集合的长度是否为 0

b. 代码示例

<%@ page import="com.company.up.domain.User" %>
<%@ page import="java.util.ArrayList" %>
<%@ page import="java.util.List" %>
<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<html>
<head>
    <title>demo.jsp</title>
</head>
<body>
<%
    int a = 4;
    int b = 3;
    request.setAttribute("a", a);
    request.setAttribute("b", b);
%>
<h5>算数运算符</h5>
${a / b} | ${a div b}<br>
${a % b} | ${a mod b}<br>

<h5>比较运算符</h5>
${a == b} | ${a eq b}<br>
${a !=b } | ${a ne b}<br>

<h5>三元运算符</h5>
${a == b ? "a相等于b" : "a不等于b"}<br>

<h5>非空判断</h5>
<%
    User user = new User();
    request.setAttribute("user", user);

    List list = new ArrayList();
    list.add("aa");
    request.setAttribute("list", list);
%>
user对象:${not empty user}<br> <%--  if(user !=null ){} --%>
list集合:${not empty list}<br> <%-- if(list !=null && list.size>0 ){}--%>

<h5>空值判断</h5>
user对象:${empty user}<br> <%--  if(user ==null ){} --%>
list集合:${empty list}<br> <%-- if(list ==null || list.size==0 ){}--%>
</body>
</html>

3. EL 隐式对象

a. 常用隐式对象

  • EL 表达式中有 11 个隐式对象。比较常用的有:
    • pageContext
      就是 JSP 9 个内置对象之一,可以获得其他 8 个内置对象。
    • cookie
      可以获取浏览器指定 Cookie 名称的值。

b. 代码示例

<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<html>
<head>
    <title>demo.jsp</title>
</head>
<body>
<h3>el 隐式对象</h3>
${pageContext.request.contextPath} 动态获取:项目名称(虚拟路径)<br>
${cookie.JSESSIONID.value} 获取指定cookie名称的值...<br>
</body>
</html>

4. EL 版本支持

  • JSP 默认支持 EL 表达式。
  • Servlet 2.3 规范中,默认不支持 EL 表达式。

5. 忽略 EL 表达式

a. 语法

  • 忽略当前 JSP 页面中所有的 EL 表达式:
    设置 JSP 中 page 指令中 isELIgnored="true" 属性
  • 忽略单个 EL 表达式:
    \${表达式}

b. 代码示例

<%@ page contentType="text/html;charset=UTF-8" language="java" isELIgnored="false" %>
<html>
<head>
    <title>demo.jsp</title>
</head>
<body>
<h3>el 隐式对象</h3>
${pageContext.request.contextPath} 动态获取:项目名称(虚拟路径)<br>
\${cookie.JSESSIONID.value} 获取指定cookie名称的值...<br>
</body>
</html>

II. JSTL

  • Jsp(Jsp Standard Tag Library,标准标签库):是由 Apache 组织提供的开源的 JSP 标签库,用于替换和简化 JSP 页面中 Java 代码的编写。

1. JSTL 标签库

  • JSTL 标准标签库有 5 个子库,但随着发展,目前常使用的是它的核心库(Core)。
标签库 标签库的 URI 前缀
Core http://java.sun.com/jsp/jstl/core c
国际化(几乎不用) http://java.sun.com/jsp/jstl/fmt fmt
SQL(过时) http://java.sun.com/jsp/jstl/sql sql
XML(过时) http://java.sun.com/jsp/jstl/xml x
Functions(几乎不用) http://java.sun.com/jsp/jstl/functions fn

2. Core 标签使用步骤

a. 当前 web 项目引入 Jar 包

在这里插入图片描述

b. 当前 JSP 页面 tablib 指令引入

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

3. 常用 Core 标签

a. c:if 标签

  • c:if 标签相当于 Java 中的 if(){}

i. 语法

  • <c:if test="boolean值"></c:if>
    • true:显示标签体内容;
    • false:隐藏标签体内容。
  • 通常与 EL 表达式一起使用
  • 注意:此标签没有 else 功能,如果想实现 else 效果,要让条件取反。

ii. 代码示例

<%@ page import="com.company.up.domain.User" %>
<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<%@ taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core" %>
<html>
<head>
    <title>demo.jsp</title>
</head>
<body>
<%
    User user = new User();
//    user.setName("Regino");
//    request.setAttribute("user", user);
%>
<c:if test="${empty user}">
    你好,请登录...
</c:if>
<c:if test="${not empty user}">
    你好,${user.name}
</c:if>
</body>
</html>

b. c:forEach 标签

  • c:forEach 标签相当于 Java 中的 for 循环

i. 普通 for 循环

		for(int i=1; i<=5; i++){
            i
		}
		<c:forEach begin="1" end="5" step="1" var="i">
			${i}
		</c:forEach>
  • begin="1":起始值(包含);
  • end="5":结束值(包含);
  • step="1":步长为 1;
  • var="i":当前输出临时变量。

ii. 增强 for 循环

		for(User user : list){
            user
		}
	<c:forEach items="${list}" var="user" varStatus="vs">
		${user}
	</c:forEach>
  • items="list":集合;
  • var="user":当前输出的临时变量;
  • varStatus="vs":变量状态,vs 表示 1 个对象,用于在增强 for 中取出索引,有 2 个属性:
    • index:当前索引,从 0 开始;
    • count:计数器,从 1 开始。

iii. 代码示例

<%@ page import="com.company.up.domain.User" %>
<%@ page import="java.util.ArrayList" %>
<%@ page import="java.util.List" %>
<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<%@ taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core" %>
<html>
<head>
    <title>demo.jsp</title>
</head>
<body>
<h3>普通for循环</h3>
<c:forEach begin="1" end="5" step="1" var="i"> <%--for循环将临时变量存储到了 pageContext域空间--%>
    ${i}<br>
</c:forEach>
<h3>增强for循环</h3>
<%
    List<User> list = new ArrayList<>();
    list.add(new User("Regino", 21, "男"));
    list.add(new User("Reggie", 23, "女"));
    list.add(new User("Reginald", 20, "中"));
    request.setAttribute("list", list);
%>
<c:forEach items="${list}" var="user" varStatus="vs">
    索引:${vs.index} | 计数器: ${vs.count} | ${user.name}<br>
</c:forEach>
</body>
</html>

c. c:choose 标签

i. 语法

  • c:choose 标签相当于 Java 中的 switch 语句
    • <c:choose>:等价于 switch;
    • <c:when>:等价于 case + break;
    • <c:otherwise>:等价于 default。

ii. 代码示例

<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<%@ taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core" %>
<html>
<head>
    <title>demo.jsp</title>
</head>
<body>
<h3>choose标签</h3>
<%
    Integer face = 10;
    request.setAttribute("face", face);
%>
<c:choose>
    <c:when test="${face <= 7}">
        普通
    </c:when>
    <c:when test="${face == 8 || face == 9}">
        明星
    </c:when>
    <c:when test="${face == 10}">
        倾城
    </c:when>
    <c:otherwise>
        外星人
    </c:otherwise>
</c:choose>
</body>
</html>

原文链接:https://qwert.blog.csdn.net/article/details/105698202

发布了401 篇原创文章 · 获赞 416 · 访问量 3万+

猜你喜欢

转载自blog.csdn.net/Regino/article/details/105698202