JavaEE學習之走進JSP

ozl520發表於2020-12-23

引言

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>

在這裡插入圖片描述

相關文章