0
点赞
收藏
分享

微信扫一扫

EL表达式 ${ }

玩物励志老乐 2022-04-13 阅读 87
java
  • EL表达式是干什么用的?

    • Expression Language(表达式语言)

    • EL表达式可以代替JSP中的java代码,让JSP文件中的程序看起来更加整洁,美观。

    • JSP中夹杂着各种java代码,例如<% java代码 %>、<%=%>等,导致JSP文件很混乱,不好看,不好维护。所以才有了后期的EL表达式。

    • EL表达式可以算是JSP语法的一部分。EL表达式归属于JSP。

  • EL表达式出现在JSP中主要是:

    • 从某个作用域中取数据,然后将其转换成字符串,然后将其输出到浏览器。这就是EL表达式的功效。三大功效:

      • 第一功效:从某个域中取数据。

        • 四个域:

          • pageContext

          • request

          • session

          • application

      • 第二功效:将取出的数据转成字符串。

        • 如果是一个java对象,也会自动调用java对象的toString方法将其转换成字符串。

      • 第三功效:将字符串输出到浏览器。

        • 和这个一样:<%= %>,将其输出到浏览器。

  • EL表达式很好用,基本的语法格式:

    • ${表达式}

  • EL表达式的使用:

<%
	// 创建User对象
	User user = new User();
	user.setUsername("jackson");
	user.setPassword("1234");
	user.setAge(50);

	// 将User对象存储到某个域当中。一定要存,因为EL表达式只能从某个范围中取数据。
	// 数据是必须存储到四大范围之一的。
	request.setAttribute("userObj", user);
%>

<%--使用EL表达式取--%>
${这个位置写什么????这里写的一定是存储到域对象当中时的name}
要这样写:
${userObj}
等同于java代码:<%=request.getAttribute("userObj")%>
你不要这样写:${"userObj"}

面试题:
	${abc} 和 ${"abc"}的区别是什么?
		${abc}表示从某个域中取出数据,并且被取的这个数据的name是"abc",之前一定有这样的代码: 域.setAttribute("abc", 对象);
		${"abc"} 表示直接将"abc"当做普通字符串输出到浏览器。不会从某个域中取数据了。

${userObj} 底层是怎么做的?从域中取数据,取出user对象,然后调用user对象的toString方法,转换成字符串,输出到浏览器。

<%--如果想输出对象的属性值,怎么办?--%>
${userObj.username} 使用这个语法的前提是:User对象有getUsername()方法。
${userObj.password} 使用这个语法的前提是:User对象有getPassword()方法。
${userObj.age} 使用这个语法的前提是:User对象有getAge()方法。
${userObj.email} 使用这个语法的前提是:User对象有getEmail()方法。
EL表达式中的. 这个语法,实际上调用了底层的getXxx()方法。
注意:如果没有对应的get方法,则出现异常。报500错误。

${userObj.addr222.zipcode}
以上EL表达式对应的java代码:
user.getAddr222().getZipcode()
  • EL表达式优先从小范围中读取数据。

    • pageContext < request < session < application

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

    • pageScope 对应的是 pageContext范围。

    • requestScope 对应的是 request范围。

    • sessionScope 对应的是 session范围。

    • applicationScope 对应的是 application范围。

      <%@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,则向浏览器输出一个空字符串。

    <%@page contentType="text/html;charset=UTF-8" %>
    
    <%
        request.setAttribute("username", "zhangsan");
    %>
    
    <%--取出数据并且输出到浏览器--%>
    <%=request.getAttribute("username")%>
    采用EL表达式:${username}
    
    <br>
    <%=request.getAttribute("usernam")%>
    
    <%--EL表达式主要任务是做页面展示,要求最终页面展示上是友好的。--%>
    <%--所以EL表达式对null进行了处理。如果是null,则在浏览器上显示空白。--%>
    采用EL表达式:${usernam} 
    
    <hr>
    <%--EL表达式表面上是这种写法,实际上运行的时候,还是要翻译生成java代码的。--%>
    ${usernam} 这个EL表达式等同于这一段java代码:<%=request.getAttribute("usernam") == null ? "" : request.getAttribute("usernam")%>
  • EL表达式取数据的时候有两种形式:

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

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

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

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

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

        <%@ 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("fdsafdsafdsa", user);
        
            // 向request域当中存储数据。
            request.setAttribute("abc.def", "hello jsp el!!!");
        %>
        
        <%--使用EL表达式取出,并且输出到浏览器--%>
        <%--从域当中取user--%>
        ${fdsafdsafdsa}<br>
        
        <%--取user的username--%>
        <%----%>
        ${fdsafdsafdsa.username}<br>
        
        <%--取user的username,注意[]当中的需要添加 双引号--%>
        <%--[] 里面的没有加双引号的话,会将其看做变量。如果是带双引号 "username",则去找user对象的username属性。--%>
        ${fdsafdsafdsa["username"]}<br>
        
        <%--将数据取出并输出到浏览器--%>
        ${requestScope.abc.def}  这个是空白滴:
        
        ${requestScope["abc.def"]}
  • 掌握使用EL表达式,怎么从Map集合中取数据:

    • ${map.key}

      <%@ page import="java.util.HashMap" %>
      <%@ page import="java.util.Map" %>
      <%@ page import="com.bjpowernode.javaweb.jsp.bean.User" %>
      <%@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);
      %>
      <hr>
      
      <%--使用EL表达式,将map中的数据取出,并输出到浏览器--%>
      ${userMap.username}
      <br>
      ${userMap.password}
      <br>
      ${userMap["username"]}
      <br>
      ${userMap["password"]}
      <br>
      <hr>
      <%
          Map<String,User> userMap2 = new HashMap<>();
          User user = new User();
          user.setUsername("lisi");
          userMap2.put("user", user);
          request.setAttribute("fdsafdsa", userMap2);
      %>
      
      <%--使用EL表达式将Map集合中的user对象中的username取出--%>
      ${fdsafdsa.user.username}
      
  • 掌握使用EL表达式,怎么从数组和List集合中取数据:

    • ${数组[0]}

    • ${数组[1]}

    • ${list[0]}

      <%@ page import="com.bjpowernode.javaweb.jsp.bean.User" %>
      <%@ page import="java.util.ArrayList" %>
      <%@ page import="java.util.List" %>
      <%@ page import="java.util.HashSet" %>
      <%@ page import="java.util.Set" %>
      <%@page contentType="text/html; charset=UTF-8" %>
      
      <%
          // 数组对象
          String[] usernames = {"zhangsan", "lisi", "wangwu"};
      
          // 向域中存储数组
          request.setAttribute("nameArray", usernames);
       
      %>
      
         <%--使用EL表达式取出数组中的元素--%>
         ${nameArray} <%--将数组对象直接输出--%>
         ${nameArray[0]} <%--取出数组中的第一个元素--%>
         ${nameArray[1]}
         ${nameArray[2]}
         <%--取不出数据,在浏览器上直接显示的就是空白。不会出现数组下表越界。--%>
         ${nameArray[100]}
      
      <%
          User u1 = new User();
          u1.setUsername("zhangsan");
      
          User u2 = new User();
          u2.setUsername("lisi");
      
          User[] users = {u1, u2};
      
          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}
         ${myList[0]}
         ${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]}--%>无序无下标无法取元素
         <hr>
  • page指令当中,有一个属性,可以忽略EL表达式

    • <%--<%@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} 这样也可以忽略EL表达式。
      ${username}
      ${username}
      
      <%@page contentType="text/html;charset=UTF-8" isELIgnored="true" %>
      isELIgnored="true" 表示忽略EL表达式  输出的会变成普通字符串
      isELIgnored="false" 表示不忽略EL表达式。(这是默认值)
      ​
      isELIgnored="true" 这个是全局的控制。
      ​
      
  • 通过EL表达式获取应用的根:

    • ${pageContext.request.contextPath}

  • EL表达式中其他的隐式对象:

    • pageContext

    • param

    • paramValues

    • initParam

      <%@page contentType="text/html;charset=UTF-8" %>
      
      <%--JSP中EL表达式的隐含对象:
          1. pageContext
          2. param
          3. paramValues
          4. initParam
          5. 其他(不是重点)
      --%>
      应用的根路径:${pageContext.request.contextPath}<br>
      
      <%--request是JSP九大内置对象之一。--%>
      <%--用户在浏览器上提交数据:http://localhost:8080/jsp/15.jsp?username=lisi --%>
      
      <%--request.getParameter("username") 获取请求的参数。 通过key 获取value--%>
      用户名:<%=request.getParameter("username")%><br>
      用户名:${param.username}<br>
      
      <%--假设用户提交的数据:http://localhost:8080/jsp/15.jsp?aihao=smoke&aihao=drink&aihao=tangtou--%>
      <%--以上提交的数据显然是采用checkbox复选框进行提交的。同一组的checkbox的name是一样的。--%>
      <%--param 获取的是请求参数一维数组当中的第一个元素。--%>
      
      爱好:${param.aihao} <br>
      爱好:<%=request.getParameter("aihao")%> <br>
      
      一维数组:${paramValues.aihao}<br>
      一维数组:<%=request.getParameterValues("aihao")%><br>
      
      <%--获取数组当中的元素:[下标]--%>
      爱好:${paramValues.aihao[0]}、${paramValues.aihao[1]}、${paramValues.aihao[2]} <br>
      
       <!--Servlet上下文初始化参数-->
          <!--上下文初始化参数被封装到:ServletContext对象当中了。-->
          <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>
      
      <%--EL表达式中的隐含对象:initParam--%>
      <%--ServletContext是Servlet上下文对象,对应的JSP九大内置对象之一是:application --%>
      <%
          String a = application.getInitParameter("pageSize");
          String b = application.getInitParameter("pageNum");
      %>
      
      每页显示的记录条数:<%=a%> <br>
      页码:<%=b%> <br>
      
      每页显示的记录条数:<%=application.getInitParameter("pageSize")%> <br>
      页码:<%=application.getInitParameter("pageNum")%> <br>
      
      
      每页显示的记录条数:${initParam.pageSize} <br>
      页码:${initParam.pageNum} <br>
  • EL表达式的运算符

    • 算术运算符

      • +、-、*、/、%

        ${10 + 20} <br>  //30
        
        <%-- 在EL表达式当中“+”运算符只能做求和运算。不会进行字符串拼接操作。 --%>
        <%--"20"会被自动转换成数字20--%>
        ${10 + "20"} <br>  //30
        
        <%-- java.lang.NumberFormatException: For input string: "abc" --%>
        <%-- + 两边不是数字的时候,一定会转成数字。转不成数字就报错:NumberFormatException--%>
        ${10 + "abc"} <br> //报错
        
        \${10 + "abc"} <br>  //报错
        \${"king" + "soft"} <br>  //报错
    • 关系运算符

      • == eq != > >= < <=
        <%-- 关系运算符 --%>
        ${"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} <br>  //true
        
        <%
            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表达式当中的 "==" "eq" 都是调用了equals方法。--%>
        ${stu1 == stu2} <br>   //true
        ${stu1 eq stu2} <br>   //true
        
        <hr>
        <%-- != 也会调用对象的equals方法。--%>
        ${stu1 != stu2} <br>  //false
        ${200 != 200} <br>    //false
        
    • 逻辑运算符

      • ! && || not and or
        <%--以下语法错误,没有加小括号--%>
        \${!stu1 eq stu2} <br>
        
        <%--正确的--%>
        ${!(stu1 eq stu2)}<br>  //false
        ${not(stu1 eq stu2)}<br>  //false
        
        (注意:!和not都是取反)
    • 条件运算符

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

      • [ ]和.

    • empty运算符

      • empty运算符的结果是boolean类型
      • ${empty param.username}
      • ${not empty param.username}
      • ${!empty param.password}
        <hr>
        <%--empty运算符:运算结果是boolean类型。--%>
        <%--判断是否为空,如果为空,结果是true。如果不为空,结果是false--%>
        ${empty param.username} <br>  //true
        ${!empty param.username} <br>  取反 //false
        ${not empty param.username} <br>  //false
        
        <hr>
        <%--结果false--%>
        <%--empty param.password前半部分是boolean类型。后面是null--%>
        ${empty param.password == null} <br>    //false
        ${(empty param.password) == null} <br> //false
        
        ${param.password == null} <br>  //true

举报

相关推荐

0 条评论