本节内容
1.EL表达式
2.JSTL核心标签
一、EL表达式
EL 全名为Expression Language。EL主要作用:
1、获取数据
EL表达式主要用于替换JSP页面中的脚本表达式,以从各种类型的web域 中检索java对象、获取数据。(某个web域 中的对象,访问javabean的属性、访问list集合、访问map集合、访问数组)
2、执行运算
利用EL表达式可以在JSP页面中执行一些基本的关系运算、逻辑运算和算术运算,以在JSP页面中完成一些简单的逻辑运算。${user==null}
3、获取web开发常用对象
EL 表达式定义了一些隐式对象,利用这些隐式对象,web开发人员可以很轻松获得对web常用对象的引用,从而获得这些对象中的数据。
4、调用Java方法
EL表达式允许用户开发自定义EL函数,以在JSP页面中通过EL表达式调用Java类的方法。
EL表达式语法: ${“标识符”}
获取数据
EL表达式语句在执行时,会调用pageContext.findAttribute方法,用标识符为关键字,分别从page、request、session、application四个域中查找相应的对象,找到则返回相应对象,找不到则返回”” (注意,不是null,而是空字符串)。
EL表达式可以很轻松获取JavaBean的属性,或获取数组、Collection、Map类型集合的数据

<%@page import="com.xk.bean.Dept"%> <%@page import="java.util.*"%> <%@ page language="java" contentType="text/html; charset=UTF-8" pageEncoding="UTF-8"%> <%@ page errorPage="error.jsp"%> <!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd"> <html> <head> <meta http-equiv="Content-Type" content="text/html; charset=UTF-8"> <title>EL表达式获取数据</title> </head> <body> <% request.setAttribute("name", "龙之殇"); %> <%--${name}等同于pageContext.findAttribute("name") --%> 使用EL表达式获取数据:${name} <!-- 在jsp页面中,使用el表达式可以获取bean的属性 --> <hr/> <% Dept dept = new Dept(); dept.setE_id(101); dept.setName("龙之殇"); dept.setSalary(10000); request.setAttribute("dept", dept); %> <!--取出bean中的属性值 --> ${dept.e_id} ${dept.name} ${dept.salary} <!-- 在jsp页面中,使用el表达式获取list集合中指定位置的数据 --> <hr/> <% Dept dept1 = new Dept(); dept1.setE_id(100); dept1.setName("龙之殇1"); dept1.setSalary(10000); Dept dept2 = new Dept(); dept2.setE_id(102); dept2.setName("龙之殇2"); dept2.setSalary(10000); Dept dept3 = new Dept(); dept3.setE_id(103); dept3.setName("龙之殇3"); dept3.setSalary(10000); List<Dept> list =new ArrayList<Dept>(); list.add(dept1); list.add(dept2); list.add(dept3); request.setAttribute("lists", list); %> <!-- 取list指定位置的数据 --> ${lists[1].name} <hr/> <!-- 在jsp页面中,使用el表达式获取map集合的数据 --> <% Map<String,Dept> map = new HashMap<String,Dept>(); map.put("a", dept1); map.put("b", dept2); map.put("c", dept3); request.setAttribute("map",map); %> ${map.c.name} ${map["a"].name} </body> </html>
执行运算
1、关系运算符
2.逻辑运算符
3、empty运算符:检查对象是否为null(空)
4、二元表达式:${user!=null?user.name :""}
5、[ ] 和 . 号运算符

<%@ page language="java" contentType="text/html; charset=UTF-8" pageEncoding="UTF-8"%> <!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd"> <html> <head> <meta http-equiv="Content-Type" content="text/html; charset=UTF-8"> <title>El表达式运算</title> </head> <body> 四则运算 ${10+30 }<br/> ${30-10}<br/> ${30*2 }<br/> ${30/2}<br/> 关系运算符 <br/> 两种写法等价 ${dept5 ==null}<br/> ${dept5 eq null}<br/> <h3>el表达式使用empty运算符检查对象是否为null(空)</h3> ${empty(list)} <h3>EL表达式中使用三目运算符</h3> ${list eq null? "没有这个对象":list[1].name} </body> </html>
获得web开发常用对象
EL表达式语言中定义了11个隐含对象,使用这些隐含对象可以很方便地获取web开发中的一些常见对象,并读取这些对象的数据
序号 | 隐含对象名称 | 描 述 |
1 | pageContext | 对应于JSP页面中的pageContext对象(注意:取的是pageContext对象。) |
2 | pageScope | 代表page域中用于保存属性的Map对象 |
3 | requestScope | 代表request域中用于保存属性的Map对象 |
4 | sessionScope | 代表session域中用于保存属性的Map对象 |
5 | applicationScope | 代表application域中用于保存属性的Map对象 |
6 | param | 表示一个保存了所有请求参数的Map对象 |
7 | paramValues | 表示一个保存了所有请求参数的Map对象,它对于某个请求参数,返回的是一个string[] |
8 | header | 表示一个保存了所有http请求头字段的Map对象,注意:如果头里面有“-” ,例Accept-Encoding,则要header[“Accept-Encoding”] |
9 | headerValues | 表示一个保存了所有http请求头字段的Map对象,它对于某个请求参数,返回的是一个string[]数组。注意:如果头里面有“-” ,例Accept-Encoding,则要headerValues[“Accept-Encoding”] |
10 | cookie | 表示一个保存了所有cookie的Map对象 |
11 | initParam | 表示一个保存了所有web应用初始化参数的map对象 |

<%@ page language="java" contentType="text/html; charset=UTF-8" pageEncoding="UTF-8"%> <!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd"> <html> <head> <meta http-equiv="Content-Type" content="text/html; charset=UTF-8"> <title>el表达式的隐式对象</title> </head> <body> 获取JSP页面中的pageContext对象 ${pageContext.session.id}<br/> <% pageContext.setAttribute("name", "Drango Wal"); %> <h1>pageScope对象:从page域(pageScope)中查找数据</h1> ${pageScope.name} <h1>requestScope对象:从request域(requestScope)中获取数据</h1> <% request.setAttribute("name", "龙之殇"); %> ${requestScope.name } <h1>sessionScope对象:从session域(sessionScope)中获取数据</h1> <% session.setAttribute("name", "session对象"); %> ${sessionScope.name } <h1>applicationScope对象:从application域(applicationScope)中获取数据</h1> <% application.setAttribute("name", "application对象"); %> ${applicationScope.name} <h1>param对象:获得用于保存请求参数map,并从map中获取数据</h1> <form action="#" method="get"> <input type="text" name="username"/> <input type="submit" value="提交"/> </form> ${param.username} <h1>paramValues对象:paramValues获得请求参数(所有的参数)</h1> <form action="#" method="get"> <input type="text" name="username"/> <input type="text" name="username"/> <input type="submit" value="提交"/> </form> ${paramValues.username[0]} ${paramValues.username[1]} <h1>header对象:header获得请求头</h1> ${header.Accept}<br/> <%--${header.Accept-Encoding} 这样写会报错 测试headerValues时,如果头里面有“-” ,例Accept-Encoding,则要headerValues[“Accept-Encoding”]--%> ${header["Accept-Encoding"]} <h1>headerValues对象:headerValues获得请求头的值</h1> <%--headerValues表示一个保存了所有http请求头字段的Map对象,它对于某个请求参数,返回的是一个string[]数组 例如:headerValues.Accept返回的是一个string[]数组 ,headerValues.Accept[0]取出数组中的第一个值 --%> ${headerValues.Accept[0]}<br/> <%--${headerValues.Accept-Encoding} 这样写会报错 测试headerValues时,如果头里面有“-” ,例Accept-Encoding,则要headerValues[“Accept-Encoding”] headerValues["Accept-Encoding"]返回的是一个string[]数组,headerValues["Accept-Encoding"][0]取出数组中的第一个值 --%> ${headerValues["Accept-Encoding"][0]} <h1>cookie对象:cookie对象获取客户机提交的cookie</h1> ${cookie.cookieName.value} <h1>initParam对象:initParam对象获取在web.xml文件中配置的初始化参数</h1> ${initParam.names} </body> </html>
二、JSTL核心标签
JSTL标签库的使用是为弥补html标签的不足,规范自定义标签的使用而诞生的。使用JSLT标签的目的就是不希望在jsp页面中出现java逻辑代码
EL表达式不能进行循环操作:使用JSTL可以弥补这个缺点,所以EL表达式与JSTL通常配合使用。
JSTL标签库的分类
- 核心标签(用得最多)
- 国际化标签(I18N格式化标签)
- 数据库标签(SQL标签,很少使用)
- XML标签(几乎不用)
- JSTL函数(EL函数)
-
JSTL的核心标签库标签共13个,使用这些标签能够完成JSP页面的基本功能,减少编码工作。
从功能上可以分为4类:表达式控制标签、流程控制标签、循环标签、URL操作标签。
(1)表达式控制标签:out标签、set标签、remove标签、catch标签。
(2)流程控制标签:if标签、choose标签、when标签、otherwise标签。
(3)循环标签:forEach标签、forTokens标签。
(4)URL操作标签:import标签、url标签、redirect标签、param标签。
在JSP页面引入核心标签库:使用taglib指令:
<%@ taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core" %>
表达式控制标签:
<c:out>标签用来显示一个表达式的结果,与<%= %>作用相似,它们的区别就是<c:out>标签可以直接通过"."操作符来访问属性。
<c:out value="<string>" default="<string>" escapeXml="<true|false>"/>
<c:set>标签用于设置变量值和对象属性。
<c:set var="<string>" value="<string>" target="<string>" property="<string>" scope="<string>"/>
<c:remove>标签用于移除一个变量,可以指定这个变量的作用域,若未指定,则默认为变量第一次出现的作用域。
这个标签不是特别有用,不过可以用来确保JSP完成清理工作。
<c:remove var="<string>" scope="<string>"/>
<c:catch> 标签主要用来处理产生错误的异常状况,并且将错误信息储存起来
<c:catch var="<string>"> ... </c:catch>

<%@ page language="java" contentType="text/html; charset=UTF-8" pageEncoding="UTF-8"%> <!--引入JSTL核心标签库 --> <%@ taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core"%> <!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd"> <html> <head> <meta http-equiv="Content-Type" content="text/html; charset=UTF-8"> <title>JSTL标签库</title> </head> <body> <h1>表达式控制标签</h1> out输出标签 <br/> 直接输出一个字符串<br/> <c:out value="out输出不同属性的输出"></c:out> <br/> <%--escapeXml="false"表示value值中的html标签不进行转义,而是直接输出 --%> <c:out value="<a href='http://www.baidu.com/'>点击链接到百度</a>" escapeXml="false"></c:out> <%-- 字符串中有转义字符,但在默认情况下没有转换。 --%> <br/> <c:out value="<未使用字符转义>" /> <br/> 使用了转义字符<和>分别转换成<和>符号。 <c:out value="<使用字符转义>" escapeXml="false"></c:out> <br/> 设定了默认值,从EL表达式${null}得到空值,所以直接输出设定的默认值,没有默认值直接输出空<br/> <c:out value="${null}"></c:out> <br/> <c:out value="${null}" default="默认值"/> <h1>set标签</h1> <%--通过<c:set>标签将data的值放入page范围中。--%> <c:set var="data" value="Drango wal" scope="page"/> <br/> 从page域中得到值:${pageScope.data} <br/> <%--通过<c:set>标签将data2的值放入request范围中。--%> <c:set var="data1" value="Drango wal request" scope="request"/> 从request域中得到值:${requestScope.data1} <br/> <%--通过<c:set>标签将值data2的值放入session范围中。--%> <c:set value="龙之殇" var="data2" scope="session"></c:set> 从session域中得到值:${sessionScope.name1} <br/> <%--把data3放入application范围中。 --%> <c:set var="data3" scope="application">大罗金仙</c:set> 使用标签与EL表达式输出 <c:out value="${applicationScope.data3}">未得到data3的值</c:out> <h1>remove标签</h1> <c:set var="name" scope="session">龙之殇</c:set> <c:set var="age" scope="session">25</c:set> <c:out value="${sessionScope.name}"></c:out> <br/> <c:out value="${sessionScope.age}"></c:out> <br/> <%--使用remove标签移除age变量 --%> <c:remove var="age" /> <c:out value="${sessionScope.name}"></c:out> <br/> <c:out value="${sessionScope.age}"></c:out> <br/> <h1>catch标签</h1> <%--把容易产生异常的代码放在<c:catch></c:catch>中, 自定义一个变量errorMessage用于存储异常信息 --%> <c:catch var="errorMessage"> <!-- 放异常代码 --> <c:set target="person" property="name" value="龙之殇"></c:set> </c:catch> <%--用EL表达式得到errorMessage的值,并使用<c:out>标签输出 --%> 异常:<c:out value="${errorMessage}" /><br /> <br/> <br/> <br/> <br/> <br/> <br/> </body> </html>
流程控制标签
<c:if>标签判断表达式的值,如果表达式的值为 true 则执行其主体内容。
<c:if test="<boolean>" var="<string>" scope="<string>"> ... </c:if>
<c:choose>, <c:when>, <c:otherwise> 标签
<c:choose>标签与Java switch语句的功能一样,用于在众多选项中做出选择。
switch语句中有case,而<c:choose>标签中对应有<c:when>,switch语句中有default,而<c:choose>标签中有<c:otherwise>。
<c:choose> <c:when test="<boolean>"> ... </c:when> <c:when test="<boolean>"> ... </c:when> ... ... <c:otherwise> ... </c:otherwise> </c:choose>
属性
- <c:choose>标签没有属性。
- <c:when>标签只有一个属性,在下表中有给出。
- <c:otherwise>标签没有属性。
<c:forEach>, <c:forTokens> 标签
这些标签封装了Java中的for,while,do-while循环。
相比而言,<c:forEach>标签是更加通用的标签,因为它迭代一个集合中的对象。
<c:forTokens>标签通过指定分隔符将字符串分隔为一个数组然后迭代它们。
forEach 语法格式 <c:forEach items="<object>" begin="<int>" end="<int>" step="<int>" var="<string>" varStatus="<string>"> ... forTokens 语法格式 <c:forTokens items="<string>" delims="<string>" begin="<int>" end="<int>" step="<int>" var="<string>" varStatus="<string>">

<%@ page language="java" contentType="text/html; charset=UTF-8" pageEncoding="UTF-8"%> <%@page import="com.xk.bean.Dept"%> <%@page import="java.util.*"%> <!--引入JSTL核心标签库 --> <%@ taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core"%> <!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd"> <html> <head> <meta http-equiv="Content-Type" content="text/html; charset=UTF-8"> <title>JSTL流程控制标签</title> </head> <body> <h1>if条件判断</h1> <form action="#" method="post"> <input type="text" name="uname" value="${param.uname}"> <input type="submit" value="登录"> </form> <%--使用if标签进行判断并把检验后的结果赋给adminUserName,存储在默认的page范围中。 --%> <c:if test="${param.uname=='admin'}" var="adminUserName"> <c:out value="${adminUserName}"></c:out> </c:if> ${adminUserName} <h1>choose及其嵌套标签示例</h1> <%--通过set标签设定score的值为90 --%> <c:set var="score" value="90" /> <c:choose> <%--使用<c:when>进行条件判断。 如果大于等于90,输出“您的成绩为优秀”; 如果大于等于70小于90,输出“您的成绩为良好”; 大于等于60小于70,输出“您的成绩为及格”; 其他(otherwise)输出“对不起,您没能通过考试”。 --%> <c:when test="${score>=90}"> 你的成绩为优秀! </c:when> <c:when test="${score>70 && score<90}"> 您的成绩为良好! </c:when> <c:when test="${score>60 && score<70}"> 您的成绩为及格 </c:when> <c:otherwise> 对不起,您没有通过考试! </c:otherwise> </c:choose> <h1>forEach标签实例</h1> <% Dept dept1 = new Dept(); dept1.setE_id(100); dept1.setName("龙之殇1"); dept1.setSalary(10000); Dept dept2 = new Dept(); dept2.setE_id(102); dept2.setName("龙之殇2"); dept2.setSalary(10000); Dept dept3 = new Dept(); dept3.setE_id(103); dept3.setName("龙之殇3"); dept3.setSalary(10000); List<Dept> list =new ArrayList<Dept>(); list.add(dept1); list.add(dept2); list.add(dept3); request.setAttribute("lists", list); %> 不指定begin和end的迭代:<br/> <c:forEach var="dept" items="${lists}"> <c:out value="${dept.name}"></c:out><br/> </c:forEach> <br/> 指定begin和end的迭代:<br/> <c:forEach var="dept" items="${lists}" begin="0" end="2" step="2"> <c:out value="${dept.name}"></c:out><br/> </c:forEach> <h1>forTokens标签</h1> <c:forTokens items="天、王、盖、地、虎" delims="、" var="str"> ${str}<br/> </c:forTokens> </body> </html>
URL标签:
<c:import> 标签
该标签可以把其他静态或动态文件包含到本JSP页面,与<jsp:include>的区别为:<jsp:include>只能包含同一个web应用中的文件。而<c:import>可以包含其他web应用中的文件,甚至是网络上的资源。
<c:import url="<string>" var="<string>" scope="<string>" varReader="<string>" context="<string>" charEncoding="<string>"/>
<c:param>标签用于在<c:url>标签中指定参数,而且与URL编码相关。
在<c:param>标签内,name属性表明参数的名称,value属性表明参数的值。
<c:param name="<string>" value="<string>"/>
<c:redirect> 标签
<c:redirect>标签通过自动重写URL来将浏览器重定向至一个新的URL,它提供内容相关的URL,并且支持c:param标签。
<c:redirect url="<string>" context="<string>"/>
<c:url> 标签
<c:url>标签将URL格式化为一个字符串,然后存储在一个变量中。
这个标签在需要的时候会自动重写URL。
var属性用于存储格式化后的URL。
<c:url>标签只是用于调用response.encodeURL()方法的一种可选的方法。它真正的优势在于提供了合适的URL编码,包括<c:param>中指定的参数。
<c:url var="<string>" scope="<string>" value="<string>" context="<string>"/>

<%@ page language="java" contentType="text/html; charset=UTF-8" pageEncoding="UTF-8"%> <!--引入JSTL核心标签库 --> <%@ taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core"%> <!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd"> <html> <head> <meta http-equiv="Content-Type" content="text/html; charset=UTF-8"> <title>JSTL中URL标签</title> </head> <body> <h1>import标签</h1> <%--使用绝对路径导入百度首页,--%> <c:import url="http://wwww.baidu.com" charEncoding="utf-8" /> <%--使用相对路径导入同一文件夹下的文件--%> <c:import url="index.jsp" charEncoding="utf-8" /> <h1>redirect标签</h1> <c:redirect url="http://www.baidu.com"> <%--在重定向时使用<c:param>标签为URL添加了两个参数:uname=wuzhilong和password=12356 --%> <c:param name="uname">wuzhilong</c:param> <c:param name="password">12356</c:param> </c:redirect> <h1>param标签</h1> <c:url value="http://www.baidu.com" var="paramUrl"> <c:param name="userName" value="wuzhilong" /> <c:param name="pwd">123456</c:param> </c:url> <a href="${paramUrl}">百度首页(带参数)</a> </body> </html>