🙈作者简介:练习时长两年半的Java up主
🙉个人主页:老茶icon
🙊 ps:点赞👍是免费的,却可以让写博客的作者开兴好久好久😎
📚系列专栏:Java全栈,计算机系列(火速更新中)
💭 格言:种一棵树最好的时间是十年前,其次是现在
🏡动动小手,点个关注不迷路,感谢宝子们一键三连
目录
课程名:Java
内容/作用:知识点/设计/实验/作业/练习
学习:Java
续前章内容:在线图书商城
续前章内容:在线图书商城
环境与设备
1.软件:IntelliJ IDEA 2022.3.2
2.环境:Windows 11 and JDK 11
内容:
EL
Expression Language 表达式语言
是为了使JSP中的输出写起来更加简便,替换JSP中的<%=%>,即表达式。
主要输出保存在某个作用域中的数据。
特点
-
减少代码(获取对象、转换对象、获取对象属性)
-
如果通过"某个作用域对象.setAttribute(String str,Object obj)"方法保存的对象,
在JSP页面中,如果用表达式,写为<%=str>;如果使用EL,写为${str}。
会依次从pageContext–>request–>session–>application中获取指定对象,如果一旦从某个作用域中获取到了对象,就不再判断后续作用域。
也可以指定从某个作用域中获取对象,如${session.str}表示从session作用域中获取对象。
-
-
免去非空判断
- 如果要使用的某个对象不存在,不会输出null,而是输出空字符串""
使用
1.获取保存在作用域中的对象
-
获取保存在某个作用域中的对象:${对象名}
-
从指定的作用于中获取对象
作用域单词 对应作用域 代码 pageScope 当前页pageContext ${pageScope.对象} requestScope 请求request ${requestScope.对象} sessionScope 会话session ${sessionScope.对象} applicationScope 项目application ${applicationScope.对象} -
输出对象的属性
${对象名.属性名} ${对象名["属性名"]} 要保证该属性有对应的get方法
-
输出对象的方法返回值
${对象名.方法名()}
举例
//在servlet中,将一个集合保存在请求对象request中
//Person有name、sex和age属性
Person p1 = new Person("a","男",20);
Person p2 = new Person("b","男",20);
Person p3 = new Person("c","女",20);
List list = new ArrayList();
list.add(p1);
list.add(p2);
list.add(p3);
req.setAttribute("list",list);
使用请求转发跳转到页面中
<!--传统JSP中的表达式-->
<%
List list = (List)request.getAttribute("list");
//需要获取、转换后才能遍历使用
%>
<table>
<%
for(Object obj in 集合){
%>
<td><%=obj.get属性()%></td>
<%
}
%>
</table>
<!--使用EL和JSTL后-->
<table>
<c:forEach items="${list}" var="p">
<!--使用EL-->
<td>${p.name}</td>>
<td>${p.sex}</td>>
<td>${p.age}</td>>
</c:forEach>
</table>
2.用户获取当前项目上下文路径(根目录+项目名)
如http://localhost:8080/book_shop是一个项目上下文路径。
在JSP中使用**${pageContext.request.contextPath}**获取项目上下文路径
<form action="${pageContext.request.contextPath}/book?op=xxx"></form>
<a href="${pageContext.request.contextPath}/book?op=xxx"></a>
<img src="${pageContext.request.contextPath}/pages/imgs/xxx.jpg">
<script>
$.ajax({
url:"${pageContext.request.contextPath}/book?op=xxx"
});
</script>
3.在页面中获取请求中携带的参数
可以使用EL获取表单提交或地址中?后传递的数据
使用**${param.参数}**表示request.getParameter(“参数”)方法获取的数据
如
<form action="xxx.jsp">
<input type="text" name="username">
<input type="submit">
</form>
<a href="xxx.jsp?username=admin"></a>
在xxx.jsp中
${param.username}获取提交的数据
注意
-
web.xml版本在4.0之后,在JSP中使用EL时,默认可以识别。
-
如果JSP中无法识别EL,原样输出${}符号时,在指令(<%@ %>)中加入 isELIgnored=“false” 表示不忽略EL
<%@ page contentType="text/html;charset=UTF-8" language="java" isELIgnored="false"%>
-
如果在使用EL的过程中,出现PropertyNotFoundException异常,表示未发现指定属性,原因有
- 缺少指定属性
- 指定属性没有对应的get方法
JSTL
Java Server Page Standarded Tag Library JSP标准标签库
可以使用JSTL中的特定标签,来替换JSP中常见的java代码,如循环判断等。减少JSP中的java代码,提高页面的可读性。
使用
-
导入jstl依赖
<!-- jstl --> <dependency> <groupId>javax.servlet</groupId> <artifactId>jstl</artifactId> <version>1.2</version> </dependency>
-
在JSP页面中,加入标签库指令
<!--在当前页面中使用jstl,以c为标签前缀--> <%@ taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core" %>
这句话可以在使用循环时自动生成
-
具体使用
-
定义变量或给变量赋值
<c:set var="变量名" value="值"></c:set> <c:set var="name" value="admin"></c:set>
-
if判断
<c:if test="判断条件"> 满足时执行 </c:if> session.setAttribute("user",用户对象); <c:if test="${empty user}"> <span>请登录</span> </c:if> <c:if test="${!empty user}"> <span>${user.username}</span> </c:if>
-
遍历List集合
//如在servlet中,将查询到的集合保存在request对象中 request.setAttribute("list",查询到的集合) <table> <!--<c:forEach items="要遍历的集合" var="遍历出的每个对象">--> <c:forEach items="${list}" var="obj"> <tr> <td>${obj.属性}</td> </tr> </c:foreach> </table>
-
遍历Map集合
<% HashMap<String,String> hm = new HashMap(); hm.put("yyds","永远单身"); hm.put("awsl","阿伟死了"); hm.put("u1s1","有一说一"); application.setAttribute("hm",hm); %> <c:forEach items="${hm}" var="kv"> <%--${键值对.key} 获取键 ${键值对.value} 获取值 --%> <h2>${kv.key}--${kv.value}</h2> </c:forEach>
-
使用JSTL和EL输出购物车中的信息
<%@ taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core" %>
<%@ page import="com.hqyj.book_shop.util.Cart" %>
<%@ page import="com.hqyj.book_shop.entity.BookInfo" %>
<%@ page import="java.util.HashMap" %>
<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<html>
<head>
<title>Title</title>
<style>
* {
margin: 0;
padding: 0;
}
body {
background-color: #f5f5f5;
}
.main {
width: 1240px;
height: 628px;
margin: 20px auto 20px;
background-color: #fff;
}
table {
float: left;
width: 600px;
margin-top: 50px;
margin-left: 320px;
border-collapse: collapse;
}
th, td {
width: 120px;
height: 20px;
border: 1px solid skyblue;
}
</style>
</head>
<body>
<jsp:include page="top.jsp"></jsp:include>
<div class="main">
<table>
<tr>
<th>图书编号</th>
<th>图书名称</th>
<th>图书单价</th>
<th>购买数量</th>
<th>小计</th>
<th>操作</th>
</tr>
<c:if test="${empty cart.getCart()}">
<tr>
<td colspan="6">当前购物车中无商品</td>
</tr>
</c:if>
<c:if test="${!empty cart.getCart()}">
<%--定义变量表示总合--%>
<c:set var="sumPrice" value="0"></c:set>
<c:forEach items="${cart.getCart()}" var="kv">
<tr>
<td>${kv.key.bookId}</td>
<td>${kv.key.bookName}</td>
<td>${kv.key.bookPrice}</td>
<td>${kv.value}</td>
<%--el中可以使用算术运算--%>
<td>${kv.key.bookPrice*kv.value}</td>
<td>
<a href="${pageContext.request.contextPath}book?op=remove&bookId=${kv.key.bookId}">移除</a>
</td>
<%--每次循环将小计累加到总价中--%>
<c:set var="sumPrice" value="${sumPrice + kv.key.bookPrice * kv.value}"></c:set>
</tr>
</c:forEach>
<tr>
<td colspan="4">总计</td>
<td>${sumPrice}</td>
<td><a href="${pageContext.request.contextPath}/book?op=clear">清空购物车</a></td>
</tr>
</c:if>
</table>
</div>
</body>
</html>
总结
好好学习,天天向上。
在这里插入代码片
往期专栏 |
---|
Java全栈开发 |
数据结构与算法 |
计算机组成原理 |
操作系统 |
数据库系统 |
物联网控制原理与技术 |