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);
    }
}
posted @ 2022-09-08 16:56  贵妃就是贵妃  阅读(27)  评论(0编辑  收藏  举报