1.EL表达式
a)什么是EL表达式,EL表达式的作用
| EL表达式的全称是:Expression Language 是表达式语言。 |
| |
| EL表达式的什么作用:EL表达式主要是代替jsp页面中的表达式脚本在jsp页面中进行数据的输出。 |
| |
| 因为EL表达式在输出数据的时候,要比jsp的表达式脚本要简洁很多。 |
| |
| <body> |
| <% |
| request.setAttribute("key","值"); |
| %> |
| 表达式脚本输出key的值是: |
| <%=request.getAttribute("key1")==null?"":request.getAttribute("key1")%><br/> |
| EL表达式输出key的值是:${key1} |
| </body> |
| EL表达式的格式是:${表达式} |
| |
| EL表达式在输出null值的时候,输出的是空串。jsp表达式脚本输出null值的时候,输出的是null字符串。 |
| |
| El表达式在js代码中使用时,要在字符串中才可以,如: |
| <script> |
| var name="${requestScope.get("user").name}" |
| </script> |
b)EL表达式搜索域数据的顺序
| EL表达式主要是在jsp页面中输出数据。 |
| 主要是输出域对象中的数据。 |
| 当四个域中都有相同的key的数据的时候,EL表达式会按照四个域的从小到大的顺序去进行搜索,找到就输出。 |
| <body> |
| <% |
| |
| request.setAttribute("key","request"); |
| session.setAttribute("key","session"); |
| application.setAttribute("key","application"); |
| pageContext.setAttribute("key","pageContext"); |
| %> |
| ${key} |
| </body> |
c)EL表达式输出Bean的普通属性,数组属性。List集合属性,map集合属性
需求——输出Person类中普通属性,数组属性。list集合属性和map集合属性。
Person类
| public class Person{ |
| |
| private Stringname; |
| private String[]phones; |
| private List<String>cities; |
| private Map<String,Object>map; |
| public int getAge(){ |
| return18; |
| } |
EL表达式获取属性的值,通过属性的get方法获取的,并不是直接通过属性获取。
输出的代码:
| <body> |
| <% |
| Person person = new Person(); |
| person.setName("国哥好帅!"); |
| person.setPhones(new String[]{"18610541354","18688886666","18699998888"}); |
| List<String> cities =new ArrayList<String>(); |
| cities.add("北京"); |
| cities.add("上海"); |
| cities.add("深圳"); |
| person.setCities(cities); |
| Map<String,Object> map = new HashMap<>(); |
| map.put("key1","value1"); |
| map.put("key2","value2"); |
| map.put("key3","value3"); |
| person.setMap(map); |
| pageContext.setAttribute("p",person); |
| %> |
| 输出Person:${p}<br/> |
| 输出Person的name属性:${p.name}<br> |
| 输出Person的pnones数组属性值:${p.phones[2]}<br> |
| 输出Person的cities集合中的元素值:${p.cities}<br> |
| 输出Person的List集合中个别元素值:${p.cities[2]}<br> |
| 输出Person的Map集合:${p.map}<br> |
| 输出Person的Map集合中某个key的值:${p.map.key3}<br> |
| 输出Person的age属性:${p.age}<br> |
| </body> |
d)EL表达式——运算
| 语法:${ 运算表达式} ,EL表达式支持如下运算符: |
1)关系运算

2)逻辑运算

3)算数运算

empty运算
| empty运算可以判断一个数据是否为空,如果为空,则输出true,不为空输出false。 |
| 以下几种情况为空: |
| 1、值为null值的时候,为空 |
| 2、值为空串的时候,为空 |
| 3、值是Object类型数组,长度为零的时候 |
| 4、list集合,元素个数为零 |
| 5、map集合,元素个数为零 |
| <body> |
| <% |
| |
| request.setAttribute("emptyNull",null); |
| |
| request.setAttribute("emptyStr",""); |
| |
| request.setAttribute("emptyArr",new Object[]{}); |
| |
| List<String>list = new ArrayList<>(); |
| |
| request.setAttribute("emptyList",list); |
| |
| Map<String,Object> map= new HashMap<String,Object>(); |
| |
| request.setAttribute("emptyMap",map); |
| %> |
| ${empty emptyNull}<br/> |
| ${empty emptyStr}<br/> |
| ${empty emptyArr}<br/> |
| ${empty emptyList}<br/> |
| ${empty emptyMap}<br/> |
| </body> |
三元运算
| 表达式1?表达式2:表达式3 |
| 如果表达式1的值为真,返回表达式2的值,如果表达式1的值为假,返回表达式3的值。 |
“.”点运算和[ ] 中括号运算符
| .点运算,可以输出Bean对象中某个属性的值。 |
| []中括号运算,可以输出有序集合中某个元素的值。 |
| 并且[]中括号运算,还可以输出map集合中key里含有特殊字符的key的值。 |
| <body> |
| <% |
| Map<String,Object> map = new HashMap<String,Object>(); |
| map.put("a.a.a","aaaValue"); |
| map.put("b+b+b","bbbValue"); |
| map.put("c-c-c","cccValue"); |
| request.setAttribute("map",map); |
| %> |
| ${map['a.a.a']}<br> <!--特殊字符元素名,不能采用 . 的方式操作,读取时也要采用这种方式--> |
| ${map["b+b+b"]}<br> |
| ${map['c-c-c']}<br> |
| </body> |
e)EL表达式的11个隐含对象
| EL个达式中11个隐含对象,是EL表达式中自己定义的,可以直接使用。 |
| |
| 变量 类型 作用 |
| 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,String> 它可以获取请求参数的值 |
| paramValues Map<String,String[]> 它也可以获取请求参数的值,获取多个值的时候使用 |
| |
| header Map<String,String> 它可以获取请求头的信息 |
| headerValues Map<String,String[]> 它可以获取请求头的信息,它可以获取多个值的情况 |
| |
| cookie Map<String,Cookie> 它可以获取当前请求的Cookie信息 |
| |
| initParam Map<String,String> 它可以获取在web.xml中配置的<context-param>上下文参数 |
EL获取四个特定域中的属性
| pageScope ====== pageContext域 |
| requestScope ====== Request域 |
| sessionScope ====== Session域 |
| applicationScope ====== ServletContext域 |
| <body> |
| <% |
| pageContext.setAttribute("key1","pageContext1"); |
| pageContext.setAttribute("key2","pageContext2"); |
| request.setAttribute("key2","request"); |
| session.setAttribute("key2","session"); |
| application.setAttribute("key2","application"); |
| %> |
| |
| <%--如果不指定从哪个域中取值,则直接写属性名是从最小的域中取值,若指定从哪个域中取值,而各个域中key名相同,则需要指定域对象去调用属性获取值--%> |
| ${pageScope.key1} |
| ${applicationScope.key2} |
| </body> |
pageContext对象的使用
| 1. 协议: |
| 2. 服务器ip: |
| 3. 服务器端口: |
| 4. 获取工程路径: |
| 5. 获取请求方法: |
| 6. 获取客户端ip地址: |
| 7. 获取会话的id编号: |
| <body> |
| <%--request.getScheme()它可以获取请求的协议 |
| request.getServerName()获取请求的服务器ip或域名 |
| request.getServerPort()获取请求的服务器端口号 |
| getContextPath()获取当前工程路径 |
| request.getMethod()获取请求的方式(GET或POST) |
| request.getRemoteHost() 获取客户端的ip地址 |
| session.getId()获取会话的唯一标识 |
| --%> |
| <% |
| pageContext.setAttribute("req",request); |
| %> |
| <%=request.getScheme()%><br> |
| 1.协议:${req.scheme}<br> |
| 2.服务器ip:${pageContext.request.serverName}<br> |
| 3.服务器端口:${pageContext.request.serverPort}<br> |
| 4.获取工程路径:${pageContext.request.contextPath}<br> |
| 5.获取请求方法:${pageContext.request.method}<br> |
| 6.获取客户端ip地址:${pageContext.request.remoteHost}<br> |
| 7.获取会话的id编号:${pageContext.session.id}<br> |
| </body> |
EL表达式其他隐含对象的使用
| param Map<String,String> 它可以获取请求参数的值 |
| paramValues Map<String,String[]> 它也可以获取请求参数的值,获取多个值的时候使用。 |
示例代码:
| 输出请求参数username的值:${param.username}<br> |
| 输出请求参数password的值:${param.password}<br> |
| 输出请求参数username的值:${paramValues.username[0]}<br> |
| 输出请求参数hobby的值:${paramValues.hobby[0]}<br> |
| 输出请求参数hobby的值:${paramValues.hobby[1]}<br> |
请求地址:
| http://localhost:8080/09_EL_JSTL/other_el_obj.jsp?username=wzg168&password=666666&hobby=java&hobby=cpp |
| header Map<String,String> 它可以获取请求头的信息 |
| headerValues Map<String,String[]> 它可以获取请求头的信息,它可以获取多个值的情况 |
| cookie Map<String,Cookie> 它可以获取当前请求的Cookie信息 |
示例代码:
| 获取Cookie的名称:${cookie.JSESSIONID.name}<br> |
| 获取Cookie的值:${cookie.JSESSIONID.value}<br> |
| initParam Map<String,String> 它可以获取在web.xml中配置的<context-param>上下文参数 |
web.xml中的配置:
| <context-param> |
| <param-name>username</param-name> |
| <param-value>root</param-value> |
| </context-param> |
| <context-param> |
| <param-name>url</param-name> |
| <param-value>jdbc:mysql: |
| </context-param> |
示例代码:
| 输出<Context-param>username的值:${initParam.username}<br> |
| 输出<Context-param>url的值:${initParam.url}<br> |
2.JSTL标签库(次重点)
| JSTL标签库全称是指JSP Standard Tag Library : JSP标准标签库。是一个不断完善的开放源代码的JSP标签库。 |
| |
| EL表达式主要是为了替换jsp中的表达式脚本,而标签库则是为了替换代码脚本。这样使得整个jsp页面变得更佳简洁。 |
| |
JSTL由五个不同功能的标签库组成:

在jsp标签库中使用taglib指令引入标签库:
| CORE标签库 |
| <%@ taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core"%> |
| |
| XML标签库 |
| <%@ taglib prefix="x" uri="http://java.sun.com/jsp/jstl/xml"%> |
| |
| FMT标签库 |
| <%@ taglib prefix="fmt" uri="http://java.sun.com/jsp/jstl/fmt"%> |
| |
| SQL标签库 |
| <%@ taglib prefix="sql" uri="http://java.sun.com/jsp/jstl/sql"%> |
| |
| FUNCTIONS标签库 |
| <%@ taglib prefix="fn" uri="http://java.sun.com/jsp/jstl/functions"%> |
f)JSTL标签库的使用步骤
1、先导入jstl标签库的jar包
| taglibs-standard-impl-1.2.1.jar |
| taglibs-standard-spec-1.2.1.jar |
| |
2、第二步,使用taglib指令引入标签库。
| <%@ taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core"%> |
g)core核心库使用
1.< c:set / >
(使用很少)
作用:set标签可以往域中保存数据
| <%-- |
| 1.<c:set/> |
| 作用:set标签可以往域中保存数据 |
| |
| 域对象.setAttribute(key,value); |
| scope属性设置保存到哪个域 |
| page表示PageContext域(默认值) |
| request表示Request域 |
| session表示Session域 |
| application表示ServletContext域 |
| var属性设置key是多少 |
| value属性设置值 |
| --%> |
| |
| 保存之前:${sessionScope.abc}<br> |
| <c:set scope="session" var="abc" value="abcValue"/> |
| 保存之后:${sessionScope.abc}<br> |
2.< c:if / >
if 标签用来做 if 判断(不支持if...else)
| <%-- |
| 2.<c:if/> |
| if标签用来做if判断。 |
| test属性表示判断的条件(使用EL表达式输出) |
| --%> |
| <c:if test="${ 12==12 }"> |
| <h1>12等于12</h1> |
| </c:if> |
| |
| <c:if test="${ 12!=12 }"> |
| <h1>12不等于12</h1> |
| </c:if> |
3.< c:choose >< c:when >< c:otherwise >标签
作用:多路判断。跟 switch...case....default 非常接近
| <%-- |
| 3.<c:choose><c:when><c:otherwise>标签 |
| 作用:多路判断。跟switch...case....default非常接近 |
| choose标签开始选择判断 |
| when标签表示每一种判断情况 |
| test属性表示当前这种判断情况的值 |
| otherwise标签表示剩下的情况 |
| |
| <c:choose><c:when><c:otherwise>标签使用时需要注意的点: |
| 1、标签里不能使用html注释,要使用jsp注释 |
| 2、when标签的父标签一定要是choose标签(c:otherwise标签内不能直接使用when标签,可以choose) |
| --%> |
| |
| <% |
| request.setAttribute("height",180); |
| %> |
| <c:choose> |
| <%--这是html注释--%> |
| <c:when test="${requestScope.height>190}"> |
| <h2>小巨人</h2> |
| </c:when> |
| <c:when test="${requestScope.height>180}"> |
| <h2>很高</h2> |
| </c:when> |
| <c:when test="${requestScope.height>170}"> |
| <h2>还可以</h2> |
| </c:when> |
| <c:otherwise> |
| <c:choose> |
| <c:when test="${requestScope.height>160}"> |
| <h3>大于160</h3> |
| </c:when> |
| <c:when test="${requestScope.height>150}"> |
| <h3>大于150</h3> |
| </c:when> |
| <c:when test="${requestScope.height>140}"> |
| <h3>大于140</h3> |
| </c:when> |
| <c:otherwise> |
| 其他小于140 |
| </c:otherwise> |
| </c:choose> |
| </c:otherwise> |
| </c:choose> |
4.< c:forEach / >
作用:遍历输出使用。
1)遍历1到10,输出
示例代码:
| <%--1.遍历1到10,输出 |
| begin属性设置开始的索引 |
| end属性设置结束的索引 |
| var属性表示循环的变量(也是当前正在遍历到的数据) |
| for(int i=1;i<10;i++) |
| --%> |
| <table border="1"> |
| <c:forEach begin="1" end="10" var="i"> |
| <tr> |
| <td>第${i}行</td> |
| </tr> |
| </c:forEach> |
| </table> |
2)遍历Object数组
示例代码:
| <%--2.遍历Object数组 |
| for(Object item:arr) |
| items表示遍历的数据源(遍历的集合) |
| var表示当前遍历到的数据 |
| --%> |
| <% |
| request.setAttribute("arr",new String[]{"18610541354","18688886666","18699998888"}); |
| %> |
| <c:forEach items="${requestScope.arr}" var="item"> |
| ${item}<br> |
| </c:forEach> |
3)遍历Map集合
示例代码:
| <% |
| Map<String,Object> map = new HashMap<String,Object>(); |
| map.put("key1","value1"); |
| map.put("key2","value2"); |
| map.put("key3","value3"); |
| |
| |
| request.setAttribute("map",map); |
| %> |
| <c:forEach items="${requestScope.map}" var="entry"> |
| <h1>${entry.key}=${entry.value}</h1> |
| </c:forEach> |
4)遍历List集合---list中存放Student类,有属性:编号,用户名,密码,年龄,电话信息
Student类:
| public class Student{ |
| |
| private Integer id; |
| private String username; |
| private String password; |
| private Integer age; |
| private String phone; |
| } |
示例代码:
| <%--4.遍历List集合---list中存放Student类,有属性:编号,用户名,密码,年龄,电话信息--%> |
| <% |
| List<Student> studentList = new ArrayList<Student>(); |
| for(int i=1;i<=10;i++){ |
| studentList.add(new Student(i,"username"+i,"pass"+i,18+i,"phone"+i)); |
| } |
| request.setAttribute("stus",studentList); |
| %> |
| <table> |
| <tr> |
| <th>编号</th> |
| <th>用户名</th> |
| <th>密码</th> |
| <th>年龄</th> |
| <th>电话</th> |
| <th>操作</th> |
| </tr> |
| <%--items表示遍历的集合 |
| var表示遍历到的数据 |
| begin表示遍历的开始索引值 |
| end表示结束的索引值 |
| step属性表示遍历的步长值 (相当于for循环中的i++,为2 索引每次加2) |
| varStatus属性表示当前遍历到的数据的状态 |
| for(int i=1;i<10;i+=2) |
| --%> |
| <c:forEach begin="2" end="7" step="2" varStatus="status" items="${requestScope.stus}" var="stu"> |
| <tr> |
| <td>${stu.id}</td> |
| <td>${stu.username}</td> |
| <td>${stu.password}</td> |
| <td>${stu.age}</td> |
| <td>${stu.phone}</td> |
| <td>${status.step}</td> |
| </tr> |
| </c:forEach> |
| </table> |
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步