今天我们来说EL表达式
这在整个jsp中都是非常重要的一章
因为 如果我们用 <%=属性%>
属性为空时 直接就是个 null 这个肯定是不能让用户看到的东西
所以 我们就需要EL表达式
例如 我们jsp代码编写如下
<%@ page contentType="text/html; charset=UTF-8" pageEncoding="UTF-8" %>
<%request.setCharacterEncoding("UTF-8");%>
DOCTYPE html>
<html>
<head>
<title>JSP - Hello Worldtitle>
head>
<body>
<%=request.getAttribute("userName")%>、
body>
html>
这里 因为我们并没有设置过userName 所以肯定是没有值的 那么 他的默认值就是 null
页面效果如下
实际开发中 也会存在很多变量没值的情况,那你不可能让用户看这个null啊 用户又不知道是什么情况
这边 我们可以将写法改成
<%@ page contentType="text/html; charset=UTF-8" pageEncoding="UTF-8" %>
<%request.setCharacterEncoding("UTF-8");%>
DOCTYPE html>
<html>
<head>
<title>JSP - Hello Worldtitle>
head>
<body>
${userName}
body>
html>
${内容} 这就是一个标准的EL表达式
而且方便在 我们只需要写个名字 他就会自己去作用域找 不需要我们再什么什么get的了
然后 EL表达式的默认值是空字符串 而不是null
我们运行界面 看到效果
刚才的null就没了
为了证明没问题 我们这里定义一下
<%@ page contentType="text/html; charset=UTF-8" pageEncoding="UTF-8" %>
<%request.setCharacterEncoding("UTF-8");%>
DOCTYPE html>
<html>
<head>
<title>JSP - Hello Worldtitle>
head>
<body>
<%
request.setAttribute("userName","你好");
%>
${userName}
body>
html>
我们在java代码中定义了request作用域中的 userName 的值为你好 然后下面用EL表达式输出
运行结果如下
非常的完美
然后 这边需要注意 EL会自己去域对象中 拿取对应名字的变量 但是 他一般操作的都是域对象中的东西 他是操作不了局部变量的
还可以操作字面量 但比较少用 主要还是域对象
域对象 我们之前 JSP 四大域对象
中也讲过了
那么 这里就有个问题了 如果四个域对象设置同一个变量 它用谁的?
我们代码写成这样
<%@ page contentType="text/html; charset=UTF-8" pageEncoding="UTF-8" %>
<%request.setCharacterEncoding("UTF-8");%>
DOCTYPE html>
<html>
<head>
<title>JSP - Hello Worldtitle>
head>
<body>
<%
//设置page作用域
pageContext.setAttribute("name","zhangsan");
//设置request作用域
request.setAttribute("name","lisi");
//设置session作用域
session.setAttribute("name","wangwu");
//设置application作用域
application.setAttribute("name","zhoaliu");
%>
${name}
body>
html>
我们运行之后看界面
他采用了 page作用域的
那么 我们这里 可以总结为 EL 是从小到大去找 顺序就是 page request session application
取到了 他就不会去找其他作用域了
然后还有一个点就是 EL 不操作局部变量 我们可以这样写
<%@ page contentType="text/html; charset=UTF-8" pageEncoding="UTF-8" %>
<%request.setCharacterEncoding("UTF-8");%>
DOCTYPE html>
<html>
<head>
<title>JSP - Hello Worldtitle>
head>
<body>
<%
String name = "你好";
%>
${name}
body>
html>
运行之后 也会发现 EL是没能输出我们在局部定义的这个name的
但是 很多人就会想 那EL 是不是表示我们就不能在不同作用域设置同名变量了呢?
当然不是 EL是方便jsp开发的 他不会限制你
我们可以将代码改成这样
<%@ page contentType="text/html; charset=UTF-8" pageEncoding="UTF-8" %>
<%request.setCharacterEncoding("UTF-8");%>
DOCTYPE html>
<html>
<head>
<title>JSP - Hello Worldtitle>
head>
<body>
<%
//设置page作用域
pageContext.setAttribute("name","zhangsan");
//设置request作用域
request.setAttribute("name","lisi");
//设置session作用域
session.setAttribute("name","wangwu");
//设置application作用域
application.setAttribute("name","zhoaliu");
%>
<p>${pageScope.name}p>
<p>${requestScope.name}p>
<p>${sessionScope.name}p>
<p>${applicationScope.name}p>
body>
html>
作用域后跟Scope
告诉它去哪个作用域取
运行结果如下
但这里还是建议大家不要取同样的名字 毕竟 搞不好自己都弄混了 别人看也不好维护