-
2021-02-21 00:53:39
一、什么是EL表达式
- EL表达式的全称是:Expression Language是表达式语言
- EL表达式主要是代替jsp页面中的表达式脚本在jsp页面中进行数据的输出
- EL表达式输出数据的时候,要比jsp的表达式脚本要简洁很多
- EL表达式的格式:${表达式}
- EL表达式在输出null值的时候,输出的是空串,jsp表达式脚本输出为null值的时候,输出的是null字符串
二、EL表达式搜索域数据的顺序
-
EL表达式主要是在jsp页面中输出数据
-
主要是输出域对象中的数据
-
当四个域都有相同的key的数据的时候,EL表达式会按照四个域的从小到大的顺序去进行搜索,找到就输出
<% // 往四个域中都分别保存了数据 pageContext.setAttribute("key", "pageContext"); request.setAttribute("key", "request"); session.setAttribute("key", "session"); application.setAttribute("key", "application"); %> ${key}
- 运行tomcat
- 得到的值是pageContext域中的值
三、EL表达式输出Bean的普通属性,数组属性,List集合属性,map集合属性
- 编写一个jsp
<body> <% Person person = new Person(); person.setName("张三"); person.setPhones(new String[]{"1374231250","14345621520"}); List<String> list = new ArrayList(); list.add("西安"); list.add("南京"); list.add("北京"); person.setCities(list); Map<String,Object> map = new HashMap<>(); map.put("key","value"); map.put("key1","value1"); person.setMap(map); pageContext.setAttribute("p",person); %> ${pageScope.p}<br> ${pageScope.p.name}<br> ${pageScope.p.phones[0]}<br> ${pageScope.p.phones[1]}<br> ${pageScope.p.cities}<br> ${pageScope.p.map.key1}<br> </body>
- 运行tomcat,输入对应的url
四、EL表达式运算
1. 关系运算
关系运算符 转义运算符 说明 范例 结果 == eq 等于 ${5==5} true != ne 不等于 ${5!=5} false > gt 大于 ${2>10} false < lt 小于 ${3<5} true >= ge 大于等于 ${5>=12} false <= le 小于等于 ${5<=12} true 2. 逻辑运算
逻辑运算符 转义运算符 说明 范例 结果 && and 与运算 ${5==5 && 12>15} false | | or 或运算 ${5==5 | |12>15} true ! not 取反运算 $!true} false 3.算术运算
算术运算符 说明 范例 结果 + 加法 ${5+5} 10 - 减法 ${5-2} 3 * 乘法 ${2*5} 10 / 除法 ${10/5} 2 % 取模 ${111%10} 1 4.empty运算
- empty运算可以判断一个数据是否为空,如果为空,则输出true,否则输出false
5. 三元运算
- 表达式1?表达式2:表达式3
${12 !=12 ? value1: value2}
6. "."运算和【】中括号运算
- .运算,可以输出bean对象中的某个属性
- []中括号运算,还可以输出map集合中key里含有特殊字符的key的值
<% Map<String,Object> map1 = new HashMap<String, Object>(); map1.put("a.a.a", "aaaValue"); map1.put("b+b+b", "bbbValue"); map1.put("c-c-c", "cccValue"); request.setAttribute("map", map1); %> ${ requestScope.map['a.a.a'] } <br> ${ requestScope.map["b+b+b"] } <br> ${ requestScope.map['c-c-c'] } <br>
五、EL表达式的11个隐含对象
变量 类型 作用 pageContext PageContextImpl 获取jsp中的九大内置对象 pageScope Map<String,Object> 获取pageContext域中的数据 requestScope Map<String,Object> 获取Request域中的数据 sessionScope Map<String,Object> 获取Session域中的对象 applicationScope Map<String,Object> 获取ServletContext域中的数据 param Map<String,Object> 获取请求参数的值 paramValues Map<String,Object[]> 它也可以获取请求参数的值,获取多个值的时候使用 header Map<String,Object> 它可以获取请求头的信息 headerValues Map<String,Object[]> 它可以获取请求头的信息,它可以获取多个值的情况 cookie Map<String,Object> 获取当前请求的 Cookie 信息 initParam Map<String,Object> 获取当前请求的 Cookie 信息 - 获取四个域的属性
<% // 往四个域中都分别保存了数据 pageContext.setAttribute("key", "pageContext"); request.setAttribute("key", "request"); session.setAttribute("key", "session"); application.setAttribute("key", "application"); %> ${pageScope.key}<br> ${requestScope.key}<br> ${sessionScope.key}<br> ${applicationScope.key}
- 运行结果如下图
更多相关内容 -
JSP与EL表达式详解
2018-09-06 10:45:56JSP与EL详解 -
el表达式详解
2016-10-08 22:23:52el表达式描述 -
EL表达式详解教程
2016-05-13 13:51:01EL表达式详解教程 -
EL表达式详解教程.zip
2021-05-10 10:27:04EL 表达式和常用标签 -
EL表达式详解_javaweb_jsp
2021-01-27 19:47:261.EL表达式介绍 Expression Language表达式语言 是一种在JSP页面获取数据的简单方式(只能获取数据,不能设置数据) 在JSP2.0开始引入概念 语法格式 在JSP页面的任何静态部分均可通过:${expression}来获取到指定...1.EL表达式介绍
Expression Language表达式语言
是一种在JSP页面获取数据的简单方式(只能获取数据,不能设置数据)
在JSP2.0开始引入概念语法格式
在JSP页面的任何静态部分均可通过:${expression}
来获取到指定表达式的值2.EL获取数据(从四大域中获取属性)
EL只能从四大域中获取属性
2.1如果没有使用EL的内置对象,则查找数据顺序是依次按照由小到大范围从四大域中查找指定名称的属性值
- pageContext<request<session<application <%@ page language="java" contentType="text/html; charset=UTF-8" pageEncoding="UTF-8"%> <!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>Insert title here</title> </head> <body> <% pageContext.setAttribute("name", "linjie"); request.setAttribute("name", "lucy"); session.setAttribute("name", "king"); application.setAttribute("name", "bilibili"); %> name=${name } </body> </html>
2.2 使用EL内置对象,从指定域中获取数据,提高了查找效率
<%@ page language="java" contentType="text/html; charset=UTF-8" pageEncoding="UTF-8"%> <!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>Insert title here</title> </head> <body> <% pageContext.setAttribute("name", "linjie"); request.setAttribute("name", "lucy"); session.setAttribute("name", "king"); application.setAttribute("name", "bilibili"); %> name=${applicationScope.name } </body> </html>
2.3 EL中的内置对象
EL有11个内置对象,这里主要讲域属性相关的4个和其他4个
EL的11个内置对象,除了pageContext以外,其他10个内置对象的类型都是java.util.Map类型pageScope:从page范围域属性空间中查找指定的key
requestScope:从request范围域属性空间中查找指定的key
sessionScope:从session范围域属性空间中查找指定的key
applicationScope:从application范围域属性空间中查找指定的key<%@ page language="java" contentType="text/html; charset=UTF-8" pageEncoding="UTF-8"%> <!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>Insert title here</title> </head> <body> <% pageContext.setAttribute("name", "linjie"); request.setAttribute("name", "lucy"); session.setAttribute("name", "king"); application.setAttribute("name", "bilibili"); %> name=${applicationScope.name }<br> name=${pageScope.name }<br> name=${sessionScope.name }<br> name=${requestScope.name }<br> </body> </html>
3.EL访问Bean的属性
EL访问Bean属性
EL可以通过${key.属性}的方式获取到指定值,其底层实际调用的是该对象的相应属性的get方法Demo.java
package linjie.com; /* *Bean */ public class Demo { private String name; private int age; public Demo(String name,int age){ this.name=name; this.age=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; } @Override public String toString() { return super.toString(); } }
index.jsp
<%@ page language="java" contentType="text/html; charset=UTF-8" import="linjie.com.Demo" pageEncoding="UTF-8"%> <!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>Insert title here</title> </head> <body> <% Demo test=new Demo("linjie",12); request.setAttribute("ELttt", test); %> name=${requestScope.ELttt.name }<br> age=${requestScope.ELttt.age }<br> <!-- 若访问为null的对象的属性,EL是不会抛出空指针异常的,只是不显示而已 --> names=${requestScope.ELtttxx.name }<br> </body> </html>
4.EL访问数组中的数据
<%@ page language="java" contentType="text/html; charset=UTF-8" pageEncoding="UTF-8"%> <!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>Insert title here</title> </head> <body> <% String[] names={"xlj","lucy","king"}; pageContext.setAttribute("names", names); %> name[1]=${names[1] }<br> <!-- 若访问的数组元素下标超出了数组下标上限,EL不会抛出越界异常,只是不显示 --> names[5]=${names[5] }<br> </body> </html>
Stu.java
package linjie.com; /* *Bean */ public class Stu { private String sname; private String address; public Stu() { super(); } public Stu(String sname, String address) { super(); this.sname = sname; this.address = address; } public String getSname() { return sname; } public void setSname(String sname) { this.sname = sname; } public String getAddress() { return address; } public void setAddress(String address) { this.address = address; } @Override public String toString() { return super.toString(); } }
index.jsp
<%@ page language="java" contentType="text/html; charset=UTF-8" import="linjie.com.*" pageEncoding="UTF-8"%> <!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>Insert title here</title> </head> <body> <% Stu[] stus=new Stu[3]; stus[0]=new Stu("xlj","A"); stus[1]=new Stu("lucy","B"); stus[2]=new Stu("kingA","C"); pageContext.setAttribute("stus",stus); %> stus[1].Sname=${stus[1].sname } </body> </html>
5.EL获取list中数据
<%@page import="java.util.*"%> <%@ page language="java" contentType="text/html; charset=UTF-8" pageEncoding="UTF-8"%> <!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>Insert title here</title> </head> <body> <% List<String> names=new ArrayList<String>(); names.add("xlj"); names.add("lucy"); pageContext.setAttribute("names", names); %> <!-- 因为List底层是数组,所以可以这样写 --> names[1]=${names[1] }<br> </body> </html>
EL可以通过索引访问List,但无法访问Set。因为Set中没有索引概念6.EL访问Map
<%@page import="java.util.*"%> <%@ page language="java" contentType="text/html; charset=UTF-8" pageEncoding="UTF-8"%> <!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>Insert title here</title> </head> <body> <% Map<String,Object> map=new HashMap<String,Object>(); map.put("age", 20); map.put("name", "xlj"); pageContext.setAttribute("map", map); %> name=${map.name }<br> age=${map.age }<br> </body> </html>
7.EL中的运算符(empty)
算术运算符:+、-、*、/、%(不支持++、–)
关系运算符:==、!=、>、>=、<、<=
逻辑运算符:!、&&、||、not、and、or
条件运算符:?:
取值运算符:[]、点号<%@page import="java.util.*"%> <%@ page language="java" contentType="text/html; charset=UTF-8" pageEncoding="UTF-8"%> <!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>Insert title here</title> </head> <body> <% String name1=null; String name2=""; List<String> name3=new ArrayList<String>(); pageContext.setAttribute("name1", name1); pageContext.setAttribute("name2", name2); pageContext.setAttribute("name3", name3); %> empty对于没有定义的变量,运算结果为true: empty namex=${empty namex }<br> empty对于null的引用,运算结果为true: empty name1=${empty name1 }<br> empty对于为空串的String引用,运算结果为true: empty name2=${empty name2 }<br> empty对于没有元素的数组或集合,运算结果为true: empty name3=${empty name3 }<br> </body> </html>
-
jsp EL表达式详解
2021-02-27 19:33:14一、EL表达式介绍Expression Language表达式语言是一种在JSP页面获取数据的简单方式(只能获取数据,不能设置数据)在JSP2.0开始引入概念语法格式在JSP页面的任何静态部分均可通过:${expression}来获取到指定表达式的...一、EL表达式介绍
Expression Language表达式语言
是一种在JSP页面获取数据的简单方式(只能获取数据,不能设置数据)
在JSP2.0开始引入概念
语法格式
在JSP页面的任何静态部分均可通过:${expression}来获取到指定表达式的值
二、EL获取数据(从四大域中获取属性)
EL只能从四大域中获取属性
1、如果没有使用EL的内置对象,则查找数据顺序是依次按照由小到大范围从四大域中查找指定名称的属性值
二、EL获取数据(从四大域中获取属性)
EL只能从四大域中获取属性
1、如果没有使用EL的内置对象,则查找数据顺序是依次按照由小到大范围从四大域中查找指定名称的属性值
- pageContext
pageEncoding="UTF-8"%>
Insert title herepageContext.setAttribute("name", "linjie");
request.setAttribute("name", "lucy");
session.setAttribute("name", "king");
application.setAttribute("name", "bilibili");
%>
name=${name }
可以看出没有使用EL内置对象时查找顺序是由小到大,所以最先显示的是pageContext域中的
2、使用EL内置对象,从指定域中获取数据,提高了查找效率
pageEncoding="UTF-8"%>
Insert title herepageContext.setAttribute("name", "linjie");
request.setAttribute("name", "lucy");
session.setAttribute("name", "king");
application.setAttribute("name", "bilibili");
%>
name=${applicationScope.name }
可以看出,使用applicationScope即可指定application域中的name输出,当然其他域也是类似,下文会说这四大域属性相关的内置对象
三、EL中的内置对象
EL有11个内置对象,这里主要讲域属性相关的4个和其他4个
EL的11个内置对象,除了pageContext以外,其他10个内置对象的类型都是java.util.Map类型
1、域属性相关(4个)
pageScope:从page范围域属性空间中查找指定的key
requestScope:从request范围域属性空间中查找指定的key
sessionScope:从session范围域属性空间中查找指定的key
applicationScope:从application范围域属性空间中查找指定的key
pageEncoding="UTF-8"%>
Insert title herepageContext.setAttribute("name", "linjie");
request.setAttribute("name", "lucy");
session.setAttribute("name", "king");
application.setAttribute("name", "bilibili");
%>
name=${applicationScope.name }
name=${pageScope.name }
name=${sessionScope.name }
name=${requestScope.name }
2、其他重要内置对象(4个)
1、pageContext
该pageContext与JSP内置对象pageContext是同一个对象。通过该对象,可以获取到request、response、session、servletContext、servletConfig等对象注意:这些对象在EL里不是内置对象,这些对象只能通过pageContext获取
在EL中直接${pageContext.request}即可获取request对象,其底层调用的是pageContext.getRequest()方法。同理,也可以通过类似方法获取其他对象
重点:其中最常用的:${pageContext.request.contextPath },代表web应用下的根,可以看出下面action中的路径可读性更强了
Regster.java
package linjie.com;
import java.io.IOException;
import javax.servlet.ServletException;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
public class Regster extends HttpServlet {
protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
response.getWriter().append("Served at: ").append(request.getContextPath());
}
protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
doGet(request, response);
}
}
index.jsp
pageEncoding="UTF-8"%>
Insert title herexxx
yyy
2、param(获取请求中的指定参数)
其底层实际调用request.getParameter()
index.jsp
pageEncoding="UTF-8"%>
Insert title herexxx
yyy
show.jsp
pageEncoding="UTF-8"%>
Insert title herename=${param.name }
age=${param.age }
客户浏览器访问结果
3、paramValues
获取请求中的指定参数的所以值,其底层实际调用request.getParameterValues()
index.jsp
pageEncoding="UTF-8"%>
Insert title herexxx
yyy
爱好:
睡觉
玩
吃
show.jsp
pageEncoding="UTF-8"%>
Insert title herename=${param.name }
age=${param.age }
hobby[0]=${paramValues.hobby[0] }
hobby[1]=${paramValues.hobby[1] }
客户浏览器显示结果
4、initParam
获取初始化参数,其底层调用的是ServletContext.getInitParameter()
web.xml
07eltttt
index.jsp
name
林杰
Regster
Regster
linjie.com.Regster
Regster
/regster
index.jsp
pageEncoding="UTF-8"%>
Insert title herename=${initParam.name }
客户浏览器显示结果
四、EL访问Bean的属性
1、什么是java Bean
JavaBean是公共Java类,但是为了编辑工具识别
需要满足至少三个条件
有一个public默认构造器(例如无参构造器)
属性使用public 的get,set方法访问,也就是说设置成private同时get,set方法与属性名的大小也需要对应。例如属性name,get方法就要写成,public String getName(){},N大写。
需要序列化。这个是框架,工具跨平台反映状态必须的
2、EL访问Bean属性
EL可以通过${key.属性}的方式获取到指定值,其底层实际调用的是该对象的相应属性的get方法
Demo.java
package linjie.com;
/*
*Bean
*/
public class Demo {
private String name;
private int age;
public Demo(String name,int age){
this.name=name;
this.age=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;
}
@Override
public String toString() {
return super.toString();
}
}
index.jsp
import="linjie.com.Demo"
pageEncoding="UTF-8"%>
Insert title hereDemo test=new Demo("linjie",12);
request.setAttribute("ELttt", test);
%>
name=${requestScope.ELttt.name }
age=${requestScope.ELttt.age }
names=${requestScope.ELtttxx.name }
客户浏览器显示结果
五、EL访问数组中的数据
pageEncoding="UTF-8"%>
Insert title hereString[] names={"xlj","lucy","king"};
pageContext.setAttribute("names", names);
%>
name[1]=${names[1] }
names[5]=${names[5] }
下面是访问类的数组
Stu.java
package linjie.com;
/*
*Bean
*/
public class Stu {
private String sname;
private String address;
public Stu() {
super();
}
public Stu(String sname, String address) {
super();
this.sname = sname;
this.address = address;
}
public String getSname() {
return sname;
}
public void setSname(String sname) {
this.sname = sname;
}
public String getAddress() {
return address;
}
public void setAddress(String address) {
this.address = address;
}
@Override
public String toString() {
return super.toString();
}
}
index.jsp
import="linjie.com.*"
pageEncoding="UTF-8"%>
Insert title hereStu[] stus=new Stu[3];
stus[0]=new Stu("xlj","A");
stus[1]=new Stu("lucy","B");
stus[2]=new Stu("kingA","C");
pageContext.setAttribute("stus",stus);
%>
stus[1].Sname=${stus[1].sname }
客户浏览器显示结果
六、EL获取list中数据
pageEncoding="UTF-8"%>
Insert title hereList names=new ArrayList();
names.add("xlj");
names.add("lucy");
pageContext.setAttribute("names", names);
%>
names[1]=${names[1] }
客户浏览器显示结果
注意:
EL可以通过索引访问List,但无法访问Set。因为Set中没有索引概念
七、EL访问Map
pageEncoding="UTF-8"%>
Insert title hereMap map=new HashMap();
map.put("age", 20);
map.put("name", "xlj");
pageContext.setAttribute("map", map);
%>
name=${map.name }
age=${map.age }
客户浏览器显示结果
八、EL中的运算符(empty)
1、先说说几个常用运算符
算术运算符:+、-、*、/、%(不支持++、–)
关系运算符:==、!=、>、>=、
逻辑运算符:!、&&、||、not、and、or
条件运算符:?:
取值运算符:[]、点号
2、empty运算符
用法为${empty 变量},结果为布尔值
pageEncoding="UTF-8"%>
Insert title hereString name1=null;
String name2="";
List name3=new ArrayList();
pageContext.setAttribute("name1", name1);
pageContext.setAttribute("name2", name2);
pageContext.setAttribute("name3", name3);
%>
empty对于没有定义的变量,运算结果为true:
empty namex=${empty namex }
empty对于null的引用,运算结果为true:
empty name1=${empty name1 }
empty对于为空串的String引用,运算结果为true:
empty name2=${empty name2 }
empty对于没有元素的数组或集合,运算结果为true:
empty name3=${empty name3 }
客户浏览器显示结果
九、自定义EL函数
因为EL本身不具有处理字符串能力,所以可以自定义EL函数
- 定义函数(新建MyEL.java类)
- 注册:先找到jsp2-example-taglib.tld,将头部以及注册函数复制到自己创建的.tld文件中(.tld放在WEB-INF下)
- 在index.jsp中使用,使用时需要
1、定义函数MyEL.java
package linjie.com;
//自定义函数
//该类及其函数,需要在扩展名为.tld的xml文件中注册
//tld:tag library definition(标签库定义)
//xml文件是需要约束的,即需要配置文件头部。这个头部约束可以从一下文件中进行复制
//在Tomcat安装目录下:webapps\examples\WEB-INF\jsp2
//文件为:jsp2-example-taglib.tld
//这个.tld的xml文件,需要定义在当前web项目的WEB-INF目录下,在此目录下创建以.tld结尾的xml文件
//将jsp2-example-taglib.tld中头部复制到创建的xml文件中
//再将函数注册,还是在jsp2-example-taglib.tld底部中复制
public class MyEL {
private static MyEL instance;
public static MyEL getInstance() {
if(instance==null)
{
instance=new MyEL();
}
return instance;
}
//字符串小写变大写
public static String LowerToUpper(String str) {
return str.toUpperCase();
}
}
2、将jsp2-example-taglib.tld中头部部分以及底部的注册函数部分复制到自己创建的tld(在WEB-INF下)文件中
MyEL.tld
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">
A tag library exercising SimpleTag handlers.
1.0
MyEL
http://tomcat.apache.org/jsp2-example-taglib
MyLowerToUpper
linjie.com.MyEL
java.lang.String LowerToUpper( java.lang.String )
3、在index.jsp中使用,使用时需要
pageEncoding="UTF-8"%>
Insert title here${MyEL:MyLowerToUpper("sasas") }
String name="xlj";
pageContext.setAttribute("name", name);
%>
${MyEL:MyLowerToUpper(name) }
客户浏览器显示结果
十、EL总结
EL表达式不能出现在Java代码块、表达式块等JSP动态代码部分
EL只能从四大域属性空间中获取数据(pageContext、request、session、application)
EL不会抛出空指针异常,只会不显示
EL不会抛出数组越界异常,只会不显示
EL不具有对字符串进行处理的能力(可以使用JSTL的EL或者自定义EL函数)
到此这篇关于jsp EL表达式详解的文章就介绍到这了,更多相关jsp EL表达式内容请搜索以前的文章或继续浏览下面的相关文章希望大家以后多多支持!
-
EL表达式详解+实例教程
2012-10-08 09:11:35通过此文档,你可以熟练掌握EL表达式规范,到达熟练使用的目的。 -
EL表达式详解+实例教程[汇编].pdf
2021-10-11 02:17:39EL表达式详解+实例教程[汇编].pdf -
EL表达式详解教程.
2016-05-13 10:44:53 -
「el表达式」EL表达式详解 - seo实验室
2021-03-08 07:30:01el表达式该篇博客主要关于EL表达式,废话不多说=-=进入正题博客目录1、EL表达式介绍2、EL获取数据3、EL中的内置对象4、EL访问Bean的属性5、EL访问数组中的数据6、EL获取list中数据7、EL访问Map8、EL中的运算符(empty...el表达式
该篇博客主要关于EL表达式,废话不多说=-=进入正题
博客目录
1、EL表达式介绍
2、EL获取数据
3、EL中的内置对象
4、EL访问Bean的属性
5、EL访问数组中的数据
6、EL获取list中数据
7、EL访问Map
8、EL中的运算符(empty)
9、自定义EL函数
10、总结
一、EL表达式介绍
Expression Language表达式语言
是一种在JSP页面获取数据的简单方式(只能获取数据,不能设置数据)
在JSP2.0开始引入概念
语法格式
在JSP页面的任何静态部分均可通过:${expression}来获取到指定表达式的值
二、EL获取数据(从四大域中获取属性)
EL只能从四大域中获取属性
1、如果没有使用EL的内置对象,则查找数据顺序是依次按照由小到大范围从四大域中查找指定名称的属性值
- pagecontext
pageEncoding="UTF-8"%>
Insert title herepageContext.setAttribute("name", "linjie");
request.setattribute("name", "lucy");
session.setattribute("name", "king");
application.setAttribute("name", "bilibili");
%>
name=${name }
可以看出没有使用EL内置对象时查找顺序是由小到大,所以最先显示的是pageContext域中的
2、使用EL内置对象,从指定域中获取数据,提高了查找效率
pageEncoding="UTF-8"%>
Insert title herepageContext.setAttribute("name", "linjie");
request.setAttribute("name", "lucy");
session.setAttribute("name", "king");
application.setAttribute("name", "bilibili");
%>
name=${applicationScope.name }
可以看出,使用applicationScope即可指定application域中的name输出,当然其他域也是类似,下文会说这四大域属性相关的内置对象
三、EL中的内置对象
EL有11个内置对象,这里主要讲域属性相关的4个和其他4个
EL的11个内置对象,除了pageContext以外,其他10个内置对象的类型都是java.util.Map类型
1、域属性相关(4个)
pageScope:从page范围域属性空间中查找指定的key
requestScope:从request范围域属性空间中查找指定的key
sessionScope:从session范围域属性空间中查找指定的key
applicationScope:从application范围域属性空间中查找指定的key
pageEncoding="UTF-8"%>
Insert title herepageContext.setAttribute("name", "linjie");
request.setAttribute("name", "lucy");
session.setAttribute("name", "king");
application.setAttribute("name", "bilibili");
%>
name=${applicationScope.name }
name=${pageScope.name }
name=${sessionScope.name }
name=${requestScope.name }
2、其他重要内置对象(4个)
1、pageContext
该pageContext与JSP内置对象pageContext是同一个对象。通过该对象,可以获取到request、response、session、servletContext、servletConfig等对象注意:这些对象在EL里不是内置对象,这些对象只能通过pageContext获取
在EL中直接${pageContext.request}即可获取request对象,其底层调用的是pageContext.getRequest()方法。同理,也可以通过类似方法获取其他对象
重点:其中最常用的:${pageContext.request.contextpath },代表web应用下的根,可以看出下面action中的路径可读性更强了
Regster.java
package linjie.com;
import java.io.IOException;
import javax.servlet.ServletException;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
public class Regster extends HttpServlet {
protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
response.getWriter().append("Served at: ").append(request.getContextPath());
}
protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
doGet(request, response);
}
}
index.jsp
pageEncoding="UTF-8"%>
Insert title herexxx
yyy
2、param(获取请求中的指定参数)
index.jsp
pageEncoding="UTF-8"%>
Insert title herexxx
yyy
show.jsp
pageEncoding="UTF-8"%>
Insert title herename=${param.name }
age=${param.age }
客户浏览器访问结果
3、paramValues
获取请求中的指定参数的所以值,其底层实际调用request.getParameterValues()
index.jsp
pageEncoding="UTF-8"%>
Insert title herexxx
yyy
爱好:
睡觉
玩
吃
show.jsp
pageEncoding="UTF-8"%>
Insert title herename=${param.name }
age=${param.age }
hobby[0]=${paramValues.hobby[0] }
hobby[1]=${paramValues.hobby[1] }
客户浏览器显示结果
4、initParam
获取初始化参数,其底层调用的是ServletContext.getInitParameter()
web.xml
07eltttt
index.jsp
name
林杰
Regster
Regster
linjie.com.Regster
Regster
/regster
index.jsp
pageEncoding="UTF-8"%>
Insert title herename=${initParam.name }
客户浏览器显示结果
四、EL访问Bean的属性
1、什么是java Bean
JavaBean是公共Java类,但是为了编辑工具识别
需要满足至少三个条件
有一个public默认构造器(例如无参构造器)
属性使用public 的get,set方法访问,也就是说设置成private同时get,set方法与属性名的大小也需要对应。例如属性name,get方法就要写成,public String getName(){},N大写。
需要序列化。这个是框架,工具跨平台反映状态必须的
2、EL访问Bean属性
EL可以通过${key.属性}的方式获取到指定值,其底层实际调用的是该对象的相应属性的get方法
Demo.java
package linjie.com;
/*
*Bean
*/
public class Demo {
private String name;
private int age;
public Demo(String name,int age){
this.name=name;
this.age=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;
}
@Override
public String toString() {
return super.toString();
}
}
index.jsp
import="linjie.com.Demo"
pageEncoding="UTF-8"%>
Insert title hereDemo test=new Demo("linjie",12);
request.setAttribute("ELttt", test);
%>
name=${requestScope.ELttt.name }
age=${requestScope.ELttt.age }
names=${requestScope.ELtttxx.name }
客户浏览器显示结果
五、EL访问数组中的数据
pageEncoding="UTF-8"%>
Insert title hereString[] names={"xlj","lucy","king"};
pageContext.setAttribute("names", names);
%>
name[1]=${names[1] }
names[5]=${names[5] }
下面是访问类的数组
Stu.java
package linjie.com;
/*
*Bean
*/
public class Stu {
private String sname;
private String address;
public Stu() {
super();
}
public Stu(String sname, String address) {
super();
this.sname = sname;
this.address = address;
}
public String getSname() {
return sname;
}
public void setSname(String sname) {
this.sname = sname;
}
public String getAddress() {
return address;
}
public void setAddress(String address) {
this.address = address;
}
@Override
public String toString() {
return super.toString();
}
}
index.jsp
import="linjie.com.*"
pageEncoding="UTF-8"%>
Insert title hereStu[] stus=new Stu[3];
stus[0]=new Stu("xlj","A");
stus[1]=new Stu("lucy","B");
stus[2]=new Stu("kingA","C");
pageContext.setAttribute("stus",stus);
%>
stus[1].Sname=${stus[1].sname }
客户浏览器显示结果
六、EL获取list中数据
pageEncoding="UTF-8"%>
Insert title hereList names=new ArrayList();
names.add("xlj");
names.add("lucy");
pageContext.setAttribute("names", names);
%>
names[1]=${names[1] }
客户浏览器显示结果
注意:
EL可以通过索引访问List,但无法访问Set。因为Set中没有索引概念
七、EL访问Map
pageEncoding="UTF-8"%>
Insert title hereMap map=new HashMap();
map.put("age", 20);
map.put("name", "xlj");
pageContext.setAttribute("map", map);
%>
name=${map.name }
age=${map.age }
客户浏览器显示结果
八、EL中的运算符(empty)
1、先说说几个常用运算符
算术运算符:+、-、*、/、%(不支持++、–)
关系运算符:==、!=、>、>=、
逻辑运算符:!、&&、||、not、and、or
条件运算符:?:
取值运算符:[]、点号
2、empty运算符
用法为${empty 变量},结果为布尔值
pageEncoding="UTF-8"%>
Insert title hereString name1=null;
String name2="";
List name3=new ArrayList();
pageContext.setAttribute("name1", name1);
pageContext.setAttribute("name2", name2);
pageContext.setAttribute("name3", name3);
%>
empty对于没有定义的变量,运算结果为true:
empty namex=${empty namex }
empty对于null的引用,运算结果为true:
empty name1=${empty name1 }
empty对于为空串的String引用,运算结果为true:
empty name2=${empty name2 }
empty对于没有元素的数组或集合,运算结果为true:
empty name3=${empty name3 }
客户浏览器显示结果
九、自定义EL函数
因为EL本身不具有处理字符串能力,所以可以自定义EL函数
- 定义函数(新建MyEL.java类)
- 注册:先找到jsp2-example-taglib.tld,将头部以及注册函数复制到自己创建的.tld文件中(.tld放在WEB-INF下)
- 在index.jsp中使用,使用时需要
1、定义函数MyEL.java
package linjie.com;
//自定义函数
//该类及其函数,需要在扩展名为.tld的xml文件中注册
//tld:tag library definition(标签库定义)
//xml文件是需要约束的,即需要配置文件头部。这个头部约束可以从一下文件中进行复制
//在Tomcat安装目录下:webapps\examples\WEB-INF\jsp2
//文件为:jsp2-example-taglib.tld
//这个.tld的xml文件,需要定义在当前web项目的WEB-INF目录下,在此目录下创建以.tld结尾的xml文件
//将jsp2-example-taglib.tld中头部复制到创建的xml文件中
//再将函数注册,还是在jsp2-example-taglib.tld底部中复制
public class MyEL {
private static MyEL instance;
public static MyEL getInstance() {
if(instance==null)
{
instance=new MyEL();
}
return instance;
}
//字符串小写变大写
public static String LowerToUpper(String str) {
return str.toUpperCase();
}
}
2、将jsp2-example-taglib.tld中头部部分以及底部的注册函数部分复制到自己创建的tld(在WEB-INF下)文件中
MyEL.tld
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">
A tag library exercising SimpleTag handlers.
1.0
MyEL
http://tomcat.apache.org/jsp2-example-taglib
MyLowerToUpper
linjie.com.MyEL
java.lang.String LowerToUpper( java.lang.String )
3、在index.jsp中使用,使用时需要
pageEncoding="UTF-8"%>
Insert title here${MyEL:MyLowerToUpper("sasas") }
String name="xlj";
pageContext.setAttribute("name", name);
%>
${MyEL:MyLowerToUpper(name) }
客户浏览器显示结果
十、EL总结
EL表达式不能出现在Java代码块、表达式块等JSP动态代码部分
EL只能从四大域属性空间中获取数据(pageContext、request、session、application)
EL不会抛出空指针异常,只会不显示
EL不会抛出数组越界异常,只会不显示
EL不具有对字符串进行处理的能力(可以使用JSTL的EL或者自定义EL函数)
相关阅读
继续“我的6个网站推广的方法和手段”的第3、4个推广方法的详细讲解:软文推广和提交网址。为什么把第三条和第四条结合
最近在找viewpager开源框架的时候,发现了一款十分炫酷的框架——MaterialViewPager
少说废话,先贴实际效果图:
Syn_Flood概述
Syn-Flood攻击是当前网络上最为常见的DDoS攻击,也是最为经典的拒绝服务攻击,它利用了TCP协议实现上的一个缺陷,通过
简介栅栏类似于闭锁,它能阻塞一组线程直到某个事件的发生。栅栏与闭锁的关键区别在于,所有的线程必须同时到达栅栏位置,才能继续执行
我们在excel制作表格时候常常需要换行,有网友就问到有没有什么快速换行方法呢?有没有快捷键,其实是有的,那Excel表格换行快捷键是什
-
jstl两个核心包和jstl标签库EL表达式详解
2018-06-20 11:48:21包含使用jstl两个核心包:jstl-1.2.jar和standard-1.1.2.jar 和两个讲解文档:EL表达式详解 和JSTL标签库讲解 -
El表达式详解
2018-02-05 22:07:16EL表达式 一、EL表达式简介 EL 全名为Expression Language。EL主要作用: 1、获取数据 EL表达式主要用于替换JSP页面中的脚本表达式,以从各种类型的web域 中检索java对象、获取数据。(某个web域 中的... -
jsp和el表达式详解
2022-02-22 15:49:30el JSP(JavaServer Pages)是由Sun Microsystems公司主导创建的一种动态网页技术标准。JSP部署于网络服务器上,可以响应客户端发送的请求,并根据请求内容动态地生成HTML、XML或其他格式文档的Web网页,然后返回给... -
jsp的EL表达式详解
2021-07-17 22:46:24文章目录一、什么是EL表达式,有什么用二、用法2.1 最简单的使用2.2. EL表达式搜索域数据的顺序2.3. EL表达式输出复杂的Bean对象2.4. EL表达式的关系运算2.5. EL表达式的逻辑运算2.6. EL表达式的算术运算2.7. empty... -
EL表达式详解(常用表达式以及取值)
2021-04-28 21:55:20EL表达式学习总结1. El表达式概念1. El中的表达式算术表达式比较表达式逻辑表达式三元表达式判空表达式EL 从四个作用域中取值作用域类型作用域方法如何选择作用域总结 学习总结 1. El表达式概念 EL表达式简介 1)... -
EL表达式详解及应用实例
2021-02-28 17:02:59EL函数库(由JSTL提供的)* 导入标签库:String toUpperCase(String input):把参数转换成大写String toLowerCase(String input):把参数转换成小写int indexOf(String input, String substring):从大串,输出小串的...