JSP day02
1 JSP技术的发展趋势
之前我们掌握的JSP技术(JSP脚本)的问题:
- 还不够简单(展示数据仍需要大量的java代码)
- 复杂页面开发更为困难
- 对前端人员不友好(java代码和html标签混用)
JSP的发展趋势:简单化、去脚本化。JSP推荐我们使用***el表达式+jstl标签***替换jsp脚本,这也是当前开发JSP的主流技术组合。
2 EL表达式
el表达式作用:用于从作用域中获取数据,并输出到页面,替换输出脚本
2.1 el从作用域获取简单数据[重点]
简单数据:基本类型+String类型
语法: ${命名属性名字} //默认按作用域范围从小到大搜索
<%
//pageContext.setAttribute("name", "pageContext");
// request.setAttribute("name","request");
//session.setAttribute("name","session");
application.setAttribute("name","application");
%>
${name}//从pageContext-->application中获取数据
语法:${作用域标识.命名属性名}// 从特定的作用域中获取数据
作用域 | 作用域标识 | |
---|---|---|
pageContext | pageScope | |
request | requestScope | |
session | sessionScope | |
application | applicationScope |
<%
pageContext.setAttribute("name", "pageContext");
request.setAttribute("name","request");
session.setAttribute("name","session");
application.setAttribute("name","application");
%>
${pageScope.name }<br/>
${requestScope.name }<br/>
${sessionScope.name }<br/>
${applicationScope.name }
2.2 el从作用域获取复杂数据[重点]
复杂数据:自定义对象类型
语法:${作用域标识.命名属性名.子属性名}
注意:一旦写错属性名,访问会出现异常
javax.el.PropertyNotFoundException: Property [id] not found on type [com.baizhiedu.entity.User]
示例:
<%
Address addr = new Address("郑州","文化路");
User u = new User(1,"xiaohei","123456",addr);
pageContext.setAttribute("user",u);
%>
${pageScope.user.userId }
${pageScope.user.username }
${pageScope.user.password }
<hr/>
${pageScope.user.addr.city }<br/>
${pageScope.user.addr.street }
el表达式 .属性 的底层:
.属性本质上调用属性的get方法。.属性根本不看对象有无属性,关键看有无对应的get方法
2.3 El表达式的运算符
-
数学运算符
+ - * / %
-
比较运算符
> < >= <= == !=
注意:el表达式中==和!=是根据内容进行判断,而非地址
-
逻辑运算符
&& || !
-
三目运算符
boolean值 ? 值1:值2
-
empty
${empty 命名属性名 } //判断数据是否为空
注意:String类型的数据,如果为null或者空串结果都为true
3 El表达式中的内置对象
el表达式内置对象:在el表达式中可以直接使用,无需手动创建的对象
3.1 pageContext[重点]
el中的pageContext和jsp中的pageContext类型不同,不是同1个对象,el中pageContext的底层依赖于jsp中的pageContext。
作用:可以获取jsp中的8个内置对象
${pageContext.request }<br/>
${pageContext.response }<br/>
${pageContext.session }<br/>
${pageContext.servletContext }<br/>
${pageContext.page }<br/>
${pageContext.out }<br/>
${pageContext.exception }<br/>
${pageContext.servletConfig }
典型应用:
//获取当前应用的项目名[重点]
Servlet: request.getContextPath();
el: ${pageContext.request.contextPath}
3.2 param
作用:用来在jsp页面获取请求中携带的数据(等同于servlet收参)。
语法:${param.参数名}
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-En6Qussw-1631154440740)(JSP day02.assets/image-20210530220739888.png)]
3.3 cookie
作用:获取请求携带的cookie。
语法:${cookie.cookie的name}
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-hqdoXQFK-1631154440745)(JSP day02.assets/image-20210530221441406.png)]
4 JSTL(Java Server Pages Standarded Tag Library)
JSTL:JSP标准标签库,和el表达式配合在页面上输出数据。
JSTL的使用步骤:
-
导入jar包
将 jstl-1.2.jar 复制到WEB-INF/lib目录里
-
在页面导入jstl标签库 (类似于在Java中导包)
<%@ taglib uri="jstl标签库标识" prefix="前缀" %>
示例:导入jstl的core核心标签库
<%@ taglib uri="http://java.sun.com/jsp/jstl/core" prefix="c" %>
-
在页面使用jstl标签库
<前缀:标签名 属性="属性值"></前缀:标签名>
示例:使用core标签库
<c:if></c:if>
4.1 输出单个数据
直接使用el表达式
4.2 有条件的输出数据
4.2.1 if标签
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-oXPUXkEL-1631154440747)(JSP day02.assets/image-20200209161159786.png)]
注意:core标签库中没有if else标签
4.2.2 choose-when标签
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-MR2OCeyb-1631154440750)(JSP%20day02.assets/image-20210608153650089.png)]
4.3 输出多个数据(数组|集合)
4.3.1 遍历数组、List和Set
遍历数组
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-xkEH9Xmd-1631154440751)(JSP day02.assets/image-20200209163614969.png)]
<%
Address[] addrs = {new Address("郑州","文化路"),
new Address("武汉","电商路"),
new Address("北京","长安街")};
pageContext.setAttribute("addrs", addrs);
%>
<c:forEach var="a" items="${pageScope.addrs }">
${a.city} ${a.street }<br/>
</c:forEach>
遍历List
<%
List<Address> list2 = new ArrayList<>();
list2.add(new Address("郑州","文化路"));
list2.add(new Address("武汉","电商路"));
list2.add(new Address("北京","长安街"));
pageContext.setAttribute("list2",list2);
%>
<c:forEach var="a" items="${pageScope.list2 }">
${a.city } ${a.street }<br/>
</c:forEach>
遍历Set
<%
Set<Address> set = new HashSet<>();
set.add(new Address("郑州","文化路"));
set.add(new Address("武汉","电商路"));
set.add(new Address("北京","长安街"));
pageContext.setAttribute("set", set);
%>
<c:forEach var="a" items="${pageScope.set }">
${a.city } ${a.street }<br/>
</c:forEach>
小结:数组、List、Set遍历方式没有区别
4.3.2 遍历Map
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-sR31pd05-1631154440752)(JSP day02.assets/image-20200209171842646.png)]
4.3.3 下标循环
<!--
var 变量名
begin 变量起始值
end 变量截至值
step 变量自增大小
varStatus 变量状态
index 遍历时的下标
count 遍历时的次数
first 判断当前是否是第1次循环
last 判断当前是否是最后1次循环
-->
<c:forEach var="i" begin="0" end="9" step="1" varStatus="vs">
${i } ${vs.index } ${vs.count } ${vs.first } ${vs.last }<br/>
</c:forEach>
4.4 格式化标签库
引入格式化标签库:
<%@ taglib uri="http://java.sun.com/jsp/jstl/fmt" prefix="fmt" %>
格式化输出日期
<%
java.util.Date date = new java.util.Date();
pageContext.setAttribute("now",date);
%>
<fmt:formatDate value="${pageScope.now }" pattern="yyyy-MM-dd HH:mm:ss"/>
5 使用EL和JSTL代替JSP脚本
学习完EL和JSTL后,jsp中不允许在出现任何一行java脚本。
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-KCRWM6t5-1631154440754)(JSP day02.assets/image-20210530223213154.png)]
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-RXKWijvE-1631154440755)(JSP day02.assets/image-20210530223246072.png)]
- 项目名使用${pageContext.request.contextPath}获取
- 回显数据使用el表达式+jstl
重点:
- el表达式从作用域中获取数据
- el表达式获取当前项目名
- 掌握if标签
- 掌握forEach遍历数组、list和set
MM-dd HH:mm:ss"/>
## 5 使用EL和JSTL代替JSP脚本
学习完EL和JSTL后,jsp中不允许在出现任何一行java脚本。
[外链图片转存中...(img-KCRWM6t5-1631154440754)]
[外链图片转存中...(img-RXKWijvE-1631154440755)]
- 项目名使用${pageContext.request.contextPath}获取
- 回显数据使用el表达式+jstl
重点:
1. el表达式从作用域中获取数据
2. el表达式获取当前项目名
3. 掌握if标签
4. 掌握forEach遍历数组、list和set