JavaEE学习之走进JSP

引言

1.现有问题

  • 在之前学习Servlet时,服务器端通过Servlet响应给客户端的页面,有什么不足之处?
    • 开发方式麻烦:继承父类,覆盖方法,配置web.xml或注解
    • 代码修改麻烦:重新编译,部署,重启服务
    • 显示方式麻烦:获取流,使用print("");逐行打印
    • 协同开发麻烦:ui负责美化页面,程序员负责编写代码,UI不懂Java,程序员又不能将所有前端页面的内容通过流输出

JSP(Java Servlet Pages)

1.概念

  • 简化的Servlet设计,在HTML标签中嵌套Java代码,用以高效开发Web应用的动态页面

2.作用

  • 替换显示页面部分的Servlet(使用*.jsp文件替换XxxJSP.java)

JSP开发(重点)

1.创建JSP

  • 在web目录下新建*.jsp文件(与WEB-INF平级)

1.1 JSP编写Java代码

<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<html>
<head>
    <title>Title</title>
</head>
<body>
    now:<%=new java.util.Date() %>
</body>
</html>

  • 使用<%= %>标签编写java代码在页面中打印当前系统时间

1.2 访问JSP

  • 在浏览器输入http://ip:port/项目路径/资源名称

2.JSP与Servlet

  • 关系
    • JSP文件在容器中会转换成Servlet执行
    • JSP是对Servlet的一种高级封装。本质还是Servlet
  • 区别
    • 与Servlet相比:JSP可以很方便的编写或者修改HTML网页而不用去面对大量的Println语句
      在这里插入图片描述

JSP实现原理

  • Tomcat会将xxx.jsp转换成java代码进而编译成class文件运行,最终将运行结果通过response响应给客户端
    在这里插入图片描述

1.JSP.java源文件存放目录

  • 使用idea开发工具,Tomcat编译后的jsp文件(Xxx_jsp.class和Xxx_jsp.java)的存放地点:
    在这里插入图片描述

JSP与HTML集成开发

1.脚本

  • 脚本可以编写java语句,变量,方法或表达式

1.1 普通脚本

  • 语法:<% Java代码%>
    • 经验:普通脚本可以使用所有java语法,除了定义函数
    • 注意:脚本与脚本之间不可以嵌套,脚本与HTML标签不可嵌套

1.2 声明脚本

  • 语法:<%!定义变量,函数%>
    • 注意:声明脚本声明的变量是全局变量
    • 声明脚本的内容必须在脚本<% %>中调用
    • 如果声明脚本中的函数具有返回值,使用输出脚本调用<%= %>
<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<html>
<head>
    <title>Title</title>
</head>
<body>
    <%
        int a=10;
        System.out.println("打印在控制台");
        System.out.println(a);
        System.out.println("打印在客户端");
        out.println(a);
    %>
    <%!
        int b=20;
        public void play(){
            System.out.println("play....");
        }
    %>
    <%
        out.println(b);
        play();//调用方法
    %>
</body>
</html>

在这里插入图片描述
在这里插入图片描述

1.3 输出脚本

  • 语法:<%=java表达式 %>
<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<html>
<head>
    <title>Title</title>
</head>
<body>
    <%!
        int a=10;
       public int num(){
           return a;
       }
    %>
    <%=num()%>

</body>
</html>

在这里插入图片描述
- 经验;输出脚本可以输出带有返回值的函数
- 注意:输出脚本中不能加“;”

2.JSP注释

  • jsp注释主要有两个作用:为脚本代码作注释以及HTML内容注释

2.1 语法规则

语法描述
<%–注释–%>JSP注释,注释内容不会被发送至浏览器甚至不会被编译
<!–注释—>HTML注释,通过浏览器查看网页源代码可以看见注释内容

3.JSP指令

  • JSP指令用来设置与整个JSP页面相关的属性
指令描述
<%@ page…%定义页面的依赖属性,比如脚本语言,error语言,缓存需求等等
<%@ include…%包含其他文件
<%@ taglib…%引入标签库的定义,可以是自定义标签

3.1 Page指令

  • 语法:<%@ page attribute1=“value1” attribute2=“value2” %>
  • Page指令为容器提供当前页面的使用说明。一个JSP页面可以包含多个page指令
属性描述
contentType指定当前JSP页面的MIME类型和字符编码格式
error指定当JSP页面发生异常时需要转向的错误处理页面
isErrorPage指定当前页面是否可以作为另一个JSP页面的错误处理页面
import导入需要使用的java类
language定义jsp页面所用的脚本语言,默认是java
session指定jsp页面是否使用session。默认为true立即创建,false为使用创建
pageEncoding指定jsp页面的解码格式
<%@ page contentType="text/html;charset=UTF-8" language="java" errorPage="D.jsp" %>

<html>
<head>
    <title>Title</title>
</head>
<body>
    <%
        int i=1/0;
    %>
</body>
</html>

<%@ page contentType="text/html;charset=UTF-8" language="java" isErrorPage="true" %>
<html>
<head>
    <title>Title</title>
</head>
<body>
    错误!
</body>
</html>

在这里插入图片描述

3.2 include指令

  • 语法:<%@ include file=“被包含的jsp路径”%>
  • 通过include指令来包含其他文件
  • 被包含的文件可以是jsp文件,HTML文件或者文本文件,包含的文件就好像是当前jsp文件的一部分,会被同时编译执行(静态包含)
    在这里插入图片描述
    • 注意:可能会有重名的冲突问题,不建议使用

3.3 taglib指令

  • 语法:<%@ taglib uri=“外部标签库路径” prefix=“前缀”%>
  • 引入jsp的标准标签库
    在这里插入图片描述

4.动作标签

  • 语法:< jsp:action_name attribute=“value”/>
  • 动作标签指的是JSP页面在运行期间的命令

4.1 include

  • 语法:< jsp:inlcude page=“相对url地址” />

  • < jsp:include>动作元素将外部文件输出结果包含在jsp中(动态包含)
    |属性|描述 |
    |–|--|
    |page | 包含在页面中的相对url地址 |
    在这里插入图片描述

    • 注意:前面已经介绍过include指令,他是将外部文件的输出代码复制到了当前的jsp文件中,而这里的jsp:include不同,是将外部文件的输出结果引入到了当前jsp文件中

4.2 useBean

  • 语法:< jsp:useBean id=“name” class=“package.className”/>
  • jsp:useBean动作用来加载一个将在jsp页面中使用的JavaBean
    在这里插入图片描述
  • 在类载入后,我们可以通过jsp:setProperty和jsp:getProperty动作来修改和获取bean属性

4.3 setProperty

  • 可以在jsp:useBean元素之后使用jsp:setProperty进行属性赋值
属性描述
namename属性是必需的,他表示设置属性的是哪个bean
propertyproperty属性是必需的,它表示要设置哪个属性
valuevalue是可选的,该属性用来指定bean属性的值

在这里插入图片描述

4.4 getProperty

  • jsp:getProperty动作提取指定Bean属性的值,转换成字符串,然后输出
属性描述
name要检索的Bean属性名称。Bean必须已定义
property表示要提取Bean的值

在这里插入图片描述

4.5 forward

  • 语法:< jsp:forward page=“相对url地址”/>
  • jsp:forward动作把请求转到另外的页面
属性描述
pagepage属性包含的是一个相对的url

在这里插入图片描述

4.6 param

  • 语法:< jsp:parm name="" value=""/>
  • 在转发动作内部使用,做参数传递
    在这里插入图片描述
<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<html>
<head>
    <title>A页面</title>
</head>
<body>
    <jsp:forward page="B.jsp">
        <jsp:param name="username" value="simon"/>
    </jsp:forward>
</body>
</html>

<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<html>
<head>
    <title>B页面</title>
</head>
<body>
    <%
        String username = request.getParameter("username");
    %>
    <%=username%>
</body>
</html>

在这里插入图片描述

5.内置对象

对象名类型说明
requestjavax.servlet.http.HttpServletRequest
responsejavax.servlet.http.HttpServletResponse
sessionjavax.servlet.http.HttpSession默认session="true"开关
applicationjavax.servlet.ServletContext
configjavax.servlet.ServletConfig
exceptionjava.lang.Throwable默认isErrorPage=“false”开关
outjavax.servlet.jsp.JspWriter
pageContextjavax.servlet.jsp.PageContext
pagejava.lang.Object当前对象this当前servlet实例

5.1 四大域对象

  • JSP有四大作用域对象,存储数据和获取数据的方式一样,不同的是取值的范围有差别
    • pageContext(javax.servlet.jsp.PageContext )当前jsp页面的范围
    • session( javax.servlet.http.HttpSession)一次会话有效(关闭浏览器失效)request( javax.servlet.http.HttpServletRequest )一次请求有效
    • application( javax.servlet.ServletContext|)整个Web应用有效(服务器重启失效)

5.2 pageContext对象

  • pageContext对象是javax.servlet.jsp.PageContext类的实例,拥有作用域,用来代表整个页面
  • 当前页面的作用域对象,一旦跳转则失效
  • 通过setAttribute(“name”,value);存储值
  • 通过getAttribute(“name”);获取值
  • 用于获取其他8个内置对象或者操作其他对象的作用域
    在这里插入图片描述

5.3 pageContext获取其他内置对象

在这里插入图片描述

5.4 pageContext操作其他内置对象的作用域

  • pageContext对象可以操作其他作用域存储和获取
    在这里插入图片描述
<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<html>
<head>
    <title>pageContext对象的作用</title>
</head>
<body>
    <!--获取其他8个内置对象-->
    <%
        pageContext.getRequest();
        pageContext.getResponse();
        pageContext.getException();
        pageContext.getSession();
        pageContext.getOut();
        pageContext.getPage();
        pageContext.getServletContext();
        pageContext.getServletConfig();
    %>
    <!--pageContext操作其他作用域-->
    <%
        pageContext.setAttribute("page","123");//当前jsp页面有效
        pageContext.setAttribute("req","aaa",PageContext.REQUEST_SCOPE);
        pageContext.setAttribute("sess","bbb",PageContext.SESSION_SCOPE);
        pageContext.setAttribute("app","ccc",PageContext.APPLICATION_SCOPE);
        String req = (String) request.getAttribute("req");
        String sess = (String) session.getAttribute("sess");
        String app=(String)application.getAttribute("app");
    %>
<h1>request:<%=req%></h1>
<h1>session:<%=sess%></h1>
<h1>app:<%=app%></h1>
</body>
</html>

在这里插入图片描述

<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<html>
<head>
    <title>pageContext对象的作用</title>
</head>
<body>
    <!--获取其他8个内置对象-->
    <%
        pageContext.getRequest();
        pageContext.getResponse();
        pageContext.getException();
        pageContext.getSession();
        pageContext.getOut();
        pageContext.getPage();
        pageContext.getServletContext();
        pageContext.getServletConfig();
    %>
    <!--pageContext操作其他作用域-->
    <%
        pageContext.setAttribute("page","123");//当前jsp页面有效
        pageContext.setAttribute("req","aaa",PageContext.REQUEST_SCOPE);
        pageContext.setAttribute("sess","bbb",PageContext.SESSION_SCOPE);
        pageContext.setAttribute("app","ccc",PageContext.APPLICATION_SCOPE);
//        String req = (String) request.getAttribute("req");
//        String sess = (String) session.getAttribute("sess");
//        String app=(String)application.getAttribute("app");
        String req = (String) pageContext.getAttribute("req", PageContext.REQUEST_SCOPE);
        String sess = (String) pageContext.getAttribute("sess", PageContext.SESSION_SCOPE);
        Object app = pageContext.getAttribute("app", PageContext.APPLICATION_SCOPE);
        //从pageContext,request,session,application来寻找
        String find = (String) pageContext.findAttribute("app");
    %>
<h1>request:<%=req%></h1>
<h1>session:<%=sess%></h1>
<h1>app:<%=app%></h1>
<h1>find:<%=find%></h1>
</body>
</html>

在这里插入图片描述

EL表达式(Expression Language)

1.概念

  • EL使JSP写起来更简单,简洁,主要用于获取作用域中的数据

2.作用

  • 用于替换作用域对象.getAttribute(“name”)

3.EL的应用(获取基本类型,字符串)

  • {scope.name}获取具体某个作用域中的数据
  • {name}获取作用域中的数据,逐级查找(pageContext,request,session,application)
<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<html>
<head>
    <title>EL表达式</title>
</head>
<body>
    <%
        request.setAttribute("key1","123");
        session.setAttribute("key2","456");
        application.setAttribute("key3","789");
    %>
    <%--通过作用域对象获取--%>
    <h1><%=request.getAttribute("key1")%></h1>
    <h1><%=session.getAttribute("key2")%></h1>
    <h1><%=application.getAttribute("key3")%></h1>
    <hr/>
    <%--通过EL表达式获取数据--%>
    <h1>${requestScope.key1}</h1>
    <h1>${sessionScope.key2}</h1>
    <h1>${applicationScope.key3}</h1>
    <hr/>
    <h1>${key1}</h1>
    <h1>${key2}</h1>
    <h1>${key3}</h1>
</body>
</html>

在这里插入图片描述

3.1 EL和jsp脚本的区别

  • <%=request.getAttribute(“key1”)%><%–没有找到返回null–%>
  • ${requestScope.key1}<%–没有找到返回""–%>

4.EL的应用(获取引用类型)

  • 使用EL获取作用域中的对象代用属性时,只能访问对象的的get方法,必须遵守命名规范定义
<%@ page import="com.ozl.servletProject.entity.Admin" %>
<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<html>
<head>
    <title>EL获取对象</title>
</head>
<body>
    <%
        Admin admin=new Admin("simon","123","123","123");
        request.setAttribute("user1",admin);
    %>
    <h1>${user1.username}</h1>
    <h1>${user1.password}</h1>
    <h1>${user1.phone}</h1>
    <h1>${user1.address}</h1>
</body>
</html>

在这里插入图片描述

5.EL的应用(获取数组,集合的元素)

  • EL可以获取Array,list,map中的元素,set由于没有下标,无法直接访问元素,后续可遍历
<%@ page import="java.util.ArrayList" %>
<%@ page import="java.util.HashMap" %>
<%@ page import="java.util.Map" %>
<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<html>
<head>
    <title>数组,集合的访问</title>
</head>
<body>
    <%
        int[] array=new int[]{1,2,3,4,5};
        request.setAttribute("array",array);

        ArrayList<String> strings = new ArrayList<>();
        strings.add("A");
        strings.add("B");
        strings.add("C");
        request.setAttribute("strings",strings);

        Map<String, String> maps = new HashMap<>();
        maps.put("cn","中国");
        maps.put("usa","美国");
        maps.put("it","意大利");
        request.setAttribute("maps",maps);

    %>
    <%--EL访问数组--%>
    <h1>${array[0]}</h1>
    <h1>${array[1]}</h1>
    <h1>${array[2]}</h1>
    <hr/>
    <%--EL访问Arraylist--%>
    <h1>${strings[0]}</h1>
    <h1>${strings.get(1)}</h1>
    <h1>${strings.get(2)}</h1>
    <hr/>
    <%--EL访问Map--%>
    <h1>${maps.get("cn")}</h1>
    <h1>${maps.it}</h1>
    <h1>${maps["usa"]}</h1>
</body>
</html>

在这里插入图片描述

6.EL的运算符

在这里插入图片描述

7.隐式对象

  • EL表达式语言定义了11个隐式对象
隐含对象描述
pageScopepage作用域
requestScoperequest作用域
sessionScopesession作用域
applicationScopeapplication作用域
paramrequest对象的参数,字符串
paramValuesrequest对象的参数,字符串集合
headerHTTP信息头,字符串
headerValuesHTTP信息头,字符串集合
initParam上下文初始化参数
cookieCookie值
pageContext当前页面的pageContext

7.1 获得应用上下文

<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<html>
<head>
    <title>EL内置对象</title>
</head>
<body>
    <%
        String contextPath = request.getContextPath();
    %>
    <%=contextPath%>
    <br>
    <a href="<%=request.getContextPath()%>/xxxController">Click me</a>
    <a href="${pageContext.request.contextPath}/xxxController">target me</a>

</body>
</html>

在这里插入图片描述

7.2 获取cookie

在这里插入图片描述

在这里插入图片描述

JSTL标准标签库

1.现有问题

  • EL主要是用于作用域获取数据的,虽然可以做运算判断,但是得到的都是一个结果做展示
  • EL不存在流程控制,比如判断
  • EL对于集合只能做单点访问,不能实现遍历操作,比如循环

2.什么是JSTL

  • JSTL:全称Java Server Page Standard Tag Library
  • JSP标准标签库(JSTL)是一个JSP集合

3.JSTL的作用

  • 可对EL获取的数据进行逻辑操作
  • 与EL合作完成数据的展示

4.JSTL的使用

  • 导入两个jar文件standard.jar和jstl.jar文件拷贝到/WEB-INF/lib/下,jstl-1.2.jar 之后不再需要导入standard.jar
  • 在JSP页面引入标签库<% @taglib uri=“http://java.sum.com/jsp/jstl/core” prefix=“c”>

5.核心标签

5.1 条件标签if判断

  • 语法:< c:if test=“条件”></ c:if>
<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<%@ taglib uri="http://java.sun.com/jsp/jstl/core" prefix="c"%>
<html>
<head>
    <title>if</title>
</head>
<body>
    <%
        request.setAttribute("username","tom123");
    %>
    <%--test属性中是条件,但是条件需要EL表达式来书写--%>
    <c:if test="${username=='tom'}">
        <h1>欢迎您${username}</h1>
    </c:if>
    <c:if test="${username!='tom'}">
        <h1>请您重新登录</h1>
    </c:if>
</body>
</html>

在这里插入图片描述

5.2 多条件choose判断

在这里插入图片描述

<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<%@ taglib uri="http://java.sun.com/jsp/jstl/core" prefix="c"%>
<html>
<head>
    <title>if</title>
</head>
<body>
    <%
        request.setAttribute("username","tom123");
        request.setAttribute("age",18);
    %>
    <%--test属性中是条件,但是条件需要EL表达式来书写--%>
    <c:if test="${username=='tom'}">
        <h1>欢迎您${username}</h1>
    </c:if>
    <c:if test="${username!='tom'}">
        <h1>请您重新登录</h1>
    </c:if>
<hr>
    <c:choose>
        <c:when test="${age<18}"><h1>青少年</h1></c:when>
        <c:when test="${age>=18 && age<=30}"><h1>中年</h1></c:when>
        <c:otherwise><h1>晚年</h1></c:otherwise>
    </c:choose>
</body>
</html>

在这里插入图片描述

5.3 迭代foreach标签

在这里插入图片描述
在这里插入图片描述

<%@ page import="java.util.ArrayList" %>
<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<%@ taglib uri="http://java.sun.com/jsp/jstl/core" prefix="c"%>
<html>
<head>
    <title>if</title>
</head>
<body>
    <%
        request.setAttribute("username","tom123");
        request.setAttribute("age",18);
        ArrayList<String> list = new ArrayList<>();
        list.add("A");
        list.add("B");
        list.add("C");
        request.setAttribute("list",list);
    %>
    <%--test属性中是条件,但是条件需要EL表达式来书写--%>
    <c:if test="${username=='tom'}">
        <h1>欢迎您${username}</h1>
    </c:if>
    <c:if test="${username!='tom'}">
        <h1>请您重新登录</h1>
    </c:if>
<hr>
    <c:choose>
        <c:when test="${age<18}"><h1>青少年</h1></c:when>
        <c:when test="${age>=18 && age<=30}"><h1>中年</h1></c:when>
        <c:otherwise><h1>晚年</h1></c:otherwise>
    </c:choose>
    <%--0开始遍历3个,步长为1--%>
    <c:forEach var="s" items="${list}" begin="0" end="3" step="1" varStatus="i">
        <h1>${s}&nbsp;&nbsp;${i.first}&nbsp;&nbsp;${i.last}&nbsp;&nbsp;${i.count}&nbsp;&nbsp;${i.index}</h1>
    </c:forEach>
</body>
</html>

在这里插入图片描述

5.4 url标签

  • 在cookie禁用的情况下,通过重写url拼接JSESSIONID来传递ID值,便于下次访问时仍可查找到上一次的Session对象
<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<%@ taglib uri="http://java.sun.com/jsp/jstl/core" prefix="c"%>
<html>
<head>
    <title>Title</title>
</head>
<body>
    <%
        String newURL = response.encodeRedirectURL(request.getContextPath() + "/jstl.jsp");
    %>
    <%=newURL%>
    <a href="<%=response.encodeRedirectURL(request.getContextPath()+"/jstl.jsp")%>">跳转</a>
    <hr/>
    <!--jstl-->
    <c:url context="/${pageContext.request.contextPath}" value="/jstl.jsp"></c:url>
    <a href="<c:url context='/${pageContext.request.contextPath}' value='/jstl.jsp'></c:url>">跳转</a>
</body>
</html>

在这里插入图片描述
- 经验:所有涉及到页面跳转或者重定向跳转时,都应该使用URL重写

MVC框架(Model-View-Controller)

1.MVC概念

  • MVC又称编程模式,是一种软件设计思想,将数据操作,页面显示,业务逻辑分为三个层级(模块),独立完成,互相调用
  • 模型层(Model)
  • 视图(View)
  • 控制器(Controller)

2.MVC模型详解

  • MVC并不是java独有的,现在几乎所有的B/S的架构都采用了MVC模式
    • 视图:视图即是用户看到并与之交互的界面,比如html(静态资源),jsp(动态资源)等等。
    • 控制器:控制器即是控制请求的处理逻辑,对请求进行处理,负责流程跳转(转发和重定向)
    • 模型:对客观世界的一种代表和模拟(业务模拟,对象模拟)
      在这里插入图片描述

3.优点

  • 低耦合性:模块与模块之间的关联性不强,不与某一种具体实现产生密不可分的关联性
  • 高维护性:基于低耦合性,可做到不同层级的功能模块灵活更换,插拔
  • 高重用性:相同的数据库操作,可以服务与不同的业务处理。将数据作为独立的模块,提高重用性

4.MVC在框架中应用

  • MVC模式被广泛用于Java的各种框架中,比如Struts2,SpringMVC等等都用了这个思想

5.三层架构与MVC

5.1 三层架构

  • view(表示|显示层),service(业务逻辑层),DAO层(数据访问层)
    在这里插入图片描述

5.2 MVC与三层架构的区别

  • MVC强调的是视图和业务代码的分离,严格的说MVC其实关注的是Web层。View就是单独的页面,如JSP,HTML等,不负责业务处理,只负责数据的展示,而数据封装到Model里,由controller负责在V与M之间传递,MVC强调业务和视图分离
  • 三层架构是“数据访问层”,“业务逻辑层”,“表示层”,指的是代码之间的解耦,方便维护和复用

分页

1.概念

  • 分页是Web应用程序非常重要的一个技术,数据库中的数据可能是成千上万的,不可能把那么多的数据一次显示在浏览器上面。一般根据每行数据在页面上所占的空间设置每页显示若干行,比如一般是20行是一个比较理想的显示状态

2.分页实现思路

  • 对于海量的数据查询,需要多少就取多少,显然是最佳的解决办法,假如某个表中有200w条记录,第一页取前20条,第二页取21-40条记录
    在这里插入图片描述

3.分页代码实现

  • 步骤:
    • 确定每页显示数据的数量
    • 确定分页显示所需的总页数
    • 编写SQL查询语句,实现数据查询
    • 在JSP页面中 进行分页显示设置
      AdminDaoAdminDao
public List<Admin> selectByPage(Page page);
    public long selectCount();

AdminDaoImpl

@Override
    public List<Admin> selectByPage(Page page) {
        try {
            List<Admin> admins = queryRunner.query(DbUtils.getConnection(), "select * from admin limit ?,?", new BeanListHandler<Admin>(Admin.class), page.getStartRows(), page.getPageSize());
            return admins;
        } catch (SQLException throwables) {
            throwables.printStackTrace();
        }

        return null;
    }

    @Override
    public long selectCount() {
        try {
            Long count =(Long) queryRunner.query(DbUtils.getConnection(), "select count(*) from admin", new ScalarHandler<>());
            return count;
        } catch (SQLException throwables) {
            throwables.printStackTrace();
        }
        return 0;
    }

AdminService

 public List<Admin> showByPage(Page page);

AdminServiceImpl

   @Override
    public List<Admin> showByPage(Page page) {
        List<Admin> admins=null;
        try {
            DbUtils.begin();
            long count = adminDao.selectCount();
            page.setTotalCounts((int)count);
            admins = adminDao.selectByPage(page);
            DbUtils.commit();
        } catch (Exception exception) {
            DbUtils.rollback();
            exception.printStackTrace();
        }
        return admins;
    }

Page

public class Page {
    private Integer startRows;//起始页
    private Integer totalPages;//总页数
    private Integer totalCounts;//数据总行数
    private Integer pageIndex;//当前页码
    private Integer pageSize;//页大小,显示多少行数据

    public Page(Integer pageIndex) {
        this(pageIndex,5);
    }

    public Page(Integer pageIndex, Integer pageSize) {
        this.pageIndex = pageIndex;
        this.pageSize = pageSize;
        this.startRows=((pageIndex-1)*pageSize);
    }

    public Integer getStartRows() {
        return startRows;
    }

    public void setStartRows(Integer startRows) {
        this.startRows = startRows;
    }

    public Integer getTotalPages() {
        return totalPages;
    }

    public void setTotalPages(Integer totalPages) {
        this.totalPages = totalPages;
    }

    public Integer getTotalCounts() {
        return totalCounts;
    }

    public void setTotalCounts(Integer totalCounts) {
        this.totalCounts = totalCounts;
        this.totalPages=totalCounts%this.pageSize==0?totalCounts/pageSize:totalCounts/pageSize+1;
    }

    public Integer getPageIndex() {
        return pageIndex;
    }

    public void setPageIndex(Integer pageIndex) {
        this.pageIndex = pageIndex;
    }

    public Integer getPageSize() {
        return pageSize;
    }

    public void setPageSize(Integer pageSize) {
        this.pageSize = pageSize;
    }
}

ShowByPageServlet

@WebServlet(name = "ShowByPageServlet",value = "/showByPage")
public class ShowByPageServlet extends HttpServlet {
    protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
        String pageIndex = request.getParameter("pageIndex");
        if (pageIndex==null){
            pageIndex="1";
        }
        Page page = new Page(Integer.valueOf(pageIndex));


        AdminService adminService =new AdminServiceImpl();
        List<Admin> admins = adminService.showByPage(page);
        request.setAttribute("admins",admins);
        request.setAttribute("page",page);
        request.getRequestDispatcher("/pagejsp/show.jsp").forward(request,response);

    }

    protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
        doPost(request, response);
    }
}

show.jsp

<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<%@taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core" %>
<html>
<head>
    <title>Admin show</title>
</head>
<body>
    <table border="1">
        <tr>
            <td>姓名</td>
            <td>密码</td>
            <td>电话</td>
            <td>地址</td>
        </tr>
        <c:forEach var="admin" items="${admins}">
            <tr>
                <td>${admin.username}</td>
                <td>${admin.password}</td>
                <td>${admin.phone}</td>
                <td>${admin.address}</td>
            </tr>


        </c:forEach>
        <tr>
            <td colspan="6">
                <a href="<c:url context='/${pageContext.request.contextPath}' value='/showByPage?pageIndex=1'></c:url> ">首页</a>
                <c:if test="${page.pageIndex == 1}">
                    <a>上一页</a>
                </c:if>
                <c:if test="${page.pageIndex > 1}">
                    <a href="<c:url context='/${pageContext.request.contextPath}' value='/showByPage?pageIndex=${page.pageIndex-1}'></c:url>">上一页</a>
                </c:if>
                <c:if test="${page.pageIndex<page.totalPages}">
                    <a href="<c:url context='/${pageContext.request.contextPath}' value='/showByPage?pageIndex=${page.pageIndex+1}'></c:url> ">下一页</a>
                </c:if>
                <c:if test="${page.pageIndex==totalPages}">
                    <a>下一页</a>
                </c:if>
                <a href="<c:url context='/${pageContext.request.contextPath}' value='/showByPage?pageIndex=${page.totalPages}'></c:url> ">尾页</a>
            </td>
        </tr>
    </table>
</body>
</html>

在这里插入图片描述

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值