一. 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
请登录之后再进行评论