0
点赞
收藏
分享

微信扫一扫

EL表达式2

1.EL表达式优先从小范围中读取数据。51

pageContext < request < session < application

1.1 EL表达式中有四个隐含的隐式的范围:51

    - pageScope 对应的是 pageContext范围。

    - requestScope 对应的是 request范围。

    - sessionScope 对应的是 session范围。

    - applicationScope 对应的是 application范围。

代码在 E:\java学习\javaWeb\course\course24\web

8.jsp

<%--关于EL表达式优先从小范围中读取数据  50-51--%>
<%@page contentType="text/html;charset=UTF-8"%>
<%
    //四个域中都存储了数据,并且name相同
    session.setAttribute("data", "session");
    request.setAttribute("data", "request");
    pageContext.setAttribute("data", "pageContext");
    application.setAttribute("data", "application");
%>
<%--在没有指定范围的前提下,EL表达式优先从小范围中取数据--%>
<%--pageContext < request < session < application --%>
${data}

<hr>
<%-- 在EL表达式中可以指定范围来读取数据--%>
<%--EL表达式有4个隐含的隐式的范围对象--%>
<%--pageScope requestScope sessionScope applicationScope--%>
<%--以下是指定范围取数据。--%>
${pageScope.data}<br>
${requestScope.data}<br>
${sessionScope.data}<br>
${applicationScope.data}<br>
<%--在实际开发中,因为向某个域中存储数据的时候,name都是不同的。所以 xxxScope  都是可以省略的。--%>

EL表达式对null进行了预处理。如果是null,则向浏览器输出一个空字符串。

代码在 E:\java学习\javaWeb\course\course24\web

9.jsp

<%--EL表达式深度学习中  51--%>
<%@page contentType="text/html;charset=UTF-8" %>
<%
    request.setAttribute("username", "zhangsan");
%>

<%--取出数据并且输出到浏览器--%>
<%=request.getAttribute("username")%>
采用EL表达式:${username}

<%--当我们写错了取出来是null--%>
<%=request.getAttribute("usernam")%>

<%--EL表达式主要任务是做页面展示,要求最终页面展示上是友好的。--%>
<%--当我们写错了,EL表达式对null进行了处理。如果是null,则在浏览器上显示空白。--%>
采用EL表达式:${usernam}

<hr>
<%--EL表达式表面上是这种写法,实际上运行的时候,还是要翻译生成java代码的。--%>
<%--  ${usernam} 这个EL表达式等同于这一段java代码:--%>
<%=request.getAttribute("usernam") == null ? "" : request.getAttribute("usernam")%>

2. EL表达式取数据的时候有两种形式:  51

    - 第一种:.  (大部分使用这种方式)

    - 第二种:[ ] (如果存储到域的时候,这个name中含有特殊字符,可以使用 [ ])

      - request.setAttribute("abc.def", "zhangsan");

      - ${requestScope.abc.def} 这样是无法取值的。

      - 应该这样:${requestScope["abc.def"]}

代码在 E:\java学习\javaWeb\course\course24\web

10.jsp

<%--EL表达式深度学习中  51--%>
<%@ page import="com.bjpowernode.javaweb.jsp.bean.User" %>
<%@page contentType="text/html;charset=UTF-8" %>

<%
    //创建user对象
    User user = new User();
    user.setUsername("zhangsan");
    //存储到request域当中
    request.setAttribute("fadsa",user);
%>
<%--使用EL表达式取出,并且输出到浏览器--%>
${fadsa}<br>

<%--取数据写法一--%>
${fadsa.username}<br>

<%--取数据写法二--%>
<%--取user的username,注意[]当中的需要添加 双引号--%>
<%--[] 里面的没有加双引号的话,会将其看做变量。如果是带双引号
 "username",则去找user对象的username属性。--%>
${fadsa["username"]}<br>

<hr>

<%
    // 向request域当中存储数据。
    request.setAttribute("abc.def", "hello jsp el!!!");
%>
<%--将数据取出并输出到浏览器--%>
<%--这样取是空白滴:--%>
${requestScope.abc.def}
<%--正确取法--%>
${requestScope["abc.def"]}

3. 掌握使用EL表达式,怎么从Map集合中取数据:51

 ${map.key}

代码在 E:\java学习\javaWeb\course\course24\web

11.jsp

<%--EL表达式深度学习之关于map集合取数据  51--%>
<%@ page import="java.util.HashMap" %>
<%@ page import="java.util.Map" %>
<%@ page import="com.bjpowernode.javaweb.jsp.bean.User" %><%--EL表达式深度学习中  51--%>
<%@page contentType="text/html;charset=UTF-8" %>
<%
    //一个map集合
    Map<String,String> map = new HashMap<>();
    map.put("username","zhangsan");
    map.put("password","123");
    //将Map集合存储到request域当中
    request.setAttribute("userMap",map);
%>
<%--使用EL表达式,将map中的数据取出,并输出到浏览器--%>
${userMap.username}
<br>
${userMap.password}
<br>
${userMap["username"]}
<br>
${userMap["password"]}

<hr>
<%
    Map<String,User> userMap2 = new HashMap<>();
    User user = new User();
    user.setUsername("lisi");
    userMap2.put("user",user);
    request.setAttribute("abcd",userMap2);
%>
<%--使用EL表达式将Map集合中的user对象中的username取出--%>
${abcd.user.username}

3.1 掌握使用EL表达式,怎么从数组和List集合中取数据:51

    - ${数组[0]}

    - ${数组[1]}

    - ${list[0]}

代码在 E:\java学习\javaWeb\course\course24\web

12.jsp

<%--EL表达式深度学习之关于数组和List集合取数据  51--%>
<%@ page import="com.bjpowernode.javaweb.jsp.bean.User" %>
<%@ page import="java.util.List" %>
<%@ page import="java.lang.reflect.Array" %>
<%@ page import="java.util.ArrayList" %>
<%@ page import="java.util.Set" %>
<%@ page import="java.util.HashSet" %>
<%@page contentType="text/html;charset=UTF-8" %>
<%
    //数组
    String[] username = {"zhangsan","lisi","wangwu"};

    //向域中存储数组
    request.setAttribute("nameArray",username);
%>
<%--使用EL表达式取出数组中的数据--%>
${nameArray}<br>
${nameArray[0]}<br>
${nameArray[1]}<br>
${nameArray[2]}<br>
<hr>

<%
    User u1 = new User();
    u1.setUsername("zhangsan");

    User u2 = new User();
    u2.setUsername("lisi");

    //对象数组
    User[] users = {u1, u2};
    //存入request域中
    request.setAttribute("userArray",users);
%>
<%--去除数组中第二个用户名的名字--%>
${userArray[1].username}

<hr>
<%
    List<String> list = new ArrayList<>();
    list.add("abc");
    list.add("def");
    request.setAttribute("myList",list);
%>
<%--取出List集合--%>
<%--list集合也是通过下标的方式取数据的。--%>
${myList}<br>
${myList[0]}<br>
${myList[1]}

<hr>
<%
    Set<String> set = new HashSet<>();
    set.add("a");
    set.add("b");

    request.setAttribute("set", set);
%>
<%--取出set集合--%>
set集合:${set}
<%--以下无法获取单个数据:PropertyNotFoundException: 类型[java.util.HashSet]上找不到属性[0]--%>
<%--${set[0]}--%>

 3.2 page指令当中,有一个属性,可以忽略EL表达式 51

      <%@page contentType="text/html;charset=UTF-8" isELIgnored="true" %>

      isELIgnored="true" 表示忽略EL表达式

      isELIgnored="false" 表示不忽略EL表达式。(这是默认值)


      isELIgnored="true" 这个是全局的控制。


      可以使用反斜杠进行局部控制:\${username} 这样也可以忽略EL表达式。

代码在 E:\java学习\javaWeb\course\course24\web

13.jsp

<%--EL表达式深度学习之关于忽略指令  51--%>
<%--<%@page contentType="text/html;charset=UTF-8" isELIgnored="false" %>--%>
<%@page contentType="text/html;charset=UTF-8" %>
<%--<%@page contentType="text/html;charset=UTF-8" isELIgnored="true" %>--%>

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

<%-- isELIgnored="true" 表示忽略JSP中整个页面的所有EL表达式。如果想忽略其中某个,可以使用以下反斜杠。 --%>
\${username}
${username}
${username}

3.3 通过EL表达式获取应用的根:51

 ${pageContext.request.contextPath}

代码在 E:\java学习\javaWeb\course\course24\web

14.jsp

<%--EL表达式深度学习之关于获取应用的根  51--%>
<%@page contentType="text/html;charset=UTF-8" %>
<%
    // JSP有九大内置对象
    // pageContext,request,session,application,response,out,config,page,exception
    // 其中四个域对象,其中最小的域是pageContext
    // pageContext翻译为:页面上下文。通过pageContext可以获取什么????
%>
<%--从以下代码来看,pageContext.getRequest() 方法是没用的。这--%>
<%--是获取request对象。而JSP中自带了内置对象request,直接用request内置对象就行了--%>
<%--简单讲这个pageContext.getRequest()在jsp中没用但是在EL中有大用--%>
<%=pageContext.getRequest()%>


<%=request%>
<%--
    在EL表达式当中没有request这个隐式对象。
    requestScope 这个只代表“请求范围”。不等同于request对象。
    在EL表达式当中有一个隐式的对象:pageContext
    EL表达式中的pageContext和JSP中的九大内置对象pageContext是同一个对象。
--%>

<%--<%=pageContext.getRequest()%>这段代码对应的EL表达式${pageContext.request}--%>

${pageContext.request}


<%--获取应用的根--%>
<%=request.getContextPath()%>


<%--写成EL表达式就是--%>
使用EL表达式来获取应用的根路径:
${pageContext.request.contextPath}

4. EL表达式中其他的隐式对象:52

    - pageContext

    - param

    - paramValues

    - initParam

代码在 E:\java学习\javaWeb\course\course24\web

15.jsp

<%--EL表达式深度学习之其他隐式对象  52--%>
<%@page contentType="text/html;charset=UTF-8" %>
<%--JSP中EL表达式的隐含对象:
    1. pageContext
    2. param
    3. paramValues
    4. initParam
    5. 其他(不是重点)
--%>

应用的根路径:${pageContext.request.contextPath}


<%--request是JSP九大内置对象之一。--%>
<%--request.getParameter("username") 获取请求的参数。--%>
<%--在浏览器的url中输入http://localhost:8080/jsp/15.jsp?username=zhangsan--%>
<%--可以获得用户在浏览器中提交的数据--%>
用户名:<%=request.getParameter("username")%>


<%--使用EL表达式获得用户在浏览器中提交的数据---%>
用户名:${param.username}



<%--假设用户提交的数据
:http://localhost:8080/jsp/15.jsp?aihao=smoke&aihao=drink&aihao=tangtou--%>
<%--以上提交的数据显然是采用checkbox(复选框)进行提交的。同一组的checkbox的name是一样的。--%>
<%--param 获取的是请求参数一维数组当中的第一个元素。--%>
<%--以下两行代码获取的都是第一个元素  smoke 因为当提交多个数据是输入一个name只会获得第一个value--%>
爱好:${param.aihao} 

爱好:<%=request.getParameter("aihao")%> 


<%--要想都拿到--%>
一维数组:${paramValues.aihao}

一维数组:<%=request.getParameterValues("aihao")%>


<%--获取数组当中的元素:[下标]--%>
爱好:${paramValues.aihao[0]}、${paramValues.aihao[1]}、${paramValues.aihao[2]} 


<%--EL表达式中的隐含对象:initParam--%>
<%--ServletContext是Servlet上下文对象,对应JSP九大内置对象中的application
ServletContext和application其实是一回事,只不过一个应用在java中一个应用在jsp中--%>
<%
    String a = application.getInitParameter("pageSize");
    String b = application.getInitParameter("pageNum");
%>
<%--输出--%>
每页显示的记录条数:<%=a%> 

页码:<%=b%> 


每页显示的记录条数:<%=application.getInitParameter("pageSize")%> 

页码:<%=application.getInitParameter("pageNum")%> 


<%--使用EL表达式--%>
每页显示的记录条数:${initParam.pageSize} 

页码:${initParam.pageNum}

E:\java学习\javaWeb\course\course24\web\WEB-INF
web.xml

<?xml version="1.0" encoding="UTF-8"?>
<web-app xmlns="http://xmlns.jcp.org/xml/ns/javaee"
         xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
         xsi:schemaLocation="http://xmlns.jcp.org/xml/ns/javaee http://xmlns.jcp.org/xml/ns/javaee/web-app_4_0.xsd"
         version="4.0">
<!--    Servlet上下文初始化参数  52-->
    <context-param>
        <param-name>pageSize</param-name>
        <param-value>20</param-value>
    </context-param>
    <context-param>
        <param-name>pageNum</param-name>
        <param-value>5</param-value>
    </context-param>
</web-app>

6. EL表达式的运算符  52

算术运算符

   +、-、*、/、%

关系运算符

     [ ] == eq != > >= < <= 

逻辑运算符

   [ ] !  && ||  not and or

条件运算符

   [ ] ? : 

取值运算符

 [ ]和.

empty运算符

  [ ] empty运算符的结果是boolean类型

  [ ] ${empty param.username}

  [ ] ${not empty param.username}

  [ ] ${!empty param.password}

代码在 E:\java学习\javaWeb\course\course24\web

16.jsp

<%--EL表达式深度学习之运算符  52--%>
<%@ page import="com.bjpowernode.javaweb.jsp.bean.Student" %>
<%@page contentType="text/html;charset=UTF-8" %>
<%--
    关于EL表达式中的运算符
        1. 算术运算符
            + - * / %
        2. 关系运算符
            == != > >= < <= eq
        3. 逻辑运算符
            ! && || not and or (注意:!和not都是取反)
        4. 条件运算符
            ? :
        5. 取值运算符:
            [] 和 .
        6. empty 运算符
--%>
${10+20}<br>   <%--30--%>
<%-- 在EL表达式当中“+”运算符只能做求和运算。不会进行字符串拼接操作。 --%>
<%--"20"会被自动转换成数字20--%>
${10+"20"}<br>   <%--30--%>

<%-- java.lang.NumberFormatException: For input string: "abc" --%>
<%-- + 两边不是数字的时候,一定会转成数字。转不成数字就报错:NumberFormatException--%>
<%--${10+"abc"}<br>--%>   <%--报错--%>

<%-- 关系运算符 --%>
${"abc" == "abc"} <br>    <%--true--%>
${"abc"} == ${"abc"} <br>  <%--abc == abc --%>

<%
    Object obj = new Object();
    request.setAttribute("k1", obj);
    request.setAttribute("k2", obj);
%>
${k1 == k2} <br> <%--true 因为是同一个对象--%>

<%
    String s1 = new String("hehe");
    String s2 = new String("hehe");
    request.setAttribute("a", s1);
    request.setAttribute("b", s2);
%>
${a == b} <%--true 就值判断值--%> <br>

<%
    Object o1 = new Object();
    Object o2 = new Object();
    request.setAttribute("o1", o1);
    request.setAttribute("o2", o2);
%>
${o1 == o2} <br> <%--false 不同对象--%>


<%
    Student stu1 = new Student("110", "警察");
    Student stu2 = new Student("110", "警察");

    request.setAttribute("stu1", stu1);
    request.setAttribute("stu2", stu2);
%>
<%--EL表达式当中的 "==" 调用了equals方法。--%>
${stu1 == stu2} <br>  <%--true 因为调用了对象的equals方法--%>
${stu1 eq stu2} <br>  <%--true 因为调用了对象的equals方法--%>

<hr>
<%-- != 也会调用对象的equals方法。--%>
${stu1 != stu2} <br> <%--false--%>
${200 != 200} <br>  <%--false--%>

<%--以下语法错误,没有加小括号--%>
\${!stu1 eq stu2} <br>

<%--正确的写法--%>
${!(stu1 eq stu2)}<br>  <%--false--%>
${not(stu1 eq stu2)}<br>  <%--false--%>

<hr>
<%--empty运算符:运算结果是boolean类型。--%>
<%--判断是否为空,如果为空,结果是true。如果不为空,结果是false--%>
${empty param.username} <br>   <%--param可以获得用户在浏览器中提交的数据--%>
${!empty param.username} <br>
${not empty param.username} <br>

<hr>
<%--结果false--%>
<%--empty param.username前半部分是boolean类型。后面是null 类型不一致--%>
${empty param.username==null} <br>  <%--false--%>
${(empty param.password) == null} <br>  <%--false--%>

<%--这个没有empty 运算符,param.username只是获取提交的数据有就是有,没有就是null--%>
${param.username==null} <br>   <%--true--%>


<%--条件运算符--%>
${empty param.username ? "对不起,用户名不能为空!" : "欢迎访问!!!!" }

com.bjpowernode.javaweb.jsp.bean

Student

package com.bjpowernode.javaweb.jsp.bean;

import java.util.Objects;

public class Student {
    private String id;
    private String name;

    @Override
    public boolean equals(Object o) {
        System.out.println("equals方法执行了");
        if (this == o) return true;
        if (o == null || getClass() != o.getClass()) return false;
        Student student = (Student) o;
        return Objects.equals(id, student.id) && Objects.equals(name, student.name);
    }

    @Override
    public int hashCode() {
        return Objects.hash(id, name);
    }

    public Student() {
    }

    public Student(String id, String name) {
        this.id = id;
        this.name = name;
    }

    public String getId() {
        return id;
    }

    public void setId(String id) {
        this.id = id;
    }

    public String getName() {
        return name;
    }

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

举报

相关推荐

0 条评论