• 中文
    • English
  • 注册
  • 查看作者
  • 13:EL表达式

    一. EL表达式获取请求参数

    《JSP:获取参数值》一文中我们讲过,可以使用request来获取请求参数,这里介绍一种更方便的方式:使用El表达式来获取请求参数。

    与request相比,JSP表达式语言(EL)获取参数显的更加简单合理,而且EL不仅可以用来创建算术表达式也可以用来创建逻辑表达式。在表达式内可以使用整型数,浮点数,字符串,常量true、false,还有null等等。

    以获取name的参数值为例,首先回顾request获取某个请求参数的方式:

    <%=request.getParameter("name")%>

    可以看到,我们需要在getParameter方法中,传入我们要获取的参数名,然后返回该参数名所对应的值。再来看一下El获取参数的方式:

    ${param.name}

    EL的表达式不再是写在<%=%>中,而是写在${}中,在${}中,我们只需要使用param.参数名,的方式即可获取指定的参数值。接下来我们访问http://localhost:8888/index.jsp?name=zhangjia,则request和EL都会输出zhangjia

    <%@ page language="java" contentType="text/html; charset=utf-8" pageEncoding="utf-8" %>
    <!DOCTYPE html>
    <html>
    <head>
        <title>Title</title>
    </head>
    <body>
    <%=request.getParameter("name")%>
    <hr />
    ${param.name}
    </body>
    </html>

    同理,如果获取多个请求参数,可以用下方式来代替request.getParameterValues(“参数名”); 

    ${paramValues.("参数名")}

    另外值得注意的是,request获取不存在的参数,返回值是null,而EL表达式获取不存在的参数,得到是一个空字符串。这就有效的避免了很多空指针异常。

    并且因为request的返回值是字符串,所以没法直接对返回值进行算术运算,而EL可以:

    <%@ page language="java" contentType="text/html; charset=utf-8" pageEncoding="utf-8" %>
    <!DOCTYPE html>
    <html>
    <head>
        <title>Title</title>
    </head>
    <body>
    <%=request.getParameter("age") + 5%>
    <hr />
    ${param.name + 5}
    </body>
    </html>

    我们访问http://localhost:8888/index.jsp?age=10,request显示的值是105,而EL表达式得到的值是15

    二. EL表达式获取作用域数据

    在《JSP:作用域》一文中,我们提到可以使用getAttribute(String)方法来获取作用域中存储的数据,同样,也可以使用EL表达式来完成这项工作。

    <%@ page language="java" contentType="text/html; charset=utf-8" pageEncoding="utf-8" %>
    <!DOCTYPE html>
    <html>
    <head>
        <title>Title</title>
    </head>
    <body>
    <%
        pageContext.setAttribute("age", 1);
        request.setAttribute("age", 2);
        session.setAttribute("age", 3);
        application.setAttribute("age", 4);
    
    %>
    <%=pageContext.getAttribute("age")%>
    <%=request.getAttribute("age")%>
    <%= session.getAttribute("age")%>
    <%=application.getAttribute("age")%>
    
    <%--上面的四种方法分别可以用下面的四种方式代替--%>
    
    <hr />
    ${pageScope.age}
    ${requestScope.age}
    ${sessionScope.age}
    ${applicationScope.age}
    </body>
    </html>

    如果我们没有指定具体的作用域,直接使用${参数名},那么获取的值将会按照作用域范围从小到大的顺序进行查询:

    pageContext->request-> session-> application,举个例子来说明一下:

    <%
        pageContext.setAttribute("age", 1);
        request.setAttribute("age", 2);
        session.setAttribute("age", 3);
        application.setAttribute("age", 4);
    
    %>
    
    <hr />
    ${age}

    输出1,接下来把pageContext注释掉

    <%
        //pageContext.setAttribute("age", 1);
        request.setAttribute("age", 2);
        session.setAttribute("age", 3);
        application.setAttribute("age", 4);
    
    %>
    
    <hr />
    ${age}

    输出2,而如果把request也注释掉

    <%
        //pageContext.setAttribute("age", 1);
        //request.setAttribute("age", 2);
        session.setAttribute("age", 3);
        application.setAttribute("age", 4);
    
    %>
    
    <hr />
    ${age}

    则输出3:接下来再把session注释掉

    <%
        //pageContext.setAttribute("age", 1);
        //request.setAttribute("age", 2);
        //session.setAttribute("age", 3);
        application.setAttribute("age", 4);
    
    %>
    
    <hr />
    ${age}

    输出的还是3,因为当前会话并没有结束,如果从一个新的浏览器打开该页面,则输出的就是4了

    三. EL表达式获取对象属性

    首先准备一个名为Dog的测试类:

    public class Dog {
        private String name;
        private int age;
    
        public String getName() {
            return name;
        }
    
        public void setName(String name) {
            this.name = name;
        }
    
        public int getAge() {
            return age;
        }
    
        public void setAge(int age) {
            this.age = age;
        }
    
        public Dog(String name, int age) {
            this.name = name;
            this.age = age;
        }
    
        public Dog() {
        }
    
        @Override
        public String toString() {
            return "Dog{" +
                    "name='" + name + '\'' +
                    ", age=" + age +
                    '}';
        }
    }

    接来下,我们在一个jsp页面中,创建Dog类的对象,并将其添加到pageContext,就可以使用EL表达式来获取对象的属性值了

    <%@ page import="io.zhangjia.test.Dog" %>
    <%@ page language="java" contentType="text/html; charset=utf-8" pageEncoding="utf-8" %>
    <!DOCTYPE html>
    <html>
    <head>
        <title>Title</title>
    </head>
    <body>
    <%
        Dog dog1 = new Dog("a",10);
        pageContext.setAttribute("dogone",dog1);
    %>
    
    <hr />
    ${pageScope.dogone.name}
    ${pageScope.dogone.age}
    
    </body>
    </html>

    可以看到,EL表达式获取的方式非常简单,直接xxxScope.key.属性名即可,比如你添加到pageContext,那么就是pageScope,如果你添加到request,那么就是requestScope。而key就是我们使用setAttribute方法将dog对象添加到作用域时,给设置的key(也就是上文的dogone,一般key都是和属性名同名,这里为了区分,没有使用dog1,而是使用了dogone),属性名就是我们要查询的dog对象的属性。

    其实在这里说是属性名并不严谨,因为这里的pageScope.dogone.name中的name和pageScope.dogone.age中的age,其实是执行了dog类的name属性和age属性所对应的get方法,如果你类中的name属性的get方法名为getNameS,那么你的pageScope.dogone.name应该改为pageScope.dogone.nameS,所以还是建议大家按照标准的命名规范来命名。

    再看这样的一个例子,我们将上面的Dog类作为Person类的一个属性,将其添加到Person类:

    package io.zhangjia.test;
    
    public class Person {
        private String name;
        private Dog dog;
    
        public String getName() {
            return name;
        }
    
        public void setName(String name) {
            this.name = name;
        }
    
        public Dog getDog() {
            return dog;
        }
    
        public void setDog(Dog dog) {
            this.dog = dog;
        }
    
        public Person(String name, Dog dog) {
            this.name = name;
            this.dog = dog;
        }
    
        public Person() {
        }
    
        @Override
        public String toString() {
            return "Person{" +
                    "name='" + name + '\'' +
                    ", dog=" + dog +
                    '}';
        }
    }

    接下来,将Person类的对象添加到PageContext,同样可以使用EL表达式来通过Person类来获取dog类的属性

    <%@ page import="io.zhangjia.test.Dog" %>
    <%@ page import="io.zhangjia.test.Person" %>
    <%@ page language="java" contentType="text/html; charset=utf-8" pageEncoding="utf-8" %>
    <!DOCTYPE html>
    <html>
    <head>
        <title>Title</title>
    </head>
    <body>
    <%
        Dog dog1 = new Dog("小白",10);
        Person person = new Person("zhangjia",dog1);
        pageContext.setAttribute("person",person);
    %>
    
    <hr />
    ${pageScope.person.dog.name}
    <%--注意上面的dog还是dog对象的get方法,所以不能写成dog1--%>
    
    </body>
    </html>

    同理,像字符串数组,List等等,都可以使用EL表达式来获取:

    <%@ page import="io.zhangjia.test.Dog" %>
    <%@ page import="io.zhangjia.test.Person" %>
    <%@ page errorPage="500.jsp" language="java" contentType="text/html; charset=utf-8" pageEncoding="utf-8" %>
    <!DOCTYPE html>
    <html>
    <head>
        <title>Title</title>
    </head>
    <body>
    <%
        String[] str = {"1","2","3","4","5"};
        request.setAttribute("str",str); //这次添加到request试试
    %>
    
    <hr />
    ${requestScope.str[0]}
    </body>
    </html>

    值得注意的是,用EL表达式获取一个未赋值的对象属性时,得到的也是一个空字符串,而不是该属性的默认值:

    <%@ page import="io.zhangjia.entity.Bike" %>
    <%@ page language="java" contentType="text/html; charset=utf-8" pageEncoding="utf-8" %>
    <!DOCTYPE html>
    <html>
    <head>
        <title>Title</title>
    </head>
    <body>
    <%
        Bike bike = new Bike();
        pageContext.setAttribute("bike",bike);
    %>
    
    [${bike.type}]
    <%
        out.print(bike.getType());
    %>
    </body>
    </html>

    分别输出空值和null

    参考资料:

    菜鸟教程

    山东省
  • 0
  • 0
  • 0
  • 1.7k
  • 请登录之后再进行评论

    登录
    单栏布局 侧栏位置: