JSP day02

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中获取数据

语法:${作用域标识.命名属性名}// 从特定的作用域中获取数据

作用域作用域标识
pageContextpageScope
requestrequestScope
sessionsessionScope
applicationapplicationScope
<%
		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表达式的运算符

  1. 数学运算符

    ​ + - * / %

  2. 比较运算符

    ​ > < >= <= == !=

    注意:el表达式中==和!=是根据内容进行判断,而非地址

  3. 逻辑运算符

    ​ && || !

  4. 三目运算符

    ​ boolean值 ? 值1:值2

  5. 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的使用步骤:

  1. 导入jar包

    将 jstl-1.2.jar 复制到WEB-INF/lib目录里

  2. 在页面导入jstl标签库 (类似于在Java中导包)

    <%@ taglib uri="jstl标签库标识" prefix="前缀" %>
    

    示例:导入jstl的core核心标签库

    <%@ taglib uri="http://java.sun.com/jsp/jstl/core" prefix="c" %>
    
  3. 在页面使用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

重点:

  1. el表达式从作用域中获取数据
  2. el表达式获取当前项目名
  3. 掌握if标签
  4. 掌握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

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值