目录
2、choose(条件标签):实现Java语言中if-else if-else语句的功能
1、为什么需要EL
JSP脚本的缺点
1、JavaBean在JSP中的局限
- 在JSP页面中嵌入大量的Java代码
- 获取JavaBean属性必须要实例化
- 强制类型转化
<%
Employee employee = (Employee)request.getAttribute("employee");
Computer comp = employee.getComputer();
String manufacturer = comp.getManufacturer();
%>
2、解决办法
使用EL表达式简化
${requestScope.employee.computer.manufacturer}
2、EL表达式简介
1、什么是EL
- Expression Language(表达式语言)
2、EL的功能
- 替代JSP页面中的复杂代码
3、EL的特点
- 自动转换类型
- EL得到某个数据时可以自动转换类型
- 使用简单
4、EL表达式语法
${ EL exprission }
- 使用变量名获取值
- 获取对象的属性值
- 获取集合
1、使用变量名获取值
使用EL表达式之前,必须先将操作的对象保存到作用域中。
- ${变量名}
<% request.setAttribute("username","LiYang"); %>
姓名: ${username}
2、变量属性范围名称
JSP提供了4种作用域,分别是page,request,session,application。为了能够访问这4个作用域内的数据,EL表达式分别提供了4种作用域访问对象,来实现数据的读取。
属性范围 | EL中的名称 | 说明 |
page | pageScope | 与页面作用域(page)中的属性相关联的Map类,主要用于获取页面范围内的属性值 ${pageScope.username},表示在page范围内查找username变量,找不到返回Null |
request | requstScope | |
session | sessionScope | |
application | applicationScope |
${requstScope.username}
${requestScope.news["title"]}
当使用EL表达式访问某个属性值时,应当指定查找的范围。
如果程序中不指定查找的范围,那么系统会自动按照顺序(page→request→session→application)进行查找。
3、获取对象的属性值
<%
User user = (User )request.getAttribute("user");
user.getName();
%>
- 点操作符,访问对象的属性
${user.name}
- [ ]操作符,不仅可以访问对象的属性,还可以用于访问数组和集合
${user["name"]} //访问user对象的name属性
${newsList[0]} //访问newsList数组中的第一个元素
使用EL表达式输出姓名
<%
Map names = new HashMap();
names.put("one","LiYang");
names.put("two","WangHua");
request.setAttribute("names",names);
%>
姓名:${names.one}<br/>
姓名:${names["two"] }<br/>
- 关系操作符
关系操作符
说明
示例
结果
==(或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
- 逻辑操作符
逻辑操作符
说明
示例
结果
&&(或and)
逻辑与
如果A为true,B为false,则A&&B(或A and B)
false
||(或or)
逻辑或
如果A为true,B为false,则A||B(或A or B)
true
! (或not)
逻辑非
如果A为true,则!A (或not A)
false
- Empty操作符
变量 a不存在,则${empty a}返回的结果为true
${not empty a}或${!empty a}返回的结果为false
3、EL隐式对象
作用域访问对象:pageScope、requestScope、sessionScope、applicationScope
参数访问对象:param、paramValues
JSP隐式对象:pageContext
对象名称 | 说 明 |
pageScope | 返回页面范围的变量名,这些名称已映射至相应的值 |
requestScope | 返回请求范围的变量名,这些名称已映射至相应的值 |
sessionScope | 返回会话范围的变量名,这些名称已映射至相应的值 |
applicationScope | 返回应用范围内的变量,并将变量名映射至相应的值 |
param | 返回客户端的请求参数的字符串值 |
paramValues | 返回映射至客户端的请求参数的一组值 |
pageContext | 提供对用户请求和页面信息的访问 |
4、为什么使用JSTL
虽然EL表达式可以访问JavaBean的属性,但是并不能实现在JSP中进行逻辑判断,因而要使用JSTL标签。
5、什么是JSTL
SP标准标签库(JavaServerPages Standard Tag Library),包含了在开发JSP时经常用到的一系列标准标签。这些标签提供了一种不用嵌套Java代码就可以实现复杂JSP开发的途径。JSTL按照不同的用途又可以划分为多个分类,如下:
JSTL通常会与EL表达式合作实现JSP页面的编码
6、JSTL 的优点
- 提供一组标准标签
- 可用于编写各种动态 JSP 页面
7、JSTL的环境搭建
使用JSTL的步骤
- 在工程中引用JSTL的两个jar包和标签库描述符文件
- 在JSP页面添加taglib指令
<%@ taglib uri="http://java.sun.com/jsp/jstl/core" prefix="c"%>
8、 JSTL标准标签库内的标签
核心标签库
通用标签:out、set、remove
条件标签:if、choose
迭代标签:forEach
1、通用标签
1、out:计算表达式并将结果输出显示
<c:out value="value" default="default" escapeXml="true|false"/>
value:需要输出显示的表达式
default:默认输出显示的值,如果value的值为null,则输出default的值
escapeXml:是否对输出的内容进行转义
提示:使用<c:out> 标签输出显示前,需要先将数据放到作用域内
<%
User user = new User();
request.setAttribute("user", user);
%>
<c:set target="${user}" property="name" value="defaultName " />
<c:out value="${user.name}" default="noUserName" />
转义特殊字符
<p>${"<a href='http://www.baidu.com'>百度</a>"}</p>
<p>
<c:out escapeXml="Y" value="<a href='http://www.baidu.com'>百度</a>"/>
</p>
<c:out value="<a href='http://www.baidu.com'>百度</a>"/>
2、set:设置指定范围内的变量值
1、将value值存储到范围为scope的变量variable中
<c:set var="variable" value=" v " scope=" scope "/>
var:变量的名称
value:变量的值
scope:变量存在的作用域范围
2、将value值设置到对象的属性中
<c:set value="value" target="target" property="property" />
value:属性的值
target:对象的名称
property:对象的属性名称
<%
User user = new User();
request.setAttribute("user", user);
%>
<c:set target="${user}" property="name" value="defaultName " />
3、remove:删除指定范围内的变量
<c:remove var="name" scope="scope" />
var:变量的名称
scope:变量存在的作用域范围
<body>
<!-- 设置之前应该是空值 -->
设置变量之前的值是:msg=<c:out value="${msg}" default="null"/>
<!-- 给变量msg设值 使用set属性进行赋值 -->
<c:set var="msg" value="Hello ACCP!" scope="page"></c:set>
<!-- 此时msg的值应该是上面设置的"已经不是空值了" 使用out属性输出显示-->
设置新值以后:msg=<c:out value="${msg}"></c:out><br>
<!-- 把 msg变量从page范围内移除 使用remove属性移除-->
<c:remove var="msg" scope="page"/>
<!-- 此时msg的值应该显示null -->
移除变量msg以后:msg=<c:out value="${msg}“ default="null">
</c:out>
</body>
通用标签的使用:
引入使用核心标签的指令
<%@ taglib uri="http://java.sun.com/jsp/jstl/core" prefix="c"%>
<body>
set 标签用于给变量设置值和作用范围
scope= "page|request|session|application"
<c:set var= "example" value="${100+1}" scope="session" />
out 标签在页面上显示信息或变量值
<c:out value="${example}"/>
remove 标签用于删除作用域内的变量
<c:remove var= "example" scope="session"/>
</body>
set标签与remove 标签中的var属性和property属性不接受动态的值
2、条件标签与迭代标签
1、if(条件标签):实现Java语言中if语句的功能
<c:if test="codition" var="name" scope="applicationArea" >
…
</c:if>
判断登录:
<body>
<c:set var="isLogin" value="${empty sessionScope.user}"/>
<c:if test="${isLogin}">
…登录表单
</c:if>
<c:if test="${! isLogin}">
已经登录!
</c:if>
</body>
2、choose(条件标签):实现Java语言中if-else if-else语句的功能
<c:choose var="varName" scope="scope">
<c:when test="condition1">
主体内容
</c:when>
<c:when test="condition2">
主体内容
</c:when>
<c:otherwise>
主体内容
</c:otherwise>
</c:choose >
3、 forEach(迭代标签):实现对集合中对象的遍历
通过迭代标签显示商品列表:
<%
List products = GoodsDao.getAllProducts();
request.setAttribute("products", products);
%>
…
<!-- 循环输出商品信息 -->
<c:forEach var="product" items="${requestScope.products}" 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>
通过迭代标签遍历Map:
<%
Map<String,String> map=new HashMap<String,String>();
map.put("tom", "美国");
map.put("lily", "英国");
map.put("jack","中国");
request.setAttribute("map", map);
%>
<c:forEach var="entry" items="${map}">
${entry.key}
${entry.value}<p>
</c:forEach>
forEach:指定迭代的次数
<c:forEach begin="start" end="end" step="count">
…循环体代码…
</c:forEach>
<c:forEach begin="1" end="5" step= "2">
<c:out value="*"></c:out>
</c:forEach>
3、使用JSTL构造URL
超链接是Web应用中最常用的功能,在JSTL中也提供了相应的标签来完成超链接的功能,
这些标签包括<c : url />、<c : param />、<c : import />
1、url
根据URL规则创建一个URL
<c : url />
<c:url value="value" >
<--
value:需要构造的URL,可以是相对路径,也可以是绝对路径
-->
2、param
用来为URL附加参数
<c : param/>
在Web应用中,超链接在实现页面跳转的同时有时候还需要进行数据的传递、JSTL同样也提供了相应的标签来支持超链接的参数设置,这个标签就是<c : param/>
<c:param name="name" value="value" />
<--
name:参数的名称
value:参数的值
-->
<c:url var="bookUrl" value="bookListServlet.do">
<c:param name="typeId" value="${fy.query.typeId }"></c:param>
<c:param name="bookName" value="${fy.query.bookName }"></c:param>
<c:param name="birDateStart">
<fmt:formatDate value="${fy.query.birDateStart }" pattern="yyyy-MM-dd" />
</c:param>
<c:param name="birDateEnd">
<fmt:formatDate value="${fy.query.birDateEnd }" pattern="yyyy-MM-dd" />
</c:param>
</c:url>
<a href="${bookUrl }&page=1">首页</a>
3、import
<c : import />
在页面中导入一个基于URL的资源,这个标签的资源与<jsp : include >动作元素类似,区别在于使用<c : import />标签不仅可以导入同一个Web应用程序下的资源,还可以导入不同Web应用程序下的资源。
<c : import url="URL" />
<--
url:导入资源的URL路径
-->
4、使用JSTL格式化日期显示
<fmt : format />
Java中日期格式化可以用SimpleDateFormat来实现
new SimpleDateFormat("yyyy-MM-dd").parse(new Date());
JSTL中可以使用格式化标签<fmt : format />标签来完成
<--
首先添加国际化格式标签
-->
<%@ taglib prefix="fmt" uri="http://java.sun.com/jsp/jstl/fmt"%>
<fmt:formatDate value="${fy.query.birDateEnd }" pattern="yyyy-MM-dd HH:mm:ss" />
<--
value:时间对象
pattern:显示格式
-->