EL表达式(上)

EL表达式

1. EL表达式是干什么的?
- Expression Language(表达式语言)
- EL表达式可以代替JSP中的java代码,让JSP文件中的程序看起来更加整洁美观
- JSP中夹杂着各种java代码,例如<% java代码%>等,导致JSP文件混乱,不好维护,所以有了后期的EL表达式
- EL表达式可以算是JSP语法的一部分,EL表达式归属于JSP

2. EL表达式出现在jsp中主要是:
- 从某个作用域中取数据(四个域:pageContext,request,session,application),然后将其转换为字符串,然后将其输出到浏览器,这就是EL表达式的功效。
3. EL表达式基本语法格式:
- $(表达式)


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

<%
  //向request作用域中存储username为zhangsan
  request.setAttribute("username","zhangsan");
%>

<%-- 将request域当中的数据取出来,并且还要输出到浏览器,使用java代码怎么办--%>
<%=request.getAttribute("username") %>

EL表达式(上)_第1张图片

以上是用JSP在浏览器打印输出zhangsan,后面加EL表达式后

<%-- 使用EL表达式--%>
${username}

EL表达式(上)_第2张图片

举例

  • 写一个javabean类,user
package com.bjpowernode.javaweb.servlet;

public class User {
    private String username;
    private String password;
    private int age;

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

    public User(String username, String password, int age) {
        this.username = username;
        this.password = password;
        this.age = age;
    }

    public String getUsername() {
        return username;
    }

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

    public String getPassword() {
        return password;
    }

    public void setPassword(String password) {
        this.password = password;
    }

    public int getAge() {
        return age;
    }

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

  • JSP中调用 输出到浏览器

<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<%@ page import="com.bjpowernode.javaweb.servlet.User" %>

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

    //将User对象存储到request对象
    request.setAttribute("userObj",user);
%>

<%-- 使用EL表达式从request域中,取出User对象,并将其输出到浏览器--%>
${userObj}

<%--想输出的是user对象的username属性 --%>
${userObj.username}

<%--输出password--%>
${userObj.password}

<%--输出年龄age--%>
${userObj.age}

EL表达式(上)_第3张图片

注意
比如${userObj.email},javabean中可以没有email属性,但是一定有email的get方法
EL表达式(上)_第4张图片

4. a b c 和 {abc}和 abc{“abc”}的区别

  • ${abc}表示从某个域中取出数据,并且被取的这个数据的name是“abc”,之前一定有这样的代码:域.setAttribute(“abc”,对象);
  • ${“abc”}表示直接将“abc”当作普通字符串输出到浏览器,不会从某个域中取数据了。
  • ${userObj}底层是怎么做的?从域中取数据,取出user对象,然后调用user对象的toString方法,转换称字符串,输出到浏览器。
  • 输出对象的属性值 ${userObj.username} 使用这个语法的前提是:User对象有getUsername()方法

5.

  • EL表达式默认优先从小的域取数据,从小到大依此是pageContext
<%@ page contentType="text/html;charset=UTF-8" language="java" %>

<%
    //四个域都存储了数据,并且name相同
    session.setAttribute("data","session");
    request.setAttribute("data","request");
    pageContext.setAttribute("data","pageContext");
    application.setAttribute("data","application");
%>
${data}

<%--在没有指定范围的情况下,但在EL表达式中可以指定范围读取数据--%>
<%--EL表达式有4个隐含的范围对象   pageScope requestScope sessionScope applicationScope--%>


${pageScope.data}
${requestScope.data}
${sessionScope.data}
${applicationScope.data}

注意:在实际开发中,因为向某个域中存储数据时候,name都是不同的,所以XXXScope都是可以省略的

6.
当jsp中出现错误时,如以下代码,存入username-zhangsan,取的时候输入错误,因此EL表达式设计更好,对出错进行了处理,在浏览器上显示空白

<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<%
    request.setAttribute("username","zhangsan");
%>
<%= request.getAttribute("username")%>
采用EL表达式: ${username}


<%--username 输入错误导致在浏览器上的输出什么 JSP输出nullEL表达式输出空白--%>
<%= request.getAttribute("usernam")%>
采用EL表达式: ${usernam}

EL表达式(上)_第5张图片

注意:${usernam} 这个EL表达式等同于这一段java代码 <%=request.getAttribute(“usernam”)==null ? " " : request.getAttribute(“usernam”)%>

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

  • 第一种: . (大部分使用这种方式)
  • 第二种: [ ] (如果存储到域的时候,这个name中含有特殊字符,可以使用[ ])
    如: request.setAttribute(“abc.def”,“zhangsan”);
    ${requestScope.abc.def } 这样是无法取值的
    应该是 ${requestScope[“abc.def”]}

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

 -  ${map.key}

掌握使用EL表达式,怎么从数组中取数据

 -  ${数组[0]}

掌握使用EL表达式,怎么从list中取数据

- ${list[0]}

9.

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

- <%@page contentType="text/html;charset=UTF-8" isELIgnored="true"  表示忽略EL表达式


- isELIgnored=“false” 表示不忽略EL表达式(默认)
- 忽略某一个EL表达式 前面加“\”

10.
根据EL表达式获取应用的根
在EL表达式中没用request这个隐式对象。requestScope这个只代表“请求范围”,不等同于request对象。在EL表达式当中有一个隐式对象:pageContext
EL表达式中的pageContext和JSP中的九大内置对象pageContext是同一个对象

<%=(HttpServletRequest)pageContext.getRequest().getContextPath()%>
这段java代码对应的EL表达式,获取应用的根路径
${pageContext.request.contextPath} 

11.
EL表达式中其他隐式对象:
- param
- paramValues
- initParam

你可能感兴趣的:(java,开发语言)