• 中文
    • 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.5k
    • 请登录之后再进行评论

      登录

      赞助本站

      • 支付宝
      • 微信
      • QQ

      感谢一直支持本站的所有人!

      单栏布局 侧栏位置: