java - EL

简介:

EL 表达式语言 ,简化了 JSP 语言的写法。

eg:

<%
if(session.getAttribute(nunamen)!==null)
{
    Out.println(session.getAtribute("uname").toString());
}
%>

转换为EL:

$ {uname}

好处

可以与 JSTL 以及 JavaScript 结合使用。
可自动执行数值转换。例如,如果想输出两个字符串数值型 number1 和 number2 的和,可以通过“+”连接,即 ${numberl+number2}。
可以访问 JavaBean 中的属性、嵌套属性和集合属性。
可实现算术、逻辑、关系、条件等多种运算。
可以获得命名和空间(pageContext 对象是页面中所有其他内置对象的最大范围的继承对象,通过它可以访问内置对象)。
执行除法时如果除数是 0,则返回无穷大(Infinity),不返回错误。
可访问 4 种 JSP 的作用域(request、session、application、page)。
扩展函数可以与 Java 类的静态方法执行映射。

禁用EL的方法

最具体的方法直接在EL表达式前面加入\

\${uname}

第二种,使用page指令

<%@ page isEIiIgnored="true" %>

第三种,全局设置在web.xml中

<jsp-property-group>
    <url-pattern>*jsp</url-pattern>
    <el-ignored>false</el-ignored>
</jsp-propery-group>

格式

${EL 表达式}

它以“${”开头,以“}”结束,中间为合法的表达式,里面可以是字符串或者El运算符组成的表达式

 

EL点(.)和[]运算符 

不能互换的场景:

当要存取的数择名称中包含不是字母或数字的特殊字符时,只能使用 []
 当取得的数据为动态值时,只能使用 []
${sessionScope.user.["user-sex"]}
${sessionScope.user[param]}

其他时候基本都可以互换

${sessionScope.user.sex}
等价于
${sesionScope.user["sex"]}

需要保证要取得对象的那个属性有相应的 setXxx() 和 getXxx() 方法才行。

 

算数运算符

 

关系运算符:

 例子

<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<html>
<head>
    <title>关系运算</title>
</head>
<body>
<h3>\${9==9}-----${9==9}</h3>
<h3>\${9>9}-----${9>9}</h3>
<h3>\${9<=9}-----${9<=9}</h3>
<h3>\${9 eq 9}-----${9 eq 9}</h3>
<h3>\${9 gt 9}-----${9 gt 9}</h3>

</body>
</html>

re

逻辑运算符:

 例子

<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<html>
<head>
    <title>关系运算</title>
</head>
<body>
<h3>\${(9==9)&&(9<9)}-----${(9==9)&&(9<9)}</h3>
<h3>\${(9==9)&&(9>9)}-----${(9==9)&&(9>9)}</h3>
<h3>\${(9==9)||(9==9)}-----${(9==9)||(9==9)}</h3>
<h3>\${(9==9)||(9>9)}-----${(9==9)||(9>9)}</h3>
<h3>\${(9 gt 9)and(9==9)}-----${(9 gt 9)and(9==9)}</h3>
</body>
</html>

re

 

条件运算符
${条件表达式?表达式1:表达式2}

<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<html>
<head>
    <title>关系运算</title>
</head>
<body>
<h3>\${(9==9)?(90==9):(99==99)}-----${(9==9)?(90==9):(99==99)}</h3>
<h3>\${(9==9)?2:1}-----${(9==9)?1:3}</h3>
<h3>\${(9==9)?"9和9相等":"9和9不等"}-----${(9==9)?"9和9相等":"9和9不等"}</h3>
</body>
</html>

re

 

EL表达式的保留字

保留字是系统预留的名称,在为变量命名时,应该避开这些预留的名称,以免程序编译时发生错误。

包括:

 

 

 

null -empty

empty:

通过 empty 运算符,可以实现在 EL 表达式中判断对象是否为空。该运算符用于确定一个对象或者变量是
否为 null 或空。若为空或者 null,返回空字符串、空数组,否则返回 false

例子:

当 cart 变量为空时,输出购物车为空,否则输出购物车
${empty cart?"购物车为空":cart}

null和empty的区别

<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<html>
<head>
    <title>Title</title>
</head>
<body>
name: ${param.name}
${empty param.name}
${param.name eq null}
</body>
</html>

 

url:http://localhost:8089/mavenonweb_war/EL/emptynull.jsp

re:

url;http://localhost:8089/mavenonweb_war/EL/emptynull.jsp?name=

url:http://localhost:8089/mavenonweb_war/EL/emptynull.jsp?name=quan

由上面可以知道,再EL表达式当中,当name是有赋值,当时赋值为空的时候

empty是认为它是空的,返回true

null则认为空值不是null ,所有返回false 

 

变量访问:

常量

EL 表达式中的常量也称为字面常量,它是不可改变的数据。包括下面的字面常量

 

1Null 常量:Null 常量用于表示常量引用的对象为空,它只有一个 null 值。
2整型常量:整型常量与 Java 中的十进制整型常量相似,它的取值范围与 Java 语言中
long 范围的整型常量相同,即在 -263~263-1 之间。
3浮点数常量:浮点数常量用整数部分加小数部分来表示,也可以用指数的形式来表示。
  例如,
1.3e4 和 1.3 都是合法的浮点数常量,它的取值范围是 Java 语言中定义的范围,即其绝对值介于 4.9E-324~1.8E-308 之间。
4布尔常量:布尔常量用于区分一个事物的正反两方面,它的值只有两个,分别是
truefalse
5字符串常量:字符串常量是使用单引号或者双引号括起来的一连串字符。如果字符串常量本身又含有单引号或双引号,
  则需要在前面加上“\”进行转义,即用“V”表示单引号,用表示双引号。如果字符本身包含“\”,则需要用“\\”表示字面意义上的反斜杠。
6符号常量:在 EL 表达式语言中,可以使用符号常量,它类似于 Java 中
final 说明的常量。使用符号常量的目的是为了减少代码的维护量。

 

 

 

 

</head>
<%
String color="#66FFFF";
String size="12";
String textclr="Blue";
String foregr="Red";
pageContext.setAttribute("color",color);
pageContext.setAttribute("size",size);
pageContext.setAttribute("textclr",textclr);
pageContext.setAttribute("foregr",foregr);
%>
<body bgcolor="${ pageScope.color }"
    text="${ pageScope.textclr }">
<h1>EL 中的符号常量的用法</h1>
<Font color="${ pageScope.foregr }"
    size="${ pageScope.size }">
    背景色和文本颜色已经修改
</Font>

 

变量

EL 存取变量数据的方法很简单,如 ${username}。它的意思是取出某一范围中的名为 username 的变量值。因为没有指定哪一个范围的 usemame,所以,它的默认值是在 page 范围内查找,如果找不到,则按照 request、session、application 范围依次查找,如果此期间找到 usemame,则直接回传,不再继续找下去,如果没有找到,则返回 null

<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<html>
<head>
    <title>表达式属性范围</title>
</head>
<body>
<%
    pageContext.setAttribute("name","quan-pageContext");
    request.setAttribute("name","quan-request-Context");
    session.setAttribute("name","quan-session-Context");
    application.setAttribute("name","quan-application-Context");
%>
${pageScope.name}
<p> </p>
${requestScope.name}
<p> </p>
${sessionScope.name}
<p> </p>
${applicationScope.name}
<p> </p>
只指定变量名字,没指定范围${name}
</body>
</html>

re

自动转格式:

 

<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<html>
<head>
    <title>EL表达式</title>
</head>
<body>
<%
    session.setAttribute("quan","xiaoqiang");
    session.setAttribute("age",22);
//    以前需要这样子做转换才能相加
    Integer  age = (Integer) session.getAttribute("age");
    age = age+1;
    out.print(age);
%>
<%--使用EL表达式之后--%>
<h3>${sessionScope.quan}</h3>
<h3>${sessionScope.age + 1}</h3>
</body>
</html>

 

基本的规则

(1) 将 X 转为 String 类型。
当 X 为 String 时:回传 X。
当 X 为 null 时:回传“ ”。
当 X.toString() 产生异常时,返回错误。
其他情况则传回 A.toString()。

(2) 将 X 转为 Number 类型的 N。
当 X 为 null 或“ ”时,回传 0。
当 X 为 Character 时,将 X 转为 new Short((short)x.charValue(})。
当 X 为 Boolean 时,返回错误。
当 X 为 Number 类型,与 N 一样时,则回传 X。
当 X 为 String 时,回传 N.valueOf(X)。

(3) 将 X 转为 Boolean 类型。
当 X 为 null 或“ ”时,回传 false。
当 X 为 Boolean 时,回传 X。
当 X 为 String 且 Boolean.valueOf(X) 没有产生异常时,回传 Boolean.valueOf(X)。

(4) 将 X 转为 Character 类型。
当 X 为 null 或“ ”时,回传 (char)0。
当 X 为 Character 时,回传 X。
当 X 为 Boolean 时,返回错误。
当 X 为 Number 时,转换为 Short 后,回传 Character。
当 X 为 String 时,回传 X.charAt(0)。

 

EL内置对象

 

 4种属性范围

 

 当我们有不同属性范围内有同一个属,访问的时候按照的顺序为:

page、request、session、application 的范围进行查

 

 

调用内部函数

</head>
<body>
    <h1>pageContext调用内置函数</h1>
    id:${pageContext.session.id}
    <p></p>
    addr:${pageContext.request.remoteAddr}
    <p></p>
    host:${pageContext.request.remoteHost}
</body>
</html>

re

 

 EL访问javaBean

Servlet 通常用于处理业务逻辑,由 Servlet 来实例化 JavaBean,最后在指定的 JSP 程序中显示 JavaBean 中的内容。使用 EL 表达式可以访问 JavaBean

 格式:

${bean.property}

bean 表示 JavaBean 实例对象的名称

property 代表该 JavaBean 的某一个属性。

<body>
<h1>使用 EL 表达式访问 JavaBean </h1>
<hr>
<%
Person p1=new Person();
p1.setID("240225288303453578");
p1.setName("夜华");
session.setAttribute("p1",p1);
%>
<h3>学生学号是:${p1.ID}</h3>
<h3>学生姓名是:${p1.name}</h3>
</body>

 

 

EL访问集合

 在 EL 表达式中,同样可以获取集合的数据,这些集合可能是 Vector、List、Map、数组等。

${collection [序号]}

二维数组:

若操作的集合为二维集合,如 HashMap,其值是 key 和 value 值对的形式,则值 (value) 可以这样显示:

value可以这样子取

${collection.key}

 例子:

<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<html>
<head>
    <title>EL中的list</title>
</head>
<body>
<%
    Map quanmap = new HashMap<String ,String>();
    quanmap.put("name","quan");
    quanmap.put("age","33");

    List quanlist = new ArrayList();
    quanlist.add("QQ");
    quanlist.add("zz");

    session.setAttribute("quanlist",quanlist);
    session.setAttribute("quanmap",quanmap);
%>
    ${quanlist[1] } ${quanlist[0]}
    ${quanmap.keySet()}
    ${quanmap.age}
</body>
</html>

re

 

内置对象param和paramValues

除了 page、request、session 和 application 4 种内置对象作用域外,

EL 表达式还定义了一些其他的内置对象

param

param 对象用于获取某个请求参数的值,它是 Map 类型,与 request.getParameter() 方法相同,
在 EL 获取参数时,如果参数不存在,则返回空字符串
格式:
${param.QQ}

paramValues

 

返回请求参数的所有值,该对象用于返回请求参数所有值组成的数组

 

数组就要用数组取的形式取买

 

 

num1:${paramValues.num[0]}
num2:${paramValues.num[1]}

 

 

cookie

cookie 内置对象可以获取 cookie 的值

格式:

${cookie.Cookie 名称.value}
<%
    response.addCookie(new Cookie("username","Make"));
%>

<h3>${cookie.username.value}</h3>

 

initparam

 

  <context-param>
    <param-name>forsomething</param-name>
    <param-value>jfchh</param-value>
  </context-param>

jsp:

<body>
${initParam.forsomething}
</body>

 

posted @ 2020-07-05 22:54  小丑quan  阅读(353)  评论(0)    收藏  举报