El表达式&JSTL

EL表达式介绍

EL(Expression Language):表达式语言。

在JSP2.0规范中加入的内容,也是Servlet规范的一部分

作用:在JSP页面中获取数据,让我们的JSP脱离java代码和JSP表达式

基本语法

EL表达式的语法格式非常简单,写为 ${表达式内容}

例如:在浏览器中输出请求域中名称为message的内容。

假定,我们在请求域中存入了一个名称为message的数据(request.setAttribute("message","EL");),此时在jsp中获取的方式,如下表显示:

Java代码块JSP表达式EL表达式
<%<br/> <br/> String message = (String)request.getAttribute("message");<br/> out.write(message);<br/>%> <%=request.getAttribute("message")%> ${message}

通过上面我们可以看出,都可以从请求域中获取数据,但是EL表达式写起来是最简单的方式。这也是以后我们在实际开发中,当使用JSP作为视图时,绝大多数都会采用的方式。

1.1.2 EL表达式的入门案例

第一步:创建JavaWeb工程

2.在web目录下创建el01.jsp

3.在文件中向域对象添加数据

4.使用三种方式获取域对象中(java代码块,JSP表达式,EL表达式)

5.部署并启动项目

6.通过浏览器测试

<%--
  Created by IntelliJ IDEA.
  User: 12270
  Date: 2021/3/19
  Time: 22:11
  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.向域对象中添加数据--%>
  <%request.setAttribute("username","zhangsan");%>
  java代码块"<%out.println(request.getAttribute("username"));%><br>

  JSP表达式:<%=request.getAttribute("username")%>

  EL表达式:${username}


  <%%>

  </body>
</html>

 

 

 

 

1.1.2 EL表达式基本用法

在前面的概述介绍中,我们介绍了EL表达式的作用,它就是用于获取数据的,那么它是从哪获取数据呢?

1)获取四大域中的数据

它只能从四大域中获取数据,调用的就是findAttribute(name,value);方法,根据名称由小到大逐个域中查找,找到就返回,找不到就什么都不显示。

它可以获取对象,可以是对象中关联其他对象,可以是一个List集合,也可以是一个Map集合。具体代码如下:

创建一个实体类,Student

package com.itheima.bean;

public class Student {
    private String username;
    private int age;
    private int score;

    public Student() {
    }

    public Student(String username, int age, int score) {
        this.username = username;
        this.age = age;
        this.score = score;
    }

    public String getUsername() {
        return username;
    }

    public void setUsername(String username) {
        this.username = username;
    }

    public int getAge() {
        return age;
    }

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

    public int getScore() {
        return score;
    }

    public void setScore(int score) {
        this.score = score;
    }

    @Override
    public String toString() {
        return "Student{" +
                "username='" + username + '\'' +
                ", age=" + age +
                ", score=" + score +
                '}';
    }
}

JSP代码

<%@ page import="com.itheima.bean.Student" %>
<%@ page import="java.util.ArrayList" %>
<%@ page import="java.util.HashMap" %>
<%--
  Created by IntelliJ IDEA.
  User: 12270
  Date: 2021/3/20
  Time: 12:32
  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 stu=new Student("zhangsan",20,16);
        pageContext.setAttribute("stu",stu);
    %>
    自定义对象:${stu}<br>
    学生姓名:${stu.username}
    学生年龄:${stu.age}
    学生分数:${stu.score}<br>
    <%--3.获取数组类型--%>
    <%
        String []arr={"hello","world"};
        pageContext.setAttribute("arr",arr);
    %>
    0索引元素${arr[0]};<br>
    1索引元素${arr[1]};<br>

    <%--4.获取List集合--%>
    <%
        ArrayList<String> list=new ArrayList<>();
        list.add("aaa");
        list.add("bbb");
        pageContext.setAttribute("list",list);
    %>
    0索引元素${list.get(0)};<br>
    1索引元素${list.get(1)};<br>
    <%--5.获取Map集合--%>
    <%
        HashMap<String,Student> map=new HashMap<>();
        map.put("hm01",new Student("张三",18,90));
        map.put("hm02",new Student("李四",18,90));
        pageContext.setAttribute("map",map);
    %>
    Map集合
    ${map}
    第一个学生对象的姓名${map.hm01.username}<br>
    第一个学生对象的年龄${map.hm01.age}<br>

    ${map.hm02}
</body>
</html>

运行结果如图:

 

2)EL表达式的注意事项

在使用EL表达式时,它帮我们做了一些处理,使我们在使用时可以避免一些错误。它

没有空指针异常,

没有数组下标越界,

没有字符串拼接。

 

 <%--2.获取自定义对象类型--%>
    <%
        Student stu=new Student("zhangsan",20,16);
        stu=null;
        pageContext.setAttribute("stu",stu);
    %>
    <%--El表达式没有空指针异常--%>
    自定义对象:${stu}<br>
    学生姓名:${stu.username}
    学生年龄:${stu.age}
    学生分数:${stu.score}<br>
    <%--3.获取数组类型--%>
    <%
        String []arr={"hello","world"};
        pageContext.setAttribute("arr",arr);
    %>
    0索引元素${arr[0]};<br>
    1索引元素${arr[1]};<br>
    <%--el表达式中没有索引越界异常--%>
    8索引元素${arr[8]};
    <%--EL表达式中没有字符串拼接的效果--%>
    0索引拼接1索引的元素:${arr[0]}+${arr[1]}<br>

3)EL表达式的使用细节

EL表达式除了能在四大域中获取数据,同时它可以访问其他隐式对象,并且访问对象有返回值的方法.

4)EL表达式的运算符

EL表达式中运算符如下图所示,它们都是一目了然的:

 

 

 

 

 

 但是有两个特殊的运算符,使用方式的代码如下:

运算符 作用
empty                  

1.判断对象是否为null

2.判断字符串是否为空字符串

3.判断容器元素是否为0

条件?表达式1:表达式2 三元运算符
<%--
  Created by IntelliJ IDEA.
  User: 12270
  Date: 2021/3/20
  Time: 20:25
  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>
    <%-- empty--%>
    <%
        String str1=null;
        String str2="";
        int []arr={};

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

</body>
</html>

  运行结果图:

 

 

 

EL表达式的使用细节

EL表达式能够获取四大域对象的数据,根据名称从小到大在域对象中查找。

还可以获取JSP其他哪个隐式对象,并调用对象中的方法

<%--
  Created by IntelliJ IDEA.
  User: 12270
  Date: 2021/3/20
  Time: 21:21
  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>
    <%--获取四大域对象中的数据--%>
    <%
        //pageContext.setAttribute("username","张三");
        //request.setAttribute("username","张三");
        //session.setAttribute("username","张三");
        application.setAttribute("username","张三");


    %>

    ${username}<br>
    <%--获取jsp中其他八个隐式对象 获取虚拟目录的名称--%>
    <%=request.getContextPath()%>
    ${pageContext.request.contextPath}



</body>
</html>

  

 

 

 

1.1.3 EL表达式的11个隐式对象

1)隐式对象介绍

EL表达式也为我们提供隐式对象,可以让我们不声明直接来使用,十一个对象见下表,需要注意的是,它和JSP的隐式对象不是一回事:

EL中的隐式对象类型对应JSP隐式对象备注
PageContext Javax.serlvet.jsp.PageContext PageContext 完全一样
ApplicationScope Java.util.Map 没有 应用层范围
SessionScope Java.util.Map 没有 会话范围
RequestScope Java.util.Map 没有 请求范围
PageScope Java.util.Map 没有 页面层范围
Header Java.util.Map 没有 请求消息头key,值是value(一个)
HeaderValues Java.util.Map 没有 请求消息头key,值是数组(一个头多个值)
Param Java.util.Map 没有 请求参数key,值是value(一个)
ParamValues Java.util.Map 没有 请求参数key,值是数组(一个名称多个值)
InitParam Java.util.Map 没有 全局参数,key是参数名称,value是参数值
Cookie Java.util.Map 没有 Key是cookie的名称,value是cookie对象
<%--
  Created by IntelliJ IDEA.
  User: 12270
  Date: 2021/3/21
  Time: 16:26
  To change this template use File | Settings | File Templates.
--%>
<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<html>
<head>
    <title>Title</title>
</head>
<body>
<%--pageContext对象 可以获取其他三个域对象和JSP中八个隐式对象--%>
${pageContext.request.contextPath} <br>

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

<%--header headerValues  获取请求头数据--%>
${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} <br> <%--获取Map集合--%>
${cookie.JSESSIONID} <br> <%--获取map集合中第二个元素--%>
${cookie.JSESSIONID.name} <br> <%--获取cookie对象的名称--%>
${cookie.JSESSIONID.value} <%--获取cookie对象的值--%>
</body>
</html>   

 效果

 

 

1.2 JSTL

1.2.1 JSTL概述

1)简介

JSTL的全称是:JSP Standard Tag Libary。它是JSP中标准的标签库。它是由Apache实现的。

开发人员可以利用这些标签取代JSP上的Java代码,从而提高程序的可读性

它由以下5个部分组成:

组成作用说明
Core 核心标签库。 通用逻辑处理
Fmt 国际化有关。 需要不同地域显示不同语言时使用
Functions EL函数 EL表达式可以使用的方法
SQL 操作数据库。 不用
XML 操作XML。 不用

2)使用要求

要想使用JSTL标签库,在javaweb工程中需要导入坐标。首先是在工程的WEB-INF目录中创建一个lib目录,接下来把jstl的jar拷贝到lib目录中,最后在jar包上点击右键,然后选择【Add as Libary】添加。如下图所示:

 

 

 

1.2.2 核心标签库

在我们实际开发中,用到的jstl标签库主要以核心标签库为准,偶尔会用到国际化标签库的标签。下表中把我们经常可能用到的标签列在此处,其余标签库请同学们参考【JSTL标签库.doc】文档。

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

1.2.3 JSTL使用

1.创建一个web项目

2。在web目录下创建一个WEB-INF目录

3.在 WEB-INF目录下创建一个libs目录,将JSTL的jar包导入

4.创建jap文件,通过taglib导入JSTL标签库

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

6.部署并启动项目

7.通过浏览器查看

条件判断

<%@ 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","T")}

    <%--对成绩进行判断--%>
    <c:if test="${score eq 'A'}">
        优秀
    </c:if>

    <%--对成绩进行多条件判断--%>
    <c:choose>
        <c:when test="${score eq 'A'}">优秀</c:when>
        <c:when test="${score eq 'B'}">良好</c:when>
        <c:when test="${score eq 'C'}">及格</c:when>
        <c:when test="${score eq 'D'}">较差</c:when>
        <c:otherwise>成绩非法</c:otherwise>
    </c:choose>
</body>
</html> 

 

 

 

  

循环遍历

<%@ page import="java.util.ArrayList" %><%--
  Created by IntelliJ IDEA.
  User: 12270
  Date: 2021/3/21
  Time: 21:23
  To change this template use File | Settings | File Templates.
--%>
<%@ 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>

 

 

 

  

  

  

 ,

 

 

 

 

 

 

posted @ 2021-03-21 21:35  星梦泪痕  阅读(90)  评论(0编辑  收藏  举报