Java Web篇_09 EL表达式&JSTL


EL

EL表达式介绍

EL(Expression Language): 表达式语言
它是在JSP2.0规范中加入的内容,也是Servlet规范的一部分。
它的作用是,在JSP页面中获取数据。让我们的JSP脱离Java代码块和JSP表达式。
语法:${表达式内容}
举个例子,
先向请求域中添加username数据

<% request.setAttribute("username","zhangsan"); %>

我们可以通过Java代码块获取:

<% out.println(request.getAttribute("username")); %>

也可以通过JSP表达式来获取:

<%= request.getAttribute("username") %>

现在我们用EL表达式获取是这样的:

${username}

相比前面的方式,EL表达式明显简单很多。
我这里有个疑问是,难道就直接这么写吗,不需要区分是哪个域对象吗?或者说,除了request对象,有没有可能是HttpSession对象?
那这里要说明一下,通过EL表达式这种获取数据的方式,我们并不需要区分式哪个域对象,只要我们这四大域中有这个数据,比如这个数据叫username,它就可以获取到。

EL表达式获取数据

这个直接看代码吧

<%@ page import="com.symc.bean.Student" %>
<%@ page import="java.util.ArrayList" %>
<%@ page import="java.util.HashMap" %><%--
  Created by IntelliJ IDEA.
  User: Administrator
  Date: 2021/11/7
  Time: 21:12
  To change this template use File | Settings | File Templates.
--%>
<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<html>
<head>
    <title>EL表达式获取不同类型数据</title>
</head>
<body>
    <%--1.获取基本数据类型--%>
    <% pageContext.setAttribute("num",10); %>
    基本数据类型:${num}
    <br>
    <%--2.获取自定义对象类型--%>
    <%--首先自己先创建一个对象,我这里用Student,封装并实现构造器和get、set方法--%>
    <%
        pageContext.setAttribute("stu",new Student("张三",15));
    %>
<%--    对于调用对象的属性,使用的是 对象名.属性名 的方式--%>
<%--    注意这里的实现原理是调用封装对象中的get方法,不能混淆--%>
    自定义对象:${stu}<br>
    学生姓名:${stu.name}
    学生年龄:${stu.age}
    <br>
    <%--3.获取数组类型--%>
    <%
        String[] arr = {"Hello","World"};
        pageContext.setAttribute("a",arr);
    %>
    数组arr:${a}<br>
    0索引元素:${a[0]} <br>
    1索引元素:${a[1]} <br>
    <%--4.获取List集合--%>
    <%
        ArrayList<String> list = new ArrayList<>();
        list.add("aaa");
        list.add("bbb");
        pageContext.setAttribute("list",list);
    %>
    List集合:${list} <br>
<%--    由于ArrayList底层是由数组实现的,所以可以通过下标的方式获取--%>
    0索引元素:${list[0]} <br>
    <%--5.获取Map集合--%>
    <%
        HashMap<String, Student> map = new HashMap<>();
        map.put("zhangsan",new Student("张三",23));
        map.put("lisi",new Student("李四",23));
        pageContext.setAttribute("map",map);
    %>
    Map集合:${map} <br>
    第一个学生对象:${map.zhangsan} <br>
    第一个学生对象姓名:${map.zhangsan.name} <br>
</body>
</html>

浏览器是这样的:
在这里插入图片描述

EL表达式注意事项

1.EL表达式没有空指针异常
2.EL表达式没有索引越界异常
3.EL表达式没有字符串的拼接

还是拿上面的代码来演示,
这次我们不去创建对象,

  自定义对象:${stu2}<br>

显示:
在这里插入图片描述
这说明可以访问空对象但是不报异常。
再来看,数组长度只为2,我们去访问一下不存在的索引8

    数组arr:${a}<br>
    0索引元素:${a[0]} <br>
    1索引元素:${a[1]} <br>
    8索引元素:${a[8]} <br>

显示:
在这里插入图片描述
这说明EL表达式没有索引越界异常。
再看看字符串的拼接,就用刚才的数组,我这里有两种方式

 ${a[0]+a[1]}
 ${a[0]}+${a[1]}

显示:
在这里插入图片描述
针对 ${a[0]+a[1]}这种方式的它直接报错。
再看看对于 a [ 0 ] + {a[0]}+ a[0]+{a[1]}的方式
在这里插入图片描述
发现字符串连+也一起输出来了,所以字符串拼接再EL表达式中是不可用的。

EL表达式运算符

关系运算符
在这里插入图片描述
逻辑运算符
在这里插入图片描述
其他运算符
在这里插入图片描述
对于empty举例:

<%--empty--%>
<%
    String str1 = null;
    String str2 = "";
    int[] arr = {};
%>
${empty str1} <br>
${empty str2} <br>
${empty arr} <br>

在这里插入图片描述
对于三目运算符举例:

<%--三目运算符。获取性别的数据,在对应的按钮上进行勾选--%>
<%
    pageContext.setAttribute("gender", "men");
%>
<input type="radio" name="gender" value="men" ${gender=="men"?"checked":""}><input type="radio" name="gender" value="women"
${gender=="women"?"checked":""}>

效果:
在这里插入图片描述

EL表达式使用细节

EL表达式能够获取四大域对象的数据,根据名称从小到大在域对象中查找。
还可以获取JSP其他八个隐式对象,并调用对象中的方法。
对于获取四大域对象中的数据:

<%--获取四大域对象中的数据--%>
<%
    pageContext.setAttribute("username","张三");
    request.setAttribute("username","李四");
//    session.setAttribute("username","王五");
//    application.setAttribute("username","张");
%>
${username}

显示:
在这里插入图片描述
它在四大域中是逐个查找的,从pageContext到application。
我这里还总结了,当我们的不同域中有相同的名称,作用范围小获取数据的优先级高。
比如说,在PageContext域中和HttpRequest域中,页面域仅仅作用在当前页面中,作用范围是最小的,而请求域作用在一次请求或请求转发中,要比页面域大,可以这么理解吧,作用范围越小,说明越精确,我们获取这个username名称的数据,获取到的是pageContext对象中的数据。另外,复习一下HttpSession域是会话域,作用在多次请求中,Application是应用域,作用在整个应用中。所以优先获取数据的顺序是
pageContext>request>session>application

对于获取JSP中其他八个隐式对象,这里举例获取虚拟目录名称

<%--获取虚拟目录名称--%>
<%=request.getContextPath()%>
${pageContext.request.getContextPath}

显示:
在这里插入图片描述

EL表达式中隐式对象

在这里插入图片描述

<%--pageContext对象 可以获取其他3个域对象和JSP中八个隐式对象--%>
${pageContext.request.contextPath} <br>

在这里插入图片描述

<%--applicationScope sessionScope requestScope pageScope 操作四大域对象中的数据--%>
<%
    request.setAttribute("username","zhangsan");
%>
${username}<br>
${requestScope.username}<br>

在这里插入图片描述

<%--header headValues 获取请求头数据--%>
${header["connection"]}<br>
${headerValues["connection"][0]}<br>

在这里插入图片描述

<%--param paramValues 获取请求参数数据--%>
${param.username}<br>
${paramValues.hobby[0]}<br>
${paramValues.hobby[1]}<br>

在这里插入图片描述
在这里插入图片描述

<%--initParam 获取全局配置参数--%>
${initParam["pname"]}<br>
<%--cookie 获取cookie信息--%>
${cookie}<%--获取的是Map集合--%><br>
${cookie.JSESSIONID}<%--获取Map集合第二个元素--%><br>
${cookie.JSESSIONID.name}<%--获取cookie对象的名称--%><br>
${cookie.JSESSIONID.value}<%--获取cookie对象的值--%><br>

在这里插入图片描述

JSTL

JSTL介绍

JSTL (Java Server Page Standard Tag Library):JSP标准标签库
它主要是提供给开发人员一个标准通用的标签库。开发人员可以利用这些标签取代JSP页面上的Java代码,从而提高程序的可读性,降低程序的维护难度。
举个例子,之前的JSP代码是既有html,也有Java代码,而Java代码还需要加上<%%>标签,整体看上去显得很乱,而JSTL就是取代JSP中的Java代码。
在这里插入图片描述

JSTL核心标签库

标签名称功能分类属性作用
<标签名:if>流程控制核心标签库用于条件判断
<标签名:choose>流程控制核心标签库用于多条件判断
<标签名:when>流程控制核心标签库用于多条件判断
<标签名:otherwise>流程控制核心标签库用于多条件判断
<标签名:forEach>迭代遍历核心标签库用于循环遍历

JSTL的使用:
首先得创建一个web项目
在这里插入图片描述
在web目录下的WEB-INF目录下创建一个libs目录,将JSTL的jar包导入。
如果没有WEB-INF就手动创建一个。
在这里插入图片描述
JSTL的jar包百度网盘链接
链接:https://pan.baidu.com/s/1DK34vvZSSxE192V82-pJMA
提取码:xxxx

创建JSP文件,通过taglib导入JSTL标签库。
在这里插入图片描述
我在这里遇到个问题
taglib的uri报红且不能自动提示 这个问题我已经解决,在这里

对流程控制和迭代遍历的标签进行使用。
流程控制:

<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<%@taglib uri="http://java.sun.com/jsp/jstl/core" prefix="c" %>
<html>
<head>
    <title>流程控制</title>
</head>
<body>
<%--向域对象中添加成绩数据--%>
${pageContext.setAttribute("score","A")}
<%--对成绩进行判断--%>
<c:if test="${score == 'A'}">
    优秀
</c:if>

<c:choose>
    <c:when test="${score == 'A'}">优秀</c:when>
    <c:when test="${score == 'D'}">良好</c:when>
    <c:when test="${score == 'C'}">及格</c:when>
    <c:when test="${score == 'D'}">较差</c:when>
    <c:otherwise>成绩类型不符</c:otherwise>
</c:choose>
</body>
</html>

这里的prefix=“c”,c就是名称
后面用的标签名就是这个c,标签中参数test就是获取到域对象中的数据
if标签中的这个意思就是 “如果成绩为A,就为‘优秀’ ”;同样地,在choose标签中,用的是多支选择,也是这个意思,需要知道的是,如果score的数据在when标签中都没有,就显otherwise标签中的信息。

循环遍历:

<%@ page import="java.util.ArrayList" %>
<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<%@taglib uri="http://java.sun.com/jsp/jstl/core" prefix="c"%>
<html>
<head>
    <title>循环</title>
</head>
<body>
<%
//    向域对象中添加集合
    ArrayList<String> list = new ArrayList<>();
    list.add("aa");
    list.add("bb");
    list.add("cc");
    list.add("dd");
    pageContext.setAttribute("list",list);
%>
<%--遍历集合--%>
<c:forEach items="${list}" var="str">
    ${str} <br>
</c:forEach>
</body>
</html>

部署并启动项目
通过浏览器观察。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值