1.EL表达式优先从小范围中读取数据。51
pageContext < request < session < application
1.1 EL表达式中有四个隐含的隐式的范围:51
- pageScope 对应的是 pageContext范围。
- requestScope 对应的是 request范围。
- sessionScope 对应的是 session范围。
- applicationScope 对应的是 application范围。
代码在 E:\java学习\javaWeb\course\course24\web
8.jsp
<%--关于EL表达式优先从小范围中读取数据 50-51--%>
<%@page contentType="text/html;charset=UTF-8"%>
<%
//四个域中都存储了数据,并且name相同
session.setAttribute("data", "session");
request.setAttribute("data", "request");
pageContext.setAttribute("data", "pageContext");
application.setAttribute("data", "application");
%>
<%--在没有指定范围的前提下,EL表达式优先从小范围中取数据--%>
<%--pageContext < request < session < application --%>
${data}
<hr>
<%-- 在EL表达式中可以指定范围来读取数据--%>
<%--EL表达式有4个隐含的隐式的范围对象--%>
<%--pageScope requestScope sessionScope applicationScope--%>
<%--以下是指定范围取数据。--%>
${pageScope.data}<br>
${requestScope.data}<br>
${sessionScope.data}<br>
${applicationScope.data}<br>
<%--在实际开发中,因为向某个域中存储数据的时候,name都是不同的。所以 xxxScope 都是可以省略的。--%>
EL表达式对null进行了预处理。如果是null,则向浏览器输出一个空字符串。
代码在 E:\java学习\javaWeb\course\course24\web
9.jsp
<%--EL表达式深度学习中 51--%>
<%@page contentType="text/html;charset=UTF-8" %>
<%
request.setAttribute("username", "zhangsan");
%>
<%--取出数据并且输出到浏览器--%>
<%=request.getAttribute("username")%>
采用EL表达式:${username}
<%--当我们写错了取出来是null--%>
<%=request.getAttribute("usernam")%>
<%--EL表达式主要任务是做页面展示,要求最终页面展示上是友好的。--%>
<%--当我们写错了,EL表达式对null进行了处理。如果是null,则在浏览器上显示空白。--%>
采用EL表达式:${usernam}
<hr>
<%--EL表达式表面上是这种写法,实际上运行的时候,还是要翻译生成java代码的。--%>
<%-- ${usernam} 这个EL表达式等同于这一段java代码:--%>
<%=request.getAttribute("usernam") == null ? "" : request.getAttribute("usernam")%>
2. EL表达式取数据的时候有两种形式: 51
- 第一种:. (大部分使用这种方式)
- 第二种:[ ] (如果存储到域的时候,这个name中含有特殊字符,可以使用 [ ])
- request.setAttribute("abc.def", "zhangsan");
- ${requestScope.abc.def} 这样是无法取值的。
- 应该这样:${requestScope["abc.def"]}
代码在 E:\java学习\javaWeb\course\course24\web
10.jsp
<%--EL表达式深度学习中 51--%>
<%@ page import="com.bjpowernode.javaweb.jsp.bean.User" %>
<%@page contentType="text/html;charset=UTF-8" %>
<%
//创建user对象
User user = new User();
user.setUsername("zhangsan");
//存储到request域当中
request.setAttribute("fadsa",user);
%>
<%--使用EL表达式取出,并且输出到浏览器--%>
${fadsa}<br>
<%--取数据写法一--%>
${fadsa.username}<br>
<%--取数据写法二--%>
<%--取user的username,注意[]当中的需要添加 双引号--%>
<%--[] 里面的没有加双引号的话,会将其看做变量。如果是带双引号
"username",则去找user对象的username属性。--%>
${fadsa["username"]}<br>
<hr>
<%
// 向request域当中存储数据。
request.setAttribute("abc.def", "hello jsp el!!!");
%>
<%--将数据取出并输出到浏览器--%>
<%--这样取是空白滴:--%>
${requestScope.abc.def}
<%--正确取法--%>
${requestScope["abc.def"]}
3. 掌握使用EL表达式,怎么从Map集合中取数据:51
${map.key}
代码在 E:\java学习\javaWeb\course\course24\web
11.jsp
<%--EL表达式深度学习之关于map集合取数据 51--%>
<%@ page import="java.util.HashMap" %>
<%@ page import="java.util.Map" %>
<%@ page import="com.bjpowernode.javaweb.jsp.bean.User" %><%--EL表达式深度学习中 51--%>
<%@page contentType="text/html;charset=UTF-8" %>
<%
//一个map集合
Map<String,String> map = new HashMap<>();
map.put("username","zhangsan");
map.put("password","123");
//将Map集合存储到request域当中
request.setAttribute("userMap",map);
%>
<%--使用EL表达式,将map中的数据取出,并输出到浏览器--%>
${userMap.username}
<br>
${userMap.password}
<br>
${userMap["username"]}
<br>
${userMap["password"]}
<hr>
<%
Map<String,User> userMap2 = new HashMap<>();
User user = new User();
user.setUsername("lisi");
userMap2.put("user",user);
request.setAttribute("abcd",userMap2);
%>
<%--使用EL表达式将Map集合中的user对象中的username取出--%>
${abcd.user.username}
3.1 掌握使用EL表达式,怎么从数组和List集合中取数据:51
- ${数组[0]}
- ${数组[1]}
- ${list[0]}
代码在 E:\java学习\javaWeb\course\course24\web
12.jsp
<%--EL表达式深度学习之关于数组和List集合取数据 51--%>
<%@ page import="com.bjpowernode.javaweb.jsp.bean.User" %>
<%@ page import="java.util.List" %>
<%@ page import="java.lang.reflect.Array" %>
<%@ page import="java.util.ArrayList" %>
<%@ page import="java.util.Set" %>
<%@ page import="java.util.HashSet" %>
<%@page contentType="text/html;charset=UTF-8" %>
<%
//数组
String[] username = {"zhangsan","lisi","wangwu"};
//向域中存储数组
request.setAttribute("nameArray",username);
%>
<%--使用EL表达式取出数组中的数据--%>
${nameArray}<br>
${nameArray[0]}<br>
${nameArray[1]}<br>
${nameArray[2]}<br>
<hr>
<%
User u1 = new User();
u1.setUsername("zhangsan");
User u2 = new User();
u2.setUsername("lisi");
//对象数组
User[] users = {u1, u2};
//存入request域中
request.setAttribute("userArray",users);
%>
<%--去除数组中第二个用户名的名字--%>
${userArray[1].username}
<hr>
<%
List<String> list = new ArrayList<>();
list.add("abc");
list.add("def");
request.setAttribute("myList",list);
%>
<%--取出List集合--%>
<%--list集合也是通过下标的方式取数据的。--%>
${myList}<br>
${myList[0]}<br>
${myList[1]}
<hr>
<%
Set<String> set = new HashSet<>();
set.add("a");
set.add("b");
request.setAttribute("set", set);
%>
<%--取出set集合--%>
set集合:${set}
<%--以下无法获取单个数据:PropertyNotFoundException: 类型[java.util.HashSet]上找不到属性[0]--%>
<%--${set[0]}--%>
3.2 page指令当中,有一个属性,可以忽略EL表达式 51
<%@page contentType="text/html;charset=UTF-8" isELIgnored="true" %>
isELIgnored="true" 表示忽略EL表达式
isELIgnored="false" 表示不忽略EL表达式。(这是默认值)
isELIgnored="true" 这个是全局的控制。
可以使用反斜杠进行局部控制:\${username} 这样也可以忽略EL表达式。
代码在 E:\java学习\javaWeb\course\course24\web
13.jsp
<%--EL表达式深度学习之关于忽略指令 51--%>
<%--<%@page contentType="text/html;charset=UTF-8" isELIgnored="false" %>--%>
<%@page contentType="text/html;charset=UTF-8" %>
<%--<%@page contentType="text/html;charset=UTF-8" isELIgnored="true" %>--%>
<%
request.setAttribute("username", "zhangsan");
%>
<%-- isELIgnored="true" 表示忽略JSP中整个页面的所有EL表达式。如果想忽略其中某个,可以使用以下反斜杠。 --%>
\${username}
${username}
${username}
3.3 通过EL表达式获取应用的根:51
${pageContext.request.contextPath}
代码在 E:\java学习\javaWeb\course\course24\web
14.jsp
<%--EL表达式深度学习之关于获取应用的根 51--%>
<%@page contentType="text/html;charset=UTF-8" %>
<%
// JSP有九大内置对象
// pageContext,request,session,application,response,out,config,page,exception
// 其中四个域对象,其中最小的域是pageContext
// pageContext翻译为:页面上下文。通过pageContext可以获取什么????
%>
<%--从以下代码来看,pageContext.getRequest() 方法是没用的。这--%>
<%--是获取request对象。而JSP中自带了内置对象request,直接用request内置对象就行了--%>
<%--简单讲这个pageContext.getRequest()在jsp中没用但是在EL中有大用--%>
<%=pageContext.getRequest()%>
<%=request%>
<%--
在EL表达式当中没有request这个隐式对象。
requestScope 这个只代表“请求范围”。不等同于request对象。
在EL表达式当中有一个隐式的对象:pageContext
EL表达式中的pageContext和JSP中的九大内置对象pageContext是同一个对象。
--%>
<%--<%=pageContext.getRequest()%>这段代码对应的EL表达式${pageContext.request}--%>
${pageContext.request}
<%--获取应用的根--%>
<%=request.getContextPath()%>
<%--写成EL表达式就是--%>
使用EL表达式来获取应用的根路径:
${pageContext.request.contextPath}
4. EL表达式中其他的隐式对象:52
- pageContext
- param
- paramValues
- initParam
代码在 E:\java学习\javaWeb\course\course24\web
15.jsp
<%--EL表达式深度学习之其他隐式对象 52--%>
<%@page contentType="text/html;charset=UTF-8" %>
<%--JSP中EL表达式的隐含对象:
1. pageContext
2. param
3. paramValues
4. initParam
5. 其他(不是重点)
--%>
应用的根路径:${pageContext.request.contextPath}
<%--request是JSP九大内置对象之一。--%>
<%--request.getParameter("username") 获取请求的参数。--%>
<%--在浏览器的url中输入http://localhost:8080/jsp/15.jsp?username=zhangsan--%>
<%--可以获得用户在浏览器中提交的数据--%>
用户名:<%=request.getParameter("username")%>
<%--使用EL表达式获得用户在浏览器中提交的数据---%>
用户名:${param.username}
<%--假设用户提交的数据
:http://localhost:8080/jsp/15.jsp?aihao=smoke&aihao=drink&aihao=tangtou--%>
<%--以上提交的数据显然是采用checkbox(复选框)进行提交的。同一组的checkbox的name是一样的。--%>
<%--param 获取的是请求参数一维数组当中的第一个元素。--%>
<%--以下两行代码获取的都是第一个元素 smoke 因为当提交多个数据是输入一个name只会获得第一个value--%>
爱好:${param.aihao}
爱好:<%=request.getParameter("aihao")%>
<%--要想都拿到--%>
一维数组:${paramValues.aihao}
一维数组:<%=request.getParameterValues("aihao")%>
<%--获取数组当中的元素:[下标]--%>
爱好:${paramValues.aihao[0]}、${paramValues.aihao[1]}、${paramValues.aihao[2]}
<%--EL表达式中的隐含对象:initParam--%>
<%--ServletContext是Servlet上下文对象,对应JSP九大内置对象中的application
ServletContext和application其实是一回事,只不过一个应用在java中一个应用在jsp中--%>
<%
String a = application.getInitParameter("pageSize");
String b = application.getInitParameter("pageNum");
%>
<%--输出--%>
每页显示的记录条数:<%=a%>
页码:<%=b%>
每页显示的记录条数:<%=application.getInitParameter("pageSize")%>
页码:<%=application.getInitParameter("pageNum")%>
<%--使用EL表达式--%>
每页显示的记录条数:${initParam.pageSize}
页码:${initParam.pageNum}
E:\java学习\javaWeb\course\course24\web\WEB-INF
web.xml
<?xml version="1.0" encoding="UTF-8"?>
<web-app xmlns="http://xmlns.jcp.org/xml/ns/javaee"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://xmlns.jcp.org/xml/ns/javaee http://xmlns.jcp.org/xml/ns/javaee/web-app_4_0.xsd"
version="4.0">
<!-- Servlet上下文初始化参数 52-->
<context-param>
<param-name>pageSize</param-name>
<param-value>20</param-value>
</context-param>
<context-param>
<param-name>pageNum</param-name>
<param-value>5</param-value>
</context-param>
</web-app>
6. EL表达式的运算符 52
算术运算符
+、-、*、/、%
关系运算符
[ ] == eq != > >= < <=
逻辑运算符
[ ] ! && || not and or
条件运算符
[ ] ? :
取值运算符
[ ]和.
empty运算符
[ ] empty运算符的结果是boolean类型
[ ] ${empty param.username}
[ ] ${not empty param.username}
[ ] ${!empty param.password}
代码在 E:\java学习\javaWeb\course\course24\web
16.jsp
<%--EL表达式深度学习之运算符 52--%>
<%@ page import="com.bjpowernode.javaweb.jsp.bean.Student" %>
<%@page contentType="text/html;charset=UTF-8" %>
<%--
关于EL表达式中的运算符
1. 算术运算符
+ - * / %
2. 关系运算符
== != > >= < <= eq
3. 逻辑运算符
! && || not and or (注意:!和not都是取反)
4. 条件运算符
? :
5. 取值运算符:
[] 和 .
6. empty 运算符
--%>
${10+20}<br> <%--30--%>
<%-- 在EL表达式当中“+”运算符只能做求和运算。不会进行字符串拼接操作。 --%>
<%--"20"会被自动转换成数字20--%>
${10+"20"}<br> <%--30--%>
<%-- java.lang.NumberFormatException: For input string: "abc" --%>
<%-- + 两边不是数字的时候,一定会转成数字。转不成数字就报错:NumberFormatException--%>
<%--${10+"abc"}<br>--%> <%--报错--%>
<%-- 关系运算符 --%>
${"abc" == "abc"} <br> <%--true--%>
${"abc"} == ${"abc"} <br> <%--abc == abc --%>
<%
Object obj = new Object();
request.setAttribute("k1", obj);
request.setAttribute("k2", obj);
%>
${k1 == k2} <br> <%--true 因为是同一个对象--%>
<%
String s1 = new String("hehe");
String s2 = new String("hehe");
request.setAttribute("a", s1);
request.setAttribute("b", s2);
%>
${a == b} <%--true 就值判断值--%> <br>
<%
Object o1 = new Object();
Object o2 = new Object();
request.setAttribute("o1", o1);
request.setAttribute("o2", o2);
%>
${o1 == o2} <br> <%--false 不同对象--%>
<%
Student stu1 = new Student("110", "警察");
Student stu2 = new Student("110", "警察");
request.setAttribute("stu1", stu1);
request.setAttribute("stu2", stu2);
%>
<%--EL表达式当中的 "==" 调用了equals方法。--%>
${stu1 == stu2} <br> <%--true 因为调用了对象的equals方法--%>
${stu1 eq stu2} <br> <%--true 因为调用了对象的equals方法--%>
<hr>
<%-- != 也会调用对象的equals方法。--%>
${stu1 != stu2} <br> <%--false--%>
${200 != 200} <br> <%--false--%>
<%--以下语法错误,没有加小括号--%>
\${!stu1 eq stu2} <br>
<%--正确的写法--%>
${!(stu1 eq stu2)}<br> <%--false--%>
${not(stu1 eq stu2)}<br> <%--false--%>
<hr>
<%--empty运算符:运算结果是boolean类型。--%>
<%--判断是否为空,如果为空,结果是true。如果不为空,结果是false--%>
${empty param.username} <br> <%--param可以获得用户在浏览器中提交的数据--%>
${!empty param.username} <br>
${not empty param.username} <br>
<hr>
<%--结果false--%>
<%--empty param.username前半部分是boolean类型。后面是null 类型不一致--%>
${empty param.username==null} <br> <%--false--%>
${(empty param.password) == null} <br> <%--false--%>
<%--这个没有empty 运算符,param.username只是获取提交的数据有就是有,没有就是null--%>
${param.username==null} <br> <%--true--%>
<%--条件运算符--%>
${empty param.username ? "对不起,用户名不能为空!" : "欢迎访问!!!!" }
com.bjpowernode.javaweb.jsp.bean
Student
package com.bjpowernode.javaweb.jsp.bean;
import java.util.Objects;
public class Student {
private String id;
private String name;
@Override
public boolean equals(Object o) {
System.out.println("equals方法执行了");
if (this == o) return true;
if (o == null || getClass() != o.getClass()) return false;
Student student = (Student) o;
return Objects.equals(id, student.id) && Objects.equals(name, student.name);
}
@Override
public int hashCode() {
return Objects.hash(id, name);
}
public Student() {
}
public Student(String id, String name) {
this.id = id;
this.name = name;
}
public String getId() {
return id;
}
public void setId(String id) {
this.id = id;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
}
标签:username,EL,name,request,param,表达式
From: https://blog.51cto.com/u_15784725/6407817