EL的功能:
替代JSP页面中数据访问时的复杂编码
<%
Employee employee = (Employee) request.getAttribute("employee");
Computer comp = employee.getComputer();
String manufacturer = comp.getManufacturer();
%>
${requestScope.employee.computer.manufacturer}
EL的特点:
自动转换类型 EL得到某个数据时可以自动转换类型
简单易用
EL的语法:
${ EL expression }
EL的4种取值范围:
pageScope,requestScope,sessionScope,applicationScope
属性范围 | EL中的名称 |
---|---|
page | pageScope |
request | requestScope |
session | sessionScope |
application | applicationScope |
注意:
1、${pageScope.username}表示在page作用域查找变量username,找不到返回null
2、如果在表达式中不标明作用域,则按照page → request → session → application的作用域顺序依次查找,找到即返回,最终找不到返回null
1、通过变量名取值:
${变量名} 推荐写为:${作用域.变量名}
2、获取对象的属性值:
<%=((User)request.getAttribute("user")).getName() %>
①、点操作符:${user.name}
②、[]操作符:${user["name"]} //注意中括号里的双引号,如果不写则表示变量名
注意:JavaBean中需要有相应getter方法才能用EL表达式这样取值
3、获取集合元素:
// 在Servlet或JSP中保存数据
List names = new ArrayList();
names.add(0, "LiYang");
names.add(1,"WangHua");
request.setAttribute("names",names);
// 在JSP中访问数据
姓名:${ names[0] }
姓名:${ names[1] }
//注意:使用[ ]指定元素下标
// 在Servlet或JSP中保存数据
Map names = new HashMap();
names.put("one", "LiYang");
names.put("two", "WangHua");
request.setAttribute("names", names);
// 在JSP中访问数据
姓名:${ names.one }
姓名:${ names["two"] }
注意:
1、Map建议使用String做key,如果使用纯数值格式则只能使用长整形
Map names = new HashMap();
names.put(1L, "LiYang");
names.put("two", "WangHua");
request.setAttribute("names", names);
2、Map中key的类型:
//对于String类型的key
${names["two"]}和${names.two}
//对于Long类型的key仅可使用
${names[1]}
关系操作符、逻辑操作符、empty操作符
关系操作符 | 说明 | 示例 | 结果 |
---|---|---|---|
== 或者eq |
等于 | ${23==5} 或${23 eq 5} ${"a" =="a"} 或${"a" eq "a"} |
false true |
!= 或者ne |
不等于 | ${23!=5} 或${23 ne 5} |
true |
< 或者lt |
小于 | ${23<5} 或${23 lt 5} |
false |
> 或者gt |
大于 | ${23>5} 或${23 gt 5} |
true |
<= 或者le |
小于等于 | ${23<=5} 或${23 le 5} |
false |
>= 或者ge |
大于等于 | ${23>=5} 或${23 ge 5} |
ture |
①、若变量 a
为null
,或长度为零的String
,或size为零
的集合
,则${ empty a }
返回的结果为true
②、${ not empty a }
或${ ! empty a }
返回的结果为false
逻辑操作符 | 说明 | 示例 |
---|---|---|
&& 或者and |
逻辑与 | 如果A为true,B为false,则${ A && B } 或者${ A and B } |
| 或者or |
逻辑或 | 如果A为true,B为false,则${ A || B} 或者${ A or B } |
! 或者not |
逻辑非 | 如果A为true,则${ ! A } 或者${ not A } |
对象名称 | 说 明 |
---|---|
pageScope | 与page作用域相关联的Map对象 |
requestScope | 与request作用域相关联的Map对象 |
sessionScope | 与session作用域相关联的Map对象 |
applicationScope | 与application作用域相关联的Map对象 |
对象名称 | 说 明 |
---|---|
param | 按照请求参数名称返回单一值的Map对象 |
paramValues | 按照请求参数名称返回String数组的Map对象 |
pageContext 提供对页面信息和JSP内置对象的访问
1、开启方法
servlet2.4之后默认方法为false,即可以不写或写成<%@ page isELIgnored="false" %>
2、关闭方法
<%@ page isELIgnored="true" %>
3、批量禁用EL的方法
在WEB-INF/web.xml中使用jsp-property-group标签批量禁用el,web.xml中进行如下配置:
<web-app xmlns="http://java.sun.com/xml/ns/j2ee"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="
http://java.sun.com/xml/ns/j2ee
http://java.sun.com/xml/ns/j2ee/web-app_2_4.xsd"version="2.4">
<jsp-config>
<jsp-property-group>
<url-pattern>*.jspurl-pattern>
<el-ignored>trueel-ignored>
jsp-property-group>
jsp-config>
web-app>
1、基本格式:${}
2、4种取值范围:pageScope,requestScope,sessionScope,applicationScope
3、基本运算:.
和[]
, .
用于取属性、[]
用于取Array,List,Map,Set
${requestScope.map['apple']}
${requestScope.list[1]}
4.花括号内允许的运算:算术运算,关系运算,逻辑运算,empty/not empty空判断
${1+1}
${user.age<18}
${(user.age>18)&&(user.sex=='男')}
${empty user}判断user对象是否为空
5、EL的11个隐含对象:
隐含对象名称 | 描述 |
---|---|
pageContext | 对应于JSP页面中的pageContext对象(注意:取的是pageContext对象。) |
pageScope | 代表page域中用于保存属性的Map对象 |
requestScope | 代表request域中用于保存属性的Map对象 |
sessionScope | 代表session域中用于保存属性的Map对象 |
applicationScope | 代表application域中用于保存属性的Map对象 |
param | 表示一个保存了所有请求参数的Map对象 |
paramValues | 表示一个保存了所有请求参数的Map对象,它对于某个请求参数,返回string[] 数组 |
header | 表示一个保存了所有http请求头字段的Map对象 |
headerValues | 返回string[]数组。如果头里面有- ,则需要用到headerValues例:Accept-Encoding,则要 headerValues[“Accept-Encoding”] |
cookie | 表示一个保存了所有cookie的Map对象 |
initParam | 表示一个保存了所有web应用初始化参数的map对象 |
1、提供一组标准标签
2、可用于编写各种动态 功能
EL表达式封装了数据访问的功能
JSTL标签库则封装了逻辑控制、循环控制以及数据格式化等功能
JSTL通常会与EL表达式合作实现JSP页面的编码
JSTL的环境搭建
1、引入JSTL的jar文件和标签库描述符文件
如果使用MyEclipse,创建web project 时选择 Java EE 5.0或 Java EE 6.0单选按钮,则可集成了JSTL
2、在JSP页面添加taglib指令
<%@ taglib uri="http://java.sun.com/jsp/jstl/core" prefix="c" %>
3、使用JSTL标签
通用标签:
1、将value值存储到范围为scope的变量variable中
set var="variable" value="value" scope="scope" />
2、将value值设置到对象的属性中
set target="target" property="property" value="value" />
// 在Servlet或JSP中设置JavaBean
User user = new User();
request.setAttribute("user", user);
// 在JSP中修改JavaBean的属性值
set target="${user}" property="name" value="defaultName" />
1、不指定默认值
语法:out value="value" />
2、指定默认值
语法:out value="value" default="default" />
// 在Servlet或JSP中设置JavaBean
User user = new User();
request.setAttribute("user", user);
// 在JSP中输出JavaBean的属性值
out value="${user.name}" default="No UserName" />
3、转义特殊字符
${"百度"}
"false" value="百度" />
"百度" />
//前两个显示百度链接,而第三个则为一串字符串"百度"
注意:
1、
标签,类似于JSP中的<%=%>
,
标签可以指定默认值,<%=%>
则不能,最好添加默认值
语法:var="variable" scope="scope" />
例子:
设置变量之前的值是:msg=<c:out value="${msg}" default="null" /><br/>
<c:set var="msg" value="Hello World!" scope="page">c:set>
设置新值以后:msg=<c:out value="${msg}">c:out><br/>
<c:remove var="msg" scope="page" />
移除变量msg以后:msg=<c:out value="${msg}" default="null">c:out>
if test="codition" var="variable" scope="scope" >
…
if>
test属性:判断条件表达式返回true/false
var属性:该变量用于保存返回的true/false
scop属性:指定var变量的作用域
表单1:使用if标签判断是否登录
set var="isLogin" value="${empty sessionScope.user}"/>
if test="${isLogin}">
…登录表单
if>
if test="${! isLogin}">
…已经登录
if>
//choose:实现if - else if - else语句的功能
<c:choose>
<c:when test="condition1">
内容1
c:when>
<c:when test="condition2">
内容2
c:when>
……
<c:otherwise>
内容n
c:otherwise>
c:choose >
1、forEach:实现对集合对象的遍历
forEach items="collection" var="varName" begin="start" end="end" step="stepSize" varStatus="status">
…循环体代码…
forEach>
items属性:指定要遍历的集合对象
var属性:指定当前成员的引用
begin属性:指定从集合的第几位开始
end属性:指定迭代到集合的第几位结束
step属性:指定循环的步长
varStatus属性:用于存放var引用的成员的相关信息,如索引等
2、forEach:指定迭代的次数
forEach begin="start" end="end" step= "stepSize">
…循环体代码…
forEach>
3、通过迭代标签显示商品列表,并且隔行变色
// 在Servlet或JSP中准备集合数据
List products = GoodsDao.getAllProducts();
request.setAttribute("products", products);
// 在JSP中展示数据
<c:forEach items="${requestScope.products}" var="product"
varStatus="status">
<tr <c:if test="${status.index % 2 == 1 }">
style="background-color:rgb(219,241,212);"c:if>>
<td>${product.name }td>
<td>${product.area }td>
<td>${product.price }td>
tr>
c:forEach>
4、通过迭代标签遍历Map
// 在Servlet或JSP中准备数据
Map<String, String> map = new HashMap<String, String>();
map.put("tom", "美国");
map.put("lily", "英国");
map.put("jack", "中国");
request.setAttribute("map", map);
// 在JSP中展示数据
<c:forEach items="${requestScope.map}" var="entry">
${ entry.key }
${ entry.value }<p>
</c:forEach>