JavaEE學習之走進JSP
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語句
- 與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進行屬性賦值
屬性 | 描述 |
---|---|
name | name屬性是必需的,他表示設定屬性的是哪個bean |
property | property屬性是必需的,它表示要設定哪個屬性 |
value | value是可選的,該屬性用來指定bean屬性的值 |
4.4 getProperty
- jsp:getProperty動作提取指定Bean屬性的值,轉換成字串,然後輸出
屬性 | 描述 |
---|---|
name | 要檢索的Bean屬性名稱。Bean必須已定義 |
property | 表示要提取Bean的值 |
4.5 forward
- 語法:< jsp:forward page=“相對url地址”/>
- jsp:forward動作把請求轉到另外的頁面
屬性 | 描述 |
---|---|
page | page屬性包含的是一個相對的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.內建物件
物件名 | 型別 | 說明 |
---|---|---|
request | javax.servlet.http.HttpServletRequest | |
response | javax.servlet.http.HttpServletResponse | |
session | javax.servlet.http.HttpSession | 預設session="true"開關 |
application | javax.servlet.ServletContext | |
config | javax.servlet.ServletConfig | |
exception | java.lang.Throwable | 預設isErrorPage=“false”開關 |
out | javax.servlet.jsp.JspWriter | |
pageContext | javax.servlet.jsp.PageContext | |
page | java.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個隱式物件
隱含物件 | 描述 |
---|---|
pageScope | page作用域 |
requestScope | request作用域 |
sessionScope | session作用域 |
applicationScope | application作用域 |
param | request物件的引數,字串 |
paramValues | request物件的引數,字串集合 |
header | HTTP資訊頭,字串 |
headerValues | HTTP資訊頭,字串集合 |
initParam | 上下文初始化引數 |
cookie | Cookie值 |
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} ${i.first} ${i.last} ${i.count} ${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>
相關文章
- go 學習筆記之走進Goland編輯器筆記GoLand
- 走進AI科學之美AI
- JavaEE進階知識學習----Java NIO-4Java
- 讀懂深度學習,走進“深度學習+”階段深度學習
- 六個學習方法帶你走進學習狀態
- SpringCloud學習之路(一)- 走進SpringCloudSpringGCCloud
- 走進前端的過程--方向式學習前端
- java基礎學習:JavaWeb之JSPJavaWebJS
- JavaEE進階知識學習-----SpringCloud(二)實踐準備JavaSpringGCCloud
- 走進 JDK 之 IntegerJDK
- 走進 JDK 之 BooleanJDKBoolean
- 走進 JDK 之 FloatJDK
- 走進 JDK 之 LongJDK
- 走進 JDK 之 EnumJDK
- 走進 JDK 之 StringJDK
- 走進 JDK 之 ByteJDK
- 走進 JDK 之 LinkedListJDK
- 走進 JDK 之 ArrayList(一)JDK
- 走進 JDK 之 ArrayList(二)JDK
- 【JavaEE】JSP表示式--EL表示式用法JavaJS
- JSP指令學習JS
- JavaEE進階知識學習-----SpringBootWeb進階-7-AOP處理請求知識JavaSpring BootWeb
- JAVAEE框架學習——Struts2——Action API 使用Java框架API
- JavaEE進階知識學習-----SpringCloud(三)Eureka服務註冊與發現JavaSpringGCCloud
- tomact和javaee、jsp、servlet對應的版本MacJavaJSServlet
- 《黑神話:悟空》爆紅之後,我走進了遊戲科學遊戲
- 走進Golang之編譯器原理Golang編譯
- 走進 JDK 之談談字串拼接JDK字串
- 帶你走進Java集合之ArrayListJava
- 帶你走進Java集合之HashMapJavaHashMap
- 走進SpringBoot之簡言Spring Boot
- JavaEE 7的最新進展Java
- 程式設計字典-Java(JavaEE)學習線路圖程式設計Java
- Java學習--Jsp簡介JavaJS
- 走進 JDK 之 談談基本型別JDK型別
- 帶你走進Java集合之ConcurrentHashMapJavaHashMap
- 走進科學 WAF(Web Appllication Firewall)WebAPP
- 學習人工智慧不走捷徑,走大道的方式人工智慧