一、EL表达式
1. EL表达式的意义及作用
EL(Expression Language)是为了JSP写起来更加的简单。
EL表达式的灵感来自于EXMAScript和XPath表达式语言,它提供了JSP中简化表达式的方法,使JSP的代码更加简化。 —— 摘自百度百科
2. 语法结构
${expression}
3. 运算符.与[]
- EL表达式提供了.与[]2种方式存取数据。例如:
${user.name} //相当于request.getAttribute("user").getName();
${user["name"]} //相当于request.getAttribute("user").getName();
- 当存取的属性中存在特殊字符,如_或-等非字母或数字的符号时,就一定要使用[]来获取。例如:
${user["user_name"]}
- 如果需要动态取值,也要使用[]来获取,.无法做到动态取值。例如:
${sessionScope.user["data"]}//其中data是变量
注:这里的user.name用到的类反射属性,其中name是Bean属性。
Bean属性: 与get/set方法对应的属性称为Bean属性。
对象属性: 不与get/set方法对应的属性成为对象属性。
4. EL的取值范围
-
EL默认从如下4个对象中依次取值
注:EL默认是从以下4个对象中一次取值,如果中途找到了相应的属性,就直接回传,不在继续找下去。
如果4个对象都找完依然没有找到相应的属性,就返回“”。
1. page //EL中的名称: pageScope 2. request //EL中的名称: requestScope 3. session //EL中的名称: sessionScope 4. application //EL中的名称: applicationScope
-
EL指定取值范围,例如:
${requestScope.user.nam}
5. 支持运算
-
算术型(+、-、*、/、%、…)
${user.age + 3} //年龄+3
-
逻辑型(&&、||、!、and、or、not)
-
关系型(==、!=、>、<、>=、<=、…)
${user.age>=20 && user.age<=30}//判断年龄在20~30之间
-
空(empty)
${empty user}
-
条件型(A ? B : C)
${user.sex=="M" ? "男" : "女"}
6. 隐私对象
EL表达式定义了一些隐式对象,允许对以下对象简单访问。
对象 | 语法 | 说明 |
---|---|---|
param | ${param.userId} | 将请求参数名称映射到单个字符串参数值(通过调用 ServletRequest.getParameter (String name) 获得)。getParameter (String) 方法返回带有特定名称的参数。表达式 ${param . name}相当于 request.getParameter (name)。 |
pageContext | ${pageContext.response} | JSP 页的上下文。它可以用于访问 JSP 隐式对象,如请求、响应、会 话、输出、servletContext 等。例如,${pageContext.response} 为页面的响应对象赋值。 |
paramValues | ${paramvalues. name} | 将请求参数名称映射到一个数值数组(通过调用 ServletRequest.getParameter (String name) 获得)。它与 param 隐式对象非常类似,但它检索一个字符串数组而不是单个值。表达式 ${paramvalues. name} 相当于 request.getParamterValues(name)。 |
header | ${header. name} | 将请求头名称映射到单个字符串头值(通过调用 ServletRequest.getHeader(String name) 获得)。表达式 ${header. name} 相当于 request.getHeader(name)。 |
headerValues | ${headerValues. name} | 将请求头名称映射到一个数值数组(通过调用 ServletRequest.getHeaders(String) 获得)。它与头隐式对象非常类似。表达式 ${headerValues. name} 相当于 request.getHeaderValues(name)。 |
cookie | ${cookie. name .value} | 将 cookie 名称映射到单个 cookie 对象。向服务器发出的客户端请求可以获得一个或多个 cookie。表达式 ${cookie. name .value} 返回带有特定名称的第一个 cookie 值。如果请求包含多个同名的 cookie,则应该使用 ${headerValues. name} 表达式。 |
7. 特别注意
- 注意当表达式根据名称引用这些对象之一时,返回的是相应的对象而不是相应的属性。例如:即使现有的 pageContext 属性包含某些其他值,${pageContext} 也返回 PageContext 对象。
- 注意 <%@ page isELIgnored=“true” %> 表示是否禁用EL语言,TRUE表示禁止.FALSE表示不禁止.JSP2.0中默认的启用EL语言。
- 全局禁用EL表达式,在web.xml中进行如下配置:
<jsp-config>
<jsp-property-group>
<url-pattern>*.jsp</url-pattern>
<el-ignored>true</el-ignored>
</jsp-property-group>
</jsp-config>
二、JSTL
1. 什么是JSTL?
JSTL (JavaServer Pages Standard Tag Library), JSP标准标签库。
JSP标准标签库是一个JSP标签集合,它封装了JSP应用的通用核心功能。
根据JSTL提供的功能,可以将其分为以下5个类别:
- 核心标签
- 格式化标签
- SQL标签
- XML标签
- JSTL函数
2. 如何使用JSTL?
-
step1: 导入jstl.jar包
也可以从apache官网下载,将jstl.jar和standard.jar拷贝到/WEB-INF/lib/目录下。
-
step2:在JSP页面上使用taglib指令导入指定的标签库
语法格式:<%@taglib prefix="" uri="" %>
prefix: 标签库的别名,对应标签库中的short-name
uri: 标签库的访问地址,对应标签库中的
例如(导入核心标签库):
<%@taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core"%>
-
step3: 在JSP代码中使用具体的标签,例如:
//1.使用if标签(与java中的if作用一致) <c:if test="${user.sex=='M'}">男</c:if> <c:if test="${user.sex=='F'}">女</c:if>
//2.使用choose标签(与java中的swith...case...语句作用一样,可以在众多选项中做出选择) <c:choose> <c:when test="${user.sex}=='M'"> 男 </c:when> <c:when test="${user.sex}=='F'"> 女 </c:when> <c:otherwise> 人妖 </c:otherwise> //类似于default </c:choose>
//3.使用forEach标签(用于迭代一个集合中的对象) <c:forEach items="${user.interest}" var="item"> //item:要迭代的集合; var:每次迭代出的对象 ${item} //使用EL表达式输出 </c:forEach>
3. JSTL运行原理
jsp文件编译为servlet时要执行以下几步:
- 通过标签<c:if test="" ></c:test >的前缀c找到与页面引入的与它对应的标签库<%@taglib prefix=“c” uri="…core"%>
- 通过标签库的uri找到jstl.jar中对应的c.tld文件。
- 通过标签的后缀 if 在c.tld文件中找到对应name=if的tag标签。
- 在翻译后的servlet中通过daTag()方法调用tag标签中tag-class指向的类。