2022-09-02 第六小组 张宁杰 EL&JSTL&分页查询
一,JSP
JSP(全称Java Server Pages),运行在服务端的语言
<%
// java 代码
%>
1. JSP 脚本只能有 java 代码,在访问 JSP 时, JSP 引擎翻译 JSP 页面中的脚本
2. JSP 脚本片段中的 java 代码必须严格遵守 java 的规则
3. 一个 JSP 页面可以有多个脚本片段
4. 多个脚本中的片段中的代码可以互相访问
JSP 生命周期
- 编译阶段
- 初始化阶段
- 执行阶段
- 销毁阶段
JSP 和 servlet区别
1. JSP 本身是一个 servlet
2. JSP 侧重于试图展示, servlet 侧重于逻辑处理
3. 现有的 servlet ,后有的 JSP
JSP 表达式
<% int num = 1; %>
<%= num %>
JSP 声明片段
<%!
int x = 10;
public void fun(){
}
%>
<%-- 注释 --%>
JSP 标签
1. 内置标签
- jsp:include:引入指定页面
- jsp:forward:转发页面
- jsp:param:传参数
<jsp:include page="hello.jsp"></jsp:include>
<jsp:forward page="hello.jsp></jsp:forward>
2. JSTL 标签,需要导入 JSTL 标签
3. 自定义标签
JSP 指令标签
指令 | 描述 |
---|---|
<%@ page ... %> | 定义页面的依赖属性,比如脚本语言、error页面、缓存需求等等 |
<%@ include ... %> | 包含其他文件 |
<%@ taglib ... %> | 引入标签库的定义,可以是自定义标签 |
JSP 的 include 标签和 include 指令的区别
include 标签:先把要引入的页面编译,再合并
include 指令:先把要引入的页面合并,再编译
JSP 的四大作用域
1. 当前页(pageContext):一个属性只能在一个页面种获取
2. 一次请求(request):一个页面中设置的属性,范围是一次请求
3. 一次会话(session):一个会话中的属性,只要页面不关闭,都能获取到
4. 整个 web 应用(application):在这个服务器上,当前项目下的任何一个
@Override
protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
/*
pageContext--PageContext
* request------HttpServletRequest
* session------HttpSession
* application--ServletContext
* */
System.out.println(req.getAttribute("request"));
System.out.println(req.getSession().getAttribute("session"));
System.out.println(req.getServletContext().getAttribute("application"));
}
<%
pageContext.setAttribute("pageContext","pageContext");
request.setAttribute("request","request");
session.setAttribute("session","session");
application.setAttribute("application","application");
%>
<h1>pageContext:<%= pageContext.getAttribute("pageContext")%></h1>
<h1>request:<%= request.getAttribute("request")%></h1>
<h1>session:<%= session.getAttribute("session")%></h1>
<h1>application:<%= application.getAttribute("application")%></h1>
<jsp:forward page="jsp04_copy.jsp"></jsp:forward>
<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<html>
<head>
<title>Title</title>
</head>
<body>
<h1>jsp05</h1>
<h1>pageContext:<%= pageContext.getAttribute("pageContext")%></h1>
<h1>request:<%= request.getAttribute("request")%></h1>
<h1>session:<%= session.getAttribute("session")%></h1>
<h1>application:<%= application.getAttribute("application")%></h1>
</body>
</html>
JSP 的九大内置对象
通俗说法:不需要创建,直接能用
对象 | 描述 |
---|---|
request | HttpServletRequest类的实例 |
response | HttpServletResponse类的实例 |
out | PrintWriter类的实例,用于把结果输出至网页上 |
session | HttpSession类的实例 |
application | ServletContext类的实例,与应用上下文有关 |
config | ServletConfig类的实例 |
pageContext | PageContext类的实例,提供对JSP页面所有对象以及命名空间的访问 |
page | 类似于Java类中的this关键字 |
exception | exception 类的对象,代表发生错误的 JSP 页面中对应的异常对象 |
二,错误转发
<error-page>
<error-code>500</error-code>
<location>/500.html</location>
</error-page>
<error-page>
<exception>java.lang.NullPointException</exception>
<location>/空指针.html</location>
</error-page>
三,EL 表达式
EL 全名为Expression Language。主要用于
- 获取数据
- 执行运算
- 获取 web 开发常用对象
- 调用 java 方法
<%
request.setAttribute("name","zhangsan");
session.setAttribute("name","lisi");
pageContext.setAttribute("age",30);
%>
<%-- <input type="text" value="<%= request.getAttribute("name1") == null ? "" : request.getAttribute("name1")%>">--%>
<input type="text" value="${sessionScope.name}">
<hr>
${age eq 1}
<hr>
取参数:${param.username},${paramValues.hobby},${initParam.password}
EL表达式的缺陷:
1、只能读,不能写
2、不支持流程控制语句
EL表达式的内置作用域对象 pageContext requestScope sessionScope applicationScope
四,JSTL
JSP标准标签库(JSTL)是一个JSP标签集合,它封装了JSP应用的通用核心功能。
先引用
<%@ taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core" %>
标签 | 描述 |
---|---|
<c:out> | 用于在JSP中显示数据,就像<%= ... > |
<c:set> | 用于保存数据 |
<c:remove> | 用于删除数据 |
<c:catch> | 用来处理产生错误的异常状况,并且将错误信息储存起来 |
<c:if> | 与我们在一般程序中用的if一样 |
<c:choose> | 本身只当做<c:when>和<c:otherwise>的父标签 |
<c:when> | <c:choose>的子标签,用来判断条件是否成立 |
<c:otherwise> | <c:choose>的子标签,接在<c:when>标签后,当<c:when>标签判断为false时被执行 |
<c:import> | 检索一个绝对或相对 URL,然后将其内容暴露给页面 |
<c:forEach> | 基础迭代标签,接受多种集合类型 |
<c:forTokens> | 根据指定的分隔符来分隔内容并迭代输出 |
<c:param> | 用来给包含或重定向的页面传递参数 |
<c:redirect> | 重定向至一个新的URL. |
<c:url> | 使用可选的查询参数来创造一个URL |
案例:
<%-- 向指定的作用域中设置值 --%>
<c:set scope="session" var="name" value="zhangsan"></c:set>
<c:set scope="session" var="age" value="20"></c:set>
${sessionScope.name}
<hr>
<c:if test="${sessionScope.age >= 18}">可以观看!</c:if>
<c:if test="${sessionScope.age < 18}">禁止观看!</c:if>
<hr>
<c:choose>
<c:when test="${sessionScope.age eq 18}">
你已经年满18岁,可以签署劳动合同了!
</c:when>
<c:when test="${sessionScope.age lt 18}">
你好没有满18岁!
</c:when>
<c:otherwise>
你已经是大人了!!!
</c:otherwise>
</c:choose>
<hr>
<c:forEach begin="1" end="10" step="2" var="i" varStatus="stat">
${i} ----- ${stat.first} <br>
</c:forEach>
五,JSP 和 JSTL 分页查询案例
<%--
Created by IntelliJ IDEA.
User: Administrator
Date: 2022/8/31
Time: 16:19
To change this template use File | Settings | File Templates.
--%>
<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<%@ taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core" %>
<html>
<head>
<title>Title</title>
</head>
<body>
<%--
分页查询:
1、总记录数
2、总页数
3、每页显示的记录数
4、每页展示的数据集合
5、导航栏的页码 【1,2,3,4,5】
6、是否是第一页
7、是否是最后一页
8、当前页
--%>
<h1><a href="${pageContext.request.contextPath}/page.do?pagenum=1">加载分页导航</a></h1>
当前页:【${requestScope.pagenum}】,总页数【${requestScope.pageCount}】
<hr>
<c:if test="${requestScope.pagenum ne 1}">
<a href="${pageContext.request.contextPath}/page.do?pagenum=1">首页</a>
<a href="${pageContext.request.contextPath}/page.do?pagenum=${requestScope.pagenum - 1}">上一页</a>
</c:if>
<c:if test="${requestScope.pagenum eq 1}">
<span>首页</span>
<span>上一页</span>
</c:if>
<c:forEach begin="1" end="${requestScope.pageCount}" var="i">
<c:if test="${requestScope.pagenum eq i}">
<span>${i}</span>
</c:if>
<c:if test="${requestScope.pagenum ne i}">
<a href="${pageContext.request.contextPath}/page.do?pagenum=${i}">${i}</a>
</c:if>
</c:forEach>
<c:if test="${requestScope.pagenum ne requestScope.pageCount}">
<a href="${pageContext.request.contextPath}/page.do?pagenum=${requestScope.pagenum + 1}">下一页</a>
<a href="${pageContext.request.contextPath}/page.do?pagenum=${requestScope.pageCount}">尾页</a>
</c:if>
</body>
</html>
package com.jsoft2;
import javax.servlet.*;
import javax.servlet.http.*;
import javax.servlet.annotation.*;
import java.io.IOException;
import java.util.Objects;
@WebServlet(name = "PageServlet", value = "/page.do")
public class PageServlet extends HttpServlet {
@Override
protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
String pagenumStr = request.getParameter("pagenum");
Integer pagenum = 1;
Integer pageCount = 20;
try{
if(Objects.nonNull(pagenumStr)){
pagenum = Integer.parseInt(pagenumStr);
}
if(pagenum <= 0){
pagenum = 1;
}
if(pagenum > 20){
pagenum = 20;
}
} catch (Exception e){
pagenum = 1;
}
request.setAttribute("pagenum",pagenum);
request.setAttribute("pageCount",pageCount);
request.getRequestDispatcher("jsp/page.jsp").forward(request,response);
}
}