欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页  >  IT编程

JSP EL表达式

程序员文章站 2022-06-20 23:09:04
EL即Expression Language(表达式语言),是一种简单的数据访问语言。 EL和输出表达式<%= %>的功能差不多,都是输出表达式的值,但二者使用的对象有所不同。 EL表达式语法: ${表达式} //表达式后面不能加分号。 访问常量: ${1} //int ${"ok"} //Stri ......

 

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