JSP EL表达式

Posted chy18883701161

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了JSP EL表达式相关的知识,希望对你有一定的参考价值。

 

EL即Expression  Language(表达式语言),是一种简单的数据访问语言。

EL和输出表达式<%=  %>的功能差不多,都是输出表达式的值,但二者使用的对象有所不同。

 

 

EL表达式语法:

 $表达式       //表达式后面不能加分号。

 

 

访问常量:

$1    //int 

$"ok"   //String

$false   //boolean

$null    //null

 

 

访问变量:

$name=1    //1。EL表达式中的变量不用先声明|定义,可直接使用。比如此处未声明 int name 。

$name    //访问变量的值

以Java获取值,如果变量不存在或值是null,,会报空指针异常。El表达式则不会,EL表达式会输出空串。

 

 

算术运算符:

$a+b  //加

$a-b   //减

$a*b   //乘

$a/b   或  $a div b    //除

$a%b  或  $a mod b   //取模

 

 

比较运算符:

返回boolean值,为避免与html标签<>冲突,可使用英文简写。

$a==b    或  $a eq b      equals

$a!=b  或  $a nq b      not equals

$a<b  或  $a lt b     less  than

$a<=b  或  $a  le  b     less equals

$a>b  或  $a gt  b     greater  than

$a>=b  或  $a ge b     greater  equals

 

 

逻辑运算符:

$a && b  或   $a and b

$a || b   或  $a or b

$!a   或   $not  a

 

 

三目运算符:

$a?b:c

 

 

empty运算符:

$empty  a     //判断变量a是否为空,返回boolean值

若变量a不存在,返回true;

若变量a存在,但值为null,返回true;

若变量a是集合类型(List、Set、Map),值不为null,但却是空集合,返回true。

 

 

不确定运算符的优先级时,加()。

 

 

 

EL取对象的属性(成员变量)

  • $ 对象名.属性名     //属性名不加引号。属性一般是private,不能直接访问,实质还是调用getter()方法。
  • $ 对象名.getXxx()    //使用getter()方法
  • $ 对象名["属性名"]     //属性名要加引号

 

 

EL取数组元素

  • $ 数组名[下标]

 

 

 

 

EL表达式与输出表达式<%=   %>的异同点

  • 使用位置相同。放置位置和html标签相同,此外还能放在html标签的属性中,比如<form action="$ "></form>。
  • 输出表达式可以访问JSP的内置对象,可以访问<%!   %>、<%   %>中定义的变量,可以调用<%!  %>中定义的方法,可以访问<jsp:useBean />定义的对象。
  • EL表达式不能访问JSP的内置对象,不能访问<%!   %>、<%   %>中定义的变量,不能调用<%!  %>中定义的方法,可以访问<jsp:useBean />定义的对象。

EL表达式那么多数据都不能访问,为什么是数据访问语言?

EL表达式有自己的内置对象,一般地,EL表达式使用自己的内置对象来访问数据。

 

 

 

 

EL表达式的11个内置对象|隐式对象

  • pageScope    
  • requestScope
  • sessionScope
  • applicationScope
  • pageContext    //相当于JSP内置的pageContext,常用于获取其他对象
  • param    //所有的请求参数(表单数据、url中?后面的部分)
  • paramValues
  • header    //HTTP请求头的所有字段
  • headerValues
  • cookie
  • initParam    //整个web应用的初始化参数

这些内置对象都是使用Map来存储数据。

 

 

EL表达式虽然不能访问<%  %>中定义的变量,比如 <% Student student=new Student(); %> ,在EL表达式中不能访问student对象。

但Servlet、JSP可以使用setAttribute()把数据(变量)放到4个域中,EL表达式从域中取出数据。

 1  <%
 2       pageContext.setAttribute("id","01");   //page域
 3       request.setAttribute("name","chy");  //request域
 4       session.setAttribute("age",20);  //session域
 5       application.setAttribute("score",100);  //application域
 6   %>
 7 
 8 <%--  2种写法等效--%>
 9   $pageScope.get("id")
10   $pageContext.getAttribute("id")
11 
12   $requestScope.get("name")
13   $pageContext.request.getAttribute("name")
14   
15   $sessionScope.get("age")
16   $pageContext.session.getAttribute("age")
17   
18   $applicationScope.get("score")
19   $pageContext.servletContext.getAttribute("score")

 

 

(1)pageScope、requestScope、sessionScope、applicationScope这4个域对象的常用方法

  • get(key)    //获取属性值
  • getOrDefault(key, defaultValue)   //若域中没有name属性,则返回设置的默认值
  • clear()    //清空整个域
  • remove(key)   //删除某个属性
  • remove(key,value)
  • replace(key, oldValue, newValue)   //替换某个属性的值
  • containsKey(key)   //是否包含指定的key,返回boolean
  • keySet()    //获取域中key的集合,返回Set
  • values()   //获取值的集合,返回Collection
  • entrySet()    //获取entry(一个键值对)的集合,返回Set

这4个域只有取数据的方法,没有设置数据的setXxx()方法。

 

 

 

(2)pageContext的常用方法

  • .servletContext
  • .servletConfig
  • .out
  • .session
  • .request
  • .response
  • .exception

这些获取其他对象的方式,表面上是通过成员变量来获取,实际仍是调用getXxx()来获取。

pageContext相当于一个大Map,里面还装了些小Map。

 

EL内置的4个域对象没有设置数据的setXxx()方法。设置数据可以用上面pageContext的几个成员变量来实现:

$pageContext.request|session|servletContext.set|remove|getAttribute()   

上面只有三个域,page域呢?

pageContext本身就是page域: pageContext.set|get|removeAttribute() 

 

此外pageContext还有2个常用方法:

  • forward(String url)    //请求转发
  • include(String url)   //请求包含

均是服务器内部行为,浏览器总的只发送一次HTTP请求,可以看到地址栏是没有变的。

 

 

 

EL表达式从域中取数据的方法总结

  • $ pageScope.get("age")      //xxxScope.get("xxx")
  • $ pageScope.age     //直接以属性名来取,属性名不加引号。十分方便,推荐。
  • $ age    //直接以属性名来取。向这种没有指定域的,默认从page、request、session、applicaiotn依次找,找到一个就返回,不再继续往下找。
  • $ pageContext.request.getAttribute("age")    //先通过pageContext获取指定的域,再获取数据
  • $pageContext.getAttribute("age")    //特殊:pageContext本身就表示page域

 

 

 

(3)param、paramValues

param、paramValues中保存的是请求参数(表单数据、url中?后面的部分)。

请求参数会存储为2份:

  • param。key是String(字段名),value是String。因为使用Map存储,key不能重复,所以有相同的字段名时,比如?hobby="running"&hobby="swimming",只存储第一个,不会存储后面相同的。
  • paramValues。key是String(字段名),value是String[]。不管有没有相同的字段名,值都是存储为String[]形式,比如?hobby="running",存储为"running"。
<form method="post" action="handle.jsp">
     姓名:<input type="text" name="name" /><br />
     爱好:<input type="checkbox" name="hobby" value="running" >跑步
     <input type="checkbox" name="hobby" value="swimming" >游泳<br />
     <button type="submit">提交</button>
 </form>

 

<%
    request.setCharacterEncoding("utf-8");
    response.setContentType("text/html;charset=utf-8");
%>

<p>姓名:$param.name</p>
<p>爱好:$paramValues.hobby[0]、$paramValues.hobby[1]</p>

 

param是Map<Stirng,String>类型、paramValues是Map<Stirng,String[]>类型,这2个EL内置对象都可以使用Map的方法。

 

 

 

(4)cookie对象

cookie对象表示存储请求头中所有Cookie的Map集合。

$cookie.JSESSIONID    //获取JSESSIONID这个Cookie

$cookie.JSESSIONID.name   //获取JSESSIONID这个Cookie的name

$cookie.JSESSIONID.value   //获取JSESSIONID这个Cookie的value

 

以上是关于JSP EL表达式的主要内容,如果未能解决你的问题,请参考以下文章

el表达式

JSP -- EL表达式

jsp中el表达式如何获取当前输入框的值?

jsp之EL表达式

EL——表达式概述运算内置对象

JSP编程专题2之JSP核心二(EL表达式,EL运算符以及除了和四个域属性空间相关的EL内置对象)