java el表达式原理_「el表达式」EL表达式详解 - seo实验室

本文深入探讨了Java Expression Language (EL)表达式,包括EL的介绍、如何从四大域获取数据、内置对象的使用、访问Bean属性、处理数组、列表和Map,以及运算符和自定义函数。EL提供了一种简洁的方式来获取数据,但不能用于设置数据。此外,文章还强调了EL的错误处理特性,如不会抛出空指针或数组越界异常。
摘要由CSDN通过智能技术生成

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 here

pageContext.setAttribute("name", "linjie");

request.setattribute("name", "lucy");

session.setattribute("name", "king");

application.setAttribute("name", "bilibili");

%>

name=${name }

85b1aedb94b5beb3369c095a9426743f.png

可以看出没有使用EL内置对象时查找顺序是由小到大,所以最先显示的是pageContext域中的

2、使用EL内置对象,从指定域中获取数据,提高了查找效率

pageEncoding="UTF-8"%>

Insert title here

pageContext.setAttribute("name", "linjie");

request.setAttribute("name", "lucy");

session.setAttribute("name", "king");

application.setAttribute("name", "bilibili");

%>

name=${applicationScope.name }

d286f7cd79420205abeecd2e89baa1dc.png

可以看出,使用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 here

pageContext.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 }

69468c4e5ab95e0d90337977c9831c01.png

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 here

xxx

yyy

6097219ab0de295630ff4f38fce91cbd.png

2、param(获取请求中的指定参数)

index.jsp

pageEncoding="UTF-8"%>

Insert title here

xxx

yyy

show.jsp

pageEncoding="UTF-8"%>

Insert title here

name=${param.name }

age=${param.age }

客户浏览器访问结果

0298c606d776782487789675f6d83b46.png

8d2c794d0dea9c23bff6b7f317ee1798.png

3、paramValues

获取请求中的指定参数的所以值,其底层实际调用request.getParameterValues()

index.jsp

pageEncoding="UTF-8"%>

Insert title here

xxx

yyy

爱好:

睡觉

show.jsp

pageEncoding="UTF-8"%>

Insert title here

name=${param.name }

age=${param.age }

hobby[0]=${paramValues.hobby[0] }

hobby[1]=${paramValues.hobby[1] }

客户浏览器显示结果

7e46362c105b1da800b9c1ba8853828b.png

6c5e389c1148fe74a446648a8e2eac76.png

4、initParam

获取初始化参数,其底层调用的是ServletContext.getInitParameter()

web.xml

07eltttt

index.jsp

name

林杰

Regster

Regster

linjie.com.Regster

Regster

/regster

index.jsp

pageEncoding="UTF-8"%>

Insert title here

name=${initParam.name }

客户浏览器显示结果

e5c11f367e7aa0852c90b310a5c51937.png

四、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 here

Demo test=new Demo("linjie",12);

request.setAttribute("ELttt", test);

%>

name=${requestScope.ELttt.name }

age=${requestScope.ELttt.age }

names=${requestScope.ELtttxx.name }

客户浏览器显示结果

cb0d115c2fdf2b8655a69f18daf1cfcf.png

五、EL访问数组中的数据

pageEncoding="UTF-8"%>

Insert title here

String[] 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 here

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 }

客户浏览器显示结果

b0068065cc38134da86ad68aaf786f5c.png

六、EL获取list中数据

pageEncoding="UTF-8"%>

Insert title here

List names=new ArrayList();

names.add("xlj");

names.add("lucy");

pageContext.setAttribute("names", names);

%>

names[1]=${names[1] }

客户浏览器显示结果

12ed1f7bbed298157410145606edc27e.png

注意:

EL可以通过索引访问List,但无法访问Set。因为Set中没有索引概念

七、EL访问Map

pageEncoding="UTF-8"%>

Insert title here

Map map=new HashMap();

map.put("age", 20);

map.put("name", "xlj");

pageContext.setAttribute("map", map);

%>

name=${map.name }

age=${map.age }

客户浏览器显示结果

b6a4a200670aec1b737325c247a3919d.png

八、EL中的运算符(empty)

1、先说说几个常用运算符

算术运算符:+、-、*、/、%(不支持++、–)

关系运算符:==、!=、>、>=、

逻辑运算符:!、&&、||、not、and、or

条件运算符:?:

取值运算符:[]、点号

2、empty运算符

用法为${empty 变量},结果为布尔值

pageEncoding="UTF-8"%>

Insert title here

String 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 }

客户浏览器显示结果

0c67a3c02c89b16ac5f937fc427ac21c.png

九、自定义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下)文件中

ae1174760fc2e1731df913ac6e7e4cec.png

783d11dde4271def63e134bfa9205679.png

a889ba36bfac395aa0b960fe7475159c.png

251c4bc262c8dc42a696f300891e3e89.png

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) }

客户浏览器显示结果

ba12624abc295c99488c24be28c95d43.png

十、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表格换行快捷键是什

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值