EL表达式和JSTL
EL表达式概述
基本概念
EL表达式,全称是Expression Language。意为表达式语言。它是Servlet规范中的一部分,是JSP2.0规范加入的内容。其作用是用于在JSP页面中获取数据,从而让我们的JSP脱离java代码块和JSP表达式。
基本语法
EL表达式的语法格式非常简单,写为 ${表达式内容}
例如:在浏览器中输出请求域中名称为message的内容。
假定,我们在请求域中存入了一个名称为message的数据(request.setAttribute("message","EL");
),此时在jsp中获取的方式,如下表显示:
Java代码块 | JSP表达式 | EL表达式 |
---|---|---|
<%=request.getAttribute("message")%> |
${message} |
通过上面我们可以看出,都可以从请求域中获取数据,但是EL表达式写起来是最简单的方式。这也是以后我们在实际开发中,当使用JSP作为视图时,绝大多数都会采用的方式。
EL表达式的入门案例
第一步:创建JavaWeb工程
<%@ page contentType="text/html;charset=UTF-8" language="java" %> <html> <head> <title>EL表达式入门案例</title> </head> <body> <%--使用java代码在请求域中存入一个名称为message的数据--%> <% request.setAttribute("message","Expression Language");%> Java代码块获取:<% out.print(request.getAttribute("message"));%> <br/> JSP表达式获取:<%=request.getAttribute("message")%> <br/> EL表达式获取:${message} </body> </html>
EL表达式基本用法
在前面的概述介绍中,我们介绍了EL表达式的作用,它就是用于获取数据的,那么它是从哪获取数据呢?
1)获取四大域中的数据
它只能从四大域中获取数据,调用的就是findAttribute(name,value);
方法,根据名称由小到大逐个域中查找,找到就返回,找不到就什么都不显示。
它可以获取对象,可以是对象中关联其他对象,可以是一个List集合,也可以是一个Map集合。具体代码如下:
创建两个实体类,User和Address
/** * 用户的实体类 */ public class User implements Serializable{ private String name = "黑马程序员"; private int age = 18; private Address address = new Address(); 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; } public Address getAddress() { return address; } public void setAddress(Address address) { this.address = address; } }
/** * 地址的实体类 */ public class Address implements Serializable { private String province = "北京"; private String city = "昌平区"; public String getProvince() { return province; } public void setProvince(String province) { this.province = province; } public String getCity() { return city; } public void setCity(String city) { this.city = city; } }
JSP代码
<%@ page language="java" import="java.util.*" pageEncoding="UTF-8"%> <%@ page import="com.itheima.domain.User" %> <!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN"> <html> <head> <title>EL入门</title> </head> <body> <%--EL表达式概念: 它是Expression Language的缩写。它是一种替换jsp表达式的语言。 EL表达式的语法: ${表达式} 表达式的特点:有明确的返回值。 EL表达式就是把内容输出到页面上 EL表达式的注意事项: 1.EL表达式没有空指针异常 2.EL表达式没有数组下标越界 3.EL表达式没有字符串拼接 EL表达式的数据获取: 它只能在四大域对象中获取数据,不在四大域对象中的数据它取不到。 它的获取方式就是findAttribute(String name) --%> <br/>-----------获取对象数据---------------------<br/> <% //1.把用户信息存入域中 User user = new User(); pageContext.setAttribute("u",user); %> ${u}===============输出的是内存地址<%--就相当于调用此行代码<%=pageContext.findAttribute("u")%> --%><br/> ${u.name}<%--就相当于调用此行代码<% User user = (User) pageContext.findAttribute("u");out.print(user.getName());%> --%><br/> ${u.age} <br/>-----------获取关联对象数据------------------<br/> ${u.address}==========输出的address对象的地址<br/> ${u.address.province}${u.address.city}<br/> ${u["address"]['province']} <br/>-----------获取数组数据---------------------<br/> <% String[] strs = new String[]{"He","llo","Expression","Language"}; pageContext.setAttribute("strs", strs); %> ${strs[0]}==========取的数组中下标为0的元素<br/> ${strs[3]} ${strs[5]}===========如果超过了数组的下标,则什么都不显示<br/> ${strs["2"]}=========会自动为我们转换成下标<br/> ${strs['1']} <br/>-----------获取List集合数据-----------------<br/> <% List<String> list = new ArrayList<String>(); list.add("AAA"); list.add("BBB"); list.add("CCC"); list.add("DDD"); pageContext.setAttribute("list", list); %> ${list}<br/> ${list[0] }<br/> ${list[3] }<br/> <br/>-----------获取Map集合数据------------------<br/> <% Map<String,User> map = new HashMap<String,User>(); map.put("aaa",new User()); pageContext.setAttribute("map", map); %> ${map}<br/> ${map.aaa}<%--获取map的value,是通过get(Key) --%><br/> ${map.aaa.name}${map.aaa.age}<br/> ${map["aaa"].name } </body> </html>
运行结果如图:
2)EL表达式的注意事项
在使用EL表达式时,它帮我们做了一些处理,使我们在使用时可以避免一些错误。它没有空指针异常,没有数组下标越界,没有字符串拼接。
<%@ page contentType="text/html;charset=UTF-8" language="java" %> <html> <head> <title>EL表达式的注意事项</title> </head> <body> <%--EL表达式的三个没有--%> 第一个:没有空指针异常<br/> <% String str = null; request.setAttribute("testNull",str); %> ${testNull} <hr/> 第二个:没有数组下标越界<br/> <% String[] strs = new String[]{"a","b","c"}; request.setAttribute("strs",strs); %> 取第一个元素:${strs[0]} 取第六个元素:${strs[5]} <hr/> 第三个:没有字符串拼接<br/> <%--${strs[0]+strs[1]}--%> ${strs[0]}+${strs[1]} </body> </html>
运行结果图:
3)EL表达式的使用细节
EL表达式除了能在四大域中获取数据,同时它可以访问其他隐式对象,并且访问对象有返回值的方法.
4)EL表达式的运算符
EL表达式中运算符如下图所示,它们都是一目了然的:
但是有两个特殊的运算符,使用方式的代码如下:
<%@ page language="java" import="java.util.*" pageEncoding="UTF-8"%> <%@ page import="com.itheima.domain.User" %> <!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN"> <html> <head> <title>EL两个特殊的运算符</title> </head> <body> <%--empty运算符: 它会判断:对象是否为null,字符串是否为空字符串,集合中元素是否是0个 --%> <% String str = null; String str1 = ""; List<String> slist = new ArrayList<String>(); pageContext.setAttribute("str", str); pageContext.setAttribute("str1", str1); pageContext.setAttribute("slist", slist); %> ${empty str}============当对象为null返回true<br/> ${empty str1 }==========当字符串为空字符串是返回true(注意:它不会调用trim()方法)<br> ${empty slist}==========当集合中的元素是0个时,是true <hr/> <%--三元运算符 条件?真:假 --%> <% request.setAttribute("gender", "female"); %> <input type="radio" name="gender" value="male" ${gender eq "male"?"checked":""} >男 <input type="radio" name="gender" value="female" ${gender eq "female"?"checked":""}>女 </body> </html>
运行结果图:
EL表达式的11个隐式对象
1)隐式对象介绍
EL表达式也为我们提供隐式对象,可以让我们不声明直接来使用,十一个对象见下表,需要注意的是,它和JSP的隐式对象不是一回事:
EL中的隐式对象 | 类型 | 对应JSP隐式对象 | 备注 |
---|---|---|---|
PageContext | Javax.serlvet.jsp.PageContext | PageContext | 完全一样 |
ApplicationScope | Java.util.Map | 没有 | 应用层范围 |
SessionScope | Java.util.Map | 没有 | 会话范围 |
RequestScope | Java.util.Map | 没有 | 请求范围 |
PageScope | Java.util.Map | 没有 | 页面层范围 |
Header | Java.util.Map | 没有 | 请求消息头key,值是value(一个) |
HeaderValues | Java.util.Map | 没有 | 请求消息头key,值是数组(一个头多个值) |
Param | Java.util.Map | 没有 | 请求参数key,值是value(一个) |
ParamValues | Java.util.Map | 没有 | 请求参数key,值是数组(一个名称多个值) |
InitParam | Java.util.Map | 没有 | 全局参数,key是参数名称,value是参数值 |
Cookie | Java.util.Map | 没有 | Key是cookie的名称,value是cookie对象 |
JSTL概述
1)简介
JSTL的全称是:JSP Standard Tag Libary。它是JSP中标准的标签库。它是由Apache实现的。
它由以下5个部分组成:
组成 | 作用 | 说明 |
---|---|---|
Core | 核心标签库。 | 通用逻辑处理 |
Fmt | 国际化有关。 | 需要不同地域显示不同语言时使用 |
Functions | EL函数 | EL表达式可以使用的方法 |
SQL | 操作数据库。 | 不用 |
XML | 操作XML。 | 不用 |
2)使用要求
要想使用JSTL标签库,在javaweb工程中需要导入坐标。首先是在工程的WEB-INF目录中创建一个lib目录,接下来把jstl的jar拷贝到lib目录中,最后在jar包上点击右键,然后选择【Add as Libary】添加。如下图所示:
核心标签库
在我们实际开发中,用到的jstl标签库主要以核心标签库为准,偶尔会用到国际化标签库的标签。下表中把我们经常可能用到的标签列在此处,其余标签库请同学们参考【JSTL标签库.doc】文档。
标签名称 | 功能分类 | 分类 | 作用 |
---|---|---|---|
流程控制 | 核心标签库 | 用于判断 | |
<c:choose> ,<c:when>,<c:otherwise> |
流程控制 | 核心标签库 | 用于多个条件判断 |
<c:foreache> |
迭代操作 | 核心标签库 | 用于循环遍历 |
<%@ page language="java" import="java.util.*" pageEncoding="UTF-8"%> <%--导入jstl标签库 --%> <%@ taglib uri="http://java.sun.com/jsp/jstl/core" prefix="c" %> <!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN"> <html> <head> <title>JSTL的常用标签</title> </head> <body> <%-- c:if c:choose c:when c:otherwise --%> <% pageContext.setAttribute("score","F"); %> <c:if test="${pageScope.score eq 'A' }"> 优秀 </c:if> <c:if test="${pageScope.score eq 'C' }"> 一般 </c:if> <hr/> <c:choose> <c:when test="${pageScope.score eq 'A' }"> AAA </c:when> <c:when test="${pageScope.score eq 'B' }">BBB </c:when> <c:when test="${pageScope.score eq 'C' }">CCC </c:when> <c:when test="${pageScope.score eq 'D' }">DDD </c:when> <c:otherwise>其他</c:otherwise> </c:choose> <%-- c:forEach 它是用来遍历集合的 属性: items:要遍历的集合,它可以是EL表达式取出来的 var:把当前遍历的元素放入指定的page域中。 var的取值就是key,当前遍历的元素就是value 注意:它不能支持EL表达式,只能是字符串常量 begin:开始遍历的索引 end:结束遍历的索引 step:步长。i+=step varStatus:它是一个计数器对象。里面有两个属性,一个是用于记录索引。一个是用于计数。 索引是从0开始。计数是从1开始 --%> <hr/> <% List<String> list = new ArrayList<String>(); list.add("AAA"); list.add("BBB"); list.add("CCC"); list.add("DDD"); list.add("EEE"); list.add("FFF"); list.add("GGG"); list.add("HHH"); list.add("III"); list.add("JJJ"); list.add("KKK"); list.add("LLL"); pageContext.setAttribute("list",list); %> <c:forEach items="${list}" var="s" begin="1" end="7" step="2"> ${s}<br/> </c:forEach> <hr/> <c:forEach begin="1" end="9" var="num"> <a href="#">${num}</a> </c:forEach> <hr/> <table> <tr> <td>索引</td> <td>序号</td> <td>信息</td> </tr> <c:forEach items="${list}" var="s" varStatus="vs"> <tr> <td>${vs.index}</td> <td>${vs.count}</td> <td>${s}</td> </tr> </c:forEach> </table> </body> </html>