作用: 替换java脚本, 配合EL标签式,
执行在服务器端执行, 把jstl执行之后的结果响应给客户端浏览器,
JSTL标签在Html标签之前执行
使用步骤:
1.导入jstl依赖:
2.在使用jstl标签的jsp页面, 使用 taglib指令,导入标签库
<%@taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core" %>
prefix: 前缀, 任意取名, 规范名: core标签库: c 比如:
<c:div>
使用前缀区分html标签core所有的标签名:
<c:标签名>
uri: 对应jstl标签的url, 固定写法, 导入jstl标签库, 选择的是 jsp/jstl的标签库
3.直接使用jstl标签,
if标签:
<c:if test="条件"> </c:if>
没有else标签,没有else if标签
choose标签:
<c:choose> <c:when test="${score >= 90}"> <p>优秀</p> </c:when> <c:when test="${score >= 80}"> <p>良好</p> </c:when> <c:when test="${score >= 60}"> <p>及格</p> </c:when> <c:otherwise> <p>不及格</p> </c:otherwise> </c:choose>
foreach标签: for循环
fori循环:
<c:forEach var="i" begin="0" end="9" step="2"> <h1>${i}</h1> </c:forEach>
增强for循环:
<c:forEach var="admin" items="${admins}"> <tr> <th>${admin.id}</th> <th>${admin.username}</th> <th>${admin.password}</th> </tr> </c:forEach>
for循环: 有一个varStatus="变量" , 得到for循环的循环状态对象
forEach标签还有一个属性:varStatus,这个属性用来指定接收“循环状态”的变量名,例如:<forEach varStatus=”vs” …/>,这时就可以使用vs这个变量来获取循环的状态了。
count:int类型,当前以遍历元素的个数; 第几次循环,从1开始
index:int类型,当前元素的下标; 从0开始
first:boolean类型,是否为第一个元素;
last:boolean类型,是否为最后一个元素;
分页查询 重要
分页查询的后台实现:
前端传递请求参数:
1.页码 数字
2.每页显示多少行 数字 (有的项目可以不需要传递, 后台给的默认值)
响应给前端的数据:
-
总记录数: 查询总条数 sql语句: select count(1) ...
-
当前页码: 当前显示第几页 请求参数
-
总页数: 计算出来, 根据总记录数与页容量求出的
-
总页数 = 总记录数%页容量==0?总记录数/页容量:总记录数/页容量+1
-
-
页容量: 每页显示多少行 请求参数
-
当前页记录(集合), 当前页显示的数据: sql: select * from... limit 序号,页容量
java面向对象, 封装, 把5个数据封装成一个对象: 分页实体类 Page
序号 = (页码 -1) * 页容量
sql语句:
select count(1) ...
select * from... limit 序号,页容量
注意: Dao类的一个方法控制在只执行一条sql语句
<div>
<nav aria-label="Page navigation">
<ul class="pagination">
<c:if test="${pb.currentPage == 1}">
<li class="disabled">
<span aria-hidden="true">«</span>
</li>
</c:if>
<c:if test="${pb.currentPage != 1}">
<li>
<a href="${pageContext.request.contextPath}/user/queryByPage?currentPage=${pb.currentPage - 1}" aria-label="Previous">
<span aria-hidden="true">«</span>
</a>
</li>
</c:if>
<c:forEach begin="1" end="${pb.totalPages}" var="i" >
<c:if test="${pb.currentPage == i}">
<li class="active"><span>${i}</span></li>
</c:if>
<c:if test="${pb.currentPage != i}">
<li><a href="${pageContext.request.contextPath}/user/queryByPage?currentPage=${i}">${i}</a></li>
</c:if>
</c:forEach>
<!--如果当前页 == 总页数 -->
<c:if test="${pb.currentPage == pb.totalPages}">
<li class="disabled">
<span aria-hidden="true">»</span>
</li>
</c:if>
<!--如果当前页 < 总页数 -->
<c:if test="${pb.currentPage < pb.totalPages}">
<li>
<a href="${pageContext.request.contextPath}/user/queryByPage?currentPage=${pb.currentPage + 1}" aria-label="Next">
<span aria-hidden="true">»</span>
</a>
</li>
</c:if>
<span style="font-size: 25px;margin-left: 5px;">
共${pb.count}条记录,共${pb.totalPages}页
</span>
</ul>
</nav>
</div>
高级查询(动态条件查询)带分页 必须掌握
前端条件是一个动态组合, 可能没有条件, 可能有五个条件,可能一个条件, 可能二个,可能三个...
后台接收这些条件, sql语句的条件动态的
根据条件查询的时候, 很多数据,使用分页, 当点击其他页码, 条件存在()
前端的页面改造
之前点击页码, 使用超链接直接发送请求给后台, 无条件查询表单无关系
修改之后: 点击页码,把点击页码值保存到查询表单中, 提交查询表单
//分页查询
function query(currentPage){
//console.log(currentPage);
//给查询表单的隐藏域赋值
$("#currentPageInput").val(currentPage);
//提交查询表单
$("#queryForm").submit();
}
动态sql:
根据UserCondition的对应属性的值是否有数据,有数据,添加条件, 没有: 不添加
java中sql语句: 字符串, 最终做字符串的拼接