JAVA JSP页面技术之EL表达式整理归纳总结
一、概念
表达式语言(expression language),或称el表达式,简称el,是java中的一种特殊的通用编程语言,借鉴于javascript和xpath。主要作用是在java web应用程序嵌入到网页(如jsp)中,用以访问页面的上下文以及不同作用域中的对象 ,取得对象属性的值,或执行简单的运算或判断操作。el在得到某个数据时,会自动进行数据类型的转换。
主要作用:
1) 获取数据
el表达式主要用于替换jsp页面中的脚本表达式<%= %>,以从各种类型的web域 中检索java对象、获取数据。(某个web域 中的对象,访问javabean的属性、访问list集合、访问map集合、访问数组)
2) 执行运算
利用el表达式可以在jsp页面中执行一些基本的关系运算、逻辑运算和算术运算,以在jsp页面中完成一些简单的逻辑运算。${user==null}
3) 获取web开发常用对象 el
表达式定义了一些隐式对象,利用这些隐式对象,web开发人员可以很轻松获得对web常用对象的引用,从而获得这些对象中的数据。
4) 调用java方法
el表达式允许用户开发自定义el函数,以在jsp页面中通过el表达式调用java类的方法。
注意:<%@ pageiselignored=”true” %>
表示是否禁用el语言,true表示禁止.false表示不禁止.jsp2.0中默认的启用el语言
二、语法
以“${”开始,以“}”作为结束:
${el表达式}
实例:
${ str } //输出字符串变量str的值 ${ 1 + 2 } //输出1+2的结果 ${ user.name} //输出user对象的name属性 访问对象user的getname()方法以得到name成员的值。 ${user[“name”] } //同上 ${ sessionscope[“user”].name } //同上 ${list[0]} //访问list对象的第一项。 ${map[“key”]} //访问map指定键的值。
三、取操作符
el提供 . 和 [ ] 两种运算符来存取数据:
. 访问一个bean属性或者一个映射条目 如:${ user.name}
[ ] 可以访问集合或者是数组的元素、也可以访问bean的属性。 如:${ arr[0].name}
异同:
相同:可以用来访问对象的属性
差异:当要存取的属性名称中包含一些特殊字符,如 . 或 ? 或 - 等非字母或数字的符号,就一定要使用 [],如user.my-name应{user[“my-name”]}
四、运算符:
● 算术运算符有五个:+、-、*、/或div、%或mod
● 关系运算符有六个:==或eq、!=或ne、<或lt、>或gt、<=或le、>=或ge
● 逻辑运算符有三个:&&或and、||或or、!或not
● 其它运算符有三个:empty运算符、条件运算符、()运算符
五、隐含对象
jsp el支持下表列出的隐含对象:
可以在表达式中使用像变量一样使用这些对象。
按功能分组如下:
1) 访问参数值:
param : 可取得对应单个请求参数名的值。如:$(param.name) 相当于 request.getparameter (name)。
paramvalues: 可根据参数名取得对于的字符串数组。如:${paramvalues.name) 相当于 request.getparamtervalues(name)。
注:param对象返回单一的字符串,而paramvalues对象则返回一个字符串数组。
2) 访问头信息
header:可以取得请求头信息中,对应的单个字符串头值。表达式 header.name相当于request.getheader(name)。如{header[“user-agent”]}。可打印出 user-agent 信息头。
headervalues:可将请求头名称映射到一个数值数组。如 ${headervalues.name} 相当于 request.getheadervalues(name)。
注:header对象返回单一值,而headervalues则返回一个字符串数组。
3) 访问其他有关用户要求或页面的详细信息
pagecontext:
pagecontext.request|取得请求对象{pagecontext.session} |取得session对象
pagecontext.request.querystring|取得请求的参数字符串{pagecontext.request.requesturl} |取得请求的url,但不包括请求之参数字符串
pagecontext.request.contextpath|服务的webapplication的名称{pagecontext.request.method} |取得http的方法(get、post)
pagecontext.request.protocol|取得使用的协议(http/1.1、http/1.0){pagecontext.request.remoteuser} |取得用户名称
pagecontext.request.remoteaddr|取得用户的ip地址{pagecontext.session.new} |判断session是否为新的,所谓新的session,表示刚由 server产生而client尚未使用 的
pagecontext.session.id|取得session的id{pagecontext.servletcontext.serverinfo}|取得主机端的服务信息
4)访问不同作用域的变量,如 web 上下文、会话、请求、页面:
pagescope :取得页面范围的值
如用 pagescope.objectname访问一个jsp中页面范围的对象,还可以使用{pagescope.objectname.attributename} 访问对象的属性。
requestscope:取得请求范围的变量值
该对象允许访问请求对象的属性。如用 requestscope.objectname访问一个jsp请求范围的对象,还可以使用{requestscope.objectname.attributename} 访问对象的属性。
sessionscope:取得会话范围的变量值
该对象允许访问会话对象的属性。如:$sessionscope.name}
applicationscope:取得应用程序范围的变量值
该隐式对象允许访问应用程序范围的对象
5) 访问cookie中的值
如要取得cookie中有一个设定名称为username的值,可以使用${cookie.username} 来取得它。
六、使用sun提供的标准 el函数库
由于在jsp页面中显示数据时,经常需要对显示的字符串进行处理,sun公司针对于一些常见处理定义了一套el函数库供开发者使用。
这些el函数在jstl开发包中进行描述,因此在jsp页面中使用sun公司的el函数库,需要导入jstl开发包,并在页面中导入el函数库。
使用el函数库
1) 导入 jstl jar包
2) 在相应的jsp页面添加引用
<%@ page language="java" contenttype="text/html; charset=utf-8" pageencoding="utf-8" import="java.util.*" %> <!--导入需要使用taglib指令 --> <%@ taglib prefix="fn" uri="http://java.sun.com/jsp/jstl/functions" %> <!doctype html public "-//w3c//dtd html 4.01 transitional//en" "http://www.w3.org/tr/html4/loose.dtd"> <html> <head> <meta http-equiv="content-type" content="text/html; charset=utf-8"> <title>el function demo</title> </head> <body> <% string[] strs = {"a","b","c"};//定义一个字符数组 list list = new arraylist();//定义一个list集合 list.add("a");//向集合中添加一个字符 pagecontext.setattribute("arr", strs);//将字符数据以arr的名字保存在page域中 pagecontext.setattribute("list", list);//将list集合以list的名字保存在page域中 %> ${fn:length(arr) }<br/><!--3--> ${fn:length(list) }<br/><!--1--> ${fn:tolowercase("hello") }<br/> <!-- hello --> ${fn:touppercase("hello") }<br/> <!-- hello --> ${fn:contains("abc", "a")}<br/><!-- true --> ${fn:containsignorecase("abc", "ab")}<br/><!-- true --> ${fn:contains(arr, "a")}<br/><!-- true --> ${fn:containsignorecase(list, "a")}<br/><!-- true --> ${fn:endswith("hello.java", ".java")}<br/><!-- true --> ${fn:startswith("hello.java", "hell")}<br/><!-- true --> ${fn:indexof("hello-world", "-")}<br/><!-- 5 --> ${fn:join(arr, ";")}<br/><!-- a;b;c --> ${fn:replace("hello-world", "-", "+")}<br/><!-- hello+world --> ${fn:join(fn:split("a;b;c;", ";"), "-")}<br/><!-- a-b-c --> ${fn:substring("0123456789", 6, 9)}<br/><!-- 678 --> ${fn:substring("0123456789", 5, -1)}<br/><!-- 56789 --> ${fn:substringafter("hello-world", "-")}<br/><!-- world --> ${fn:substringbefore("hello-world", "-")}<br/><!-- hello --> ${fn:trim(" a b c ")}<br/><!-- a b c --> ${fn:escapexml("<html></html>")}<br/> <!-- <html></html> --> </body> </html>
函数库详细介绍
string touppercase(string input):把字符串参数转换成大写,并返回
string tolowercase(string input):把字符串参数转换成小写,并返回
int indexof(string input, string substring):返回input中substring出现的索引位置
boolean contains(string input, string substring):查看input中是否包含substring,包含返回true,否则返回false;
boolean containsignorecase(string input, string substring):在忽略大小写的情况下,查看input中是否包含substring,包含返回true,否则返回false
boolean startswith(string input, string substring):判断input是否是以substring为前缀,如果是就返回true,否则就返回false
boolean endswith(string input, string substring):判断input是否是以substring为后缀,如果是就返回true,否则就返回false
string substring(string input, int beginindex, int endindex):以beginindex为开始值,endindex为结束值,在input上截取子串
string substringafter(string input, string substring):获取input中,substring所在位置后面的字符串
substringbefore(string input, string substring):获取input中,substring所在位置前面的字符串 string escapexml(string input):把input中“<”、“>“、”&“、”'“、“””进行转义;
string trim(string input):去除input中的前后空格;
string replace(string input, string substringbefore, string substringafter):将input中的substringbefore替换成substringafter;
string[] split(string input, string delimiters):以delimiters为标识分割input,返回一个字符串数组;
int length(object obj):可以获取字符串、数组、各种集合的长度;
string join(string array[], string separator):将array数组中的元素以separator连接起来,返回一个字符串
七、el调用自定义函数 (调用普通类的静态方法)
el很强大,除了使用sun提供的标准el函数库外,还可以调用自定义函数:
● el表达式语法允许开发人员开发自定义函数,以调用java类的方法。语法:${prefix:method(params)}
● 在el表达式中调用的只能是java类的静态方法,这个java类的静态方法需要在tld文件中描述,才可以被el表达式调用。
● el自定义函数用于扩展el表达式的功能,可以让el表达式完成普通java程序代码所能完成的功能。
el function开发步骤
只要实现以下三个步骤就可以在静态页面中用${prefix:method(params)} 调用自定义function了
编写一个java类的静态方法
编写标签库描述符(tld)文件,在tld文件中描述自定义函数。
在jsp页面中导入和使用自定义函数
下面来个案例:
1)编写一个java类的静态方法
public class getmax { public static int togetmax(int a, int b){ return a>b?a:b; } }
2)编写标签库描述符(tld)
<?xml version="1.0" encoding="utf-8"?> <taglib xmlns="http://java.sun.com/xml/ns/j2ee" xmlns:xsi="http://www.w3.org/2001/xmlschema-instance" xsi:schemalocation="http://java.sun.com/xml/ns/j2ee http://java.sun.com/xml/ns/j2ee/web-jsptaglibrary_2_0.xsd" version="2.0"> <tlib-version>1.0</tlib-version><!-- 定义的版本 --> <short-name>mytaglib</short-name><!--这个名字可以随便取,尽量与文件名相同,这样我们知道文件在哪儿 并与prefix对应--> <uri>http://localhost:8080/springmvc-1</uri><!-- 这个地址是随便取得。到时候jsp页面引入这个地址 --> <function><!-- 定义函数 --> <name>togetmax</name> <function-class>elfunction.getmax</function-class><!-- 定义函数的类全名称 --> <function-signature>int togetmax(int,int)</function-signature> <!--说明 返回值类型 函数名 以及 参数类型 --> </function> </taglib>
3)在web.xml中指定tld文件的位置(这步可以省略,因为应用会自动找到 /web-inf/下的tld文件)
<jsp-config> <taglib> <!-- 此处uri可以自己随便定义,但后面用时一定与这里一样 --> <taglib-uri> http://localhost:8080/springmvc-1 </taglib-uri> <!-- tld文件的路径 --> <taglib-location> /web-inf/tags/mytaglib.tld </taglib-location> </taglib> </jsp-config>
4)在jsp页面中导入和使用自定义函数
<%@ page language="java" contenttype="text/html; charset=utf-8" pageencoding="utf-8"%> <%@ taglib uri="http://localhost:8080/springmvc-1" prefix="mytaglib"%> <!-- prefix 是前缀的意思,应与mytaglib.tld中的<short-name>对应 --> <!doctype html public "-//w3c//dtd html 4.01 transitional//en" "http://www.w3.org/tr/html4/loose.dtd"> <html> <head> <meta http-equiv="content-type" content="text/html; charset=utf-8"> <title>custom el function test</title> </head> <body> 1和2求最大值 = ${mytaglib:togetmax(1,2)} </body> </html>
运行截图
希望本篇文章对您有所帮助