JavaWeb基础学习笔记
Tomcat
Web 應?服務器:Tomcat、Jboos、Weblogic、Jetty
- 安裝 Tomcat
1、官?下載壓縮?件。https://tomcat.apache.org/download-90.cgi
2、解壓縮。
bin:存放各個平臺下啟動和停? Tomcat 服務的腳本?件。
conf:存放各種 Tomcat 服務器的配置?件。
lib:存放 Tomcat 服務器所需要的 jar。
logs:存放 Tomcar 服務運?的?志。
temp:Tomcat 運?時的臨時?件。
webapps:存放允許客戶端訪問的資源(Java 程序)。
work:存放 Tomcat 將 JSP 轉換之后的 Servlet ?件。
IDEA 集成 Tomcat
1、創建 Java Web ?程。
Servlet
- 什么是 Servlet?
Servlet 是 Java Web 開發的基?,與平臺?關的服務器組件,它是運?在 Servlet 容器/Web 應?服務
器/Tomcat,負責與客戶端進?通信。
Servlet 的功能:
1、創建并返回基于客戶請求的動態 HTML ??。
2、與數據庫進?通信。 - 如何使? Servlet?
Servlet 本身是?組接?,?定義?個類,并且實現 Servlet 接?,這個類就具備了接受客戶端請求以及
做出響應的功能。
瀏覽器不能直接訪問 Servlet ?件,只能通過映射的?式來間接訪問 Servlet,映射需要開發者?動配
置,有兩種配置?式。
- 基于 XML ?件的配置?式。
- 基于注解的?式。
上述兩種配置?式結果完全?致,將 demo2 與 HelloServlet 進?映射,即在瀏覽器地址欄中直接訪問
demo 就可以映射到 HelloServlet。
Servlet 的?命周期
1、當瀏覽器訪問 Servlet 的時候,Tomcat 會查詢當前 Servlet 的實例化對象是否存在,如果不存在,
則通過反射機制動態創建對象,如果存在,直接執?第 3 步。
2、調? init ?法完成初始化操作。
3、調? service ?法完成業務邏輯操作。
4、關閉 Tomcat 時,會調? destory ?法,釋放當前對象所占?的資源。
反射機制:(如下圖)
Servlet 的?命周期?法:?參構造函數、init、service、destory
1、?參構造函數只調??次,創建對象。
2、init 只調??次,初始化對象。
3、service 調? N 次,執?業務?法。
4、destory 只調??次,卸載對象。
ServletConfig
該接?是?來描述 Servlet 的基本信息的。
getServletName() 返回 Servlet 的名稱,全類名(帶著包名的類名)
getInitParameter(String key) 獲取 init 參數的值(web.xml)
getInitParameterNames() 返回所有的 initParamter 的 name 值,?般?作遍歷初始化參數
getServletContext() 返回 ServletContext 對象,它是 Servlet 的上下?,整個 Servlet 的管理者。
ServletConfig 和 ServletContext 的區別:
ServletConfig 作?于某個 Servlet 實例,每個 Servlet 都有對應的 ServletConfig,ServletContext 作?
于整個 Web 應?,?個 Web 應?對應?個 ServletContext,多個 Servlet 實例對應?個
ServletContext。
?個是局部對象,?個是全局對象。
Servlet 的層次結構
Servlet ====> GenericServlet ====> HttpServlet
HTTP 請求有很多種類型,常?的有四種:
GET 讀取
POST 保存
PUT 修改
DELETE 刪除
GenericServlet 實現 Servlet 接?,同時為它的?類屏蔽了不常?的?法,?類只需要重寫 service ?
法即可。
HttpServlet 繼承 GenericServlet,根據請求類型進?分發處理,GET 進? doGET ?法,POST 進?
doPOST ?法。
開發者?定義的 Servlet 類只需要繼承 HttpServlet 即可,重新 doGET 和 doPOST。
JSP
JSP 本質上就是?個 Servlet,JSP 主要負責與?戶交互,將最終的界?呈現給?戶,
HTML+JS+CSS+Java 的混合?件。
當服務器接收到?個后綴是 jsp 的請求時,將該請求交給 JSP 引擎去處理,每?個 JSP ??第?次被訪
問的時候,JSP 引擎會將它翻譯成?個 Servlet ?件,再由 Web 容器調? Servlet 完成響應。
單純從開發的?度看,JSP 就是在 HTML 中嵌? Java 程序。
具體的嵌??式有 3 種:
1、JSP 腳本,執? Java 邏輯代碼
2、JSP 聲明:定義 Java ?法
<%!聲明 Java ?法 %>3、JSP 表達式:把 Java 對象直接輸出到 HTML ??中
<%=Java變量 %> <%!public String test(){return "HelloWorld"; } %> <% String str = test(); %> <%=str%>JSP內置對象 9 個
1、request:表示?次請求,HttpServletRequest。
2、response:表示?次響應,HttpServletResponse。
3、pageContext:??上下?,獲取??信息,PageContext。
4、session:表示?次會話,保存?戶信息,HttpSession。
5、application:表示當前 Web 應?,全局對象,保存所有?戶共享信息,ServletContext。
6、config:當前 JSP 對應的 Servlet 的 ServletConfig 對象,獲取當前 Servlet 的信息。
7、out:向瀏覽器輸出數據,JspWriter。
8、page:當前 JSP 對應的 Servlet 對象,Servlet。
9、exception:表示 JSP ??發?的異常,Exception。
常?的是 request、response、session、application、pageContext
request 常??法:
1、String getParameter(String key) 獲取客戶端傳來的參數。
2、void setAttribute(String key,Object value) 通過鍵值對的形式保存數據。(服務端內部傳遞參數)
3、Object getAttribute(String key) 通過 key 取出 value。
4、RequestDispatcher getRequestDispatcher(String path) 返回?個 RequestDispatcher 對象,該對象的 forward ?法?于請求轉發。
5、String[] getParameterValues() 獲取客戶端傳來的多個同名參數。
6、void setCharacterEncoding(String charset) 指定每個請求的編碼。
HTTP 請求狀態碼
200:正常
404:資源找不到
400:請求類型不匹配
500:Java 程序拋出異常
response 常??法:
1、sendRedirect(String path) 重定向,??之間的跳轉。
轉發 getRequestDispatcher 和重定向 sendRedirect 的區別:
轉發是將同?個請求傳給下?個??,重定向是創建?個新的請求傳給下?個??,之前的請求結束?
命周期。
轉發:同?個請求在服務器之間傳遞,地址欄不變,也叫服務器跳轉。
重定向:由客戶端發送?次新的請求來訪問跳轉后的?標資源,地址欄改變,也叫客戶端跳轉。
如果兩個??之間需要通過 request 來傳值,則必須使?轉發,不能使?重定向。
?戶登錄,如果?戶名和密碼正確,則跳轉到??(轉發),并且展示?戶名,否則重新回到登陸??
(重定向)。
Session
?戶會話
服務器?法識別每?次 HTTP 請求的出處(不知道來?于哪個終端),它只會接受到?個請求信號,所
以就存在?個問題:將?戶的響應發送給其他?,必須有?種技術來讓服務器知道請求來?哪,這就是
會話技術。
會話:就是客戶端和服務器之間發?的?系列連續的請求和響應的過程,打開瀏覽器進?操作到關閉瀏
覽器的過程。
會話狀態:指服務器和瀏覽器在會話過程中產?的狀態信息,借助于會話狀態,服務器能夠把屬于同?次會話的?系列請求和響應關聯起來。
實現會話有兩種?式:
- session
- cookie
屬于同?次會話的請求都有?個相同的標識符,sessionID
session 常?的?法:
String getId() 獲取 sessionID
void setMaxInactiveInterval(int interval) 設置 session 的失效時間,單位為秒
int getMaxInactiveInterval() 獲取當前 session 的失效時間
void invalidate() 設置 session ?即失效
void setAttribute(String key,Object value) 通過鍵值對的形式來存儲數據
Object getAttribute(String key) 通過鍵獲取對應的數據
void removeAttribute(String key) 通過鍵刪除對應的數據
Cookie
Cookie 是服務端在 HTTP 響應中附帶傳給瀏覽器的?個??本?件,?旦瀏覽器保存了某個 Cookie,
在之后的請求和響應過程中,會將此 Cookie 來回傳遞,這樣就可以通過 Cookie 這個載體完成客戶端
和服務端的數據交互。
- 創建 Cookie
- 讀取 Cookie
Cookie 常?的?法
void setMaxAge(int age) 設置 Cookie 的有效時間,單位為秒
int getMaxAge() 獲取 Cookie 的有效時間
String getName() 獲取 Cookie 的 name
String getValue() 獲取 Cookie 的 value
Session 和 Cookie 的區別
session:保存在服務器
保存的數據是 Object
會隨著會話的結束?銷毀
保存重要信息
cookie:保存在瀏覽器
保存的數據是 String
可以?期保存在瀏覽器中,?會話?關
保存不重要信息
存儲?戶信息:
session:
?命周期:服務端:只要 WEB 應?重啟就銷毀,客戶端:只要瀏覽器關閉就銷毀。
退出登錄:session.invalidate()
cookie:
response.addCookie(new Cookie(name,"admin")) //存Cookie[] cookies = request.getCookies(); //取 for (Cookie cookie:cookies){if(cookie.getName().equals("name")){out.write("歡迎回來"+cookie.getValue());} }?命周期:不隨服務端的重啟?銷毀,客戶端:默認是只要關閉瀏覽器就銷毀,我們通過 setMaxAge()
?法設置有效期,?旦設置了有效期,則不隨瀏覽器的關閉?銷毀,?是由設置的時間來決定。
退出登錄:setMaxAge(0)
JSP 內置對象作?域
4個
page、request、session、application
setAttribute、getAttribute
page 作?域:對應的內置對象是 pageContext。
request 作?域:對應的內置對象是 request。
session 作?域:對應的內置對象是 session。
application 作?域:對應的內置對象是 application。
page < request < session < application
page 只在當前??有效。
request 在?次請求內有效。
session 在?次會話內有效。
application 對應整個 WEB 應?的。
- ?站訪問量統計
EL 表達式
Expression Language 表達式語?,替代 JSP ??中數據訪問時的復雜編碼,可以?常便捷地取出域對
象(pageContext、request、session、application)中保存的數據,前提是?定要先 setAttribute,
EL 就相當于在簡化 getAttribute
${變量名} 變量名就是 setAttribute 對應的 key 值。
1、EL 對于 4 種域對象的默認查找順序:
pageContext ====> request ====> session ====> application
按照上述的順序進?查找,找到?即返回,在 application 中也?法找到,則返回 null
2、指定作?域進?查找
pageContext:${pageScope.name}
request:${requestScope.name}
session:${sessionScope.name}
application:${applicationScope.name}
數據級聯:
<% // pageContext.setAttribute("name","page"); // request.setAttribute("name","request"); // session.setAttribute("name","session"); // application.setAttribute("name","application");User user = new User(1,"張三",86.5,new Address(1,"?寨"));System.out.println(user.toString());pageContext.setAttribute("user",user); %><table><tr><th>編號</th><th>姓名</th><th>成績</th><th>地址</th></tr><tr><td>${user.id}</td><td>${user.name}</td><td>${user.score}</td><td>${user.address}</td></tr></table>${user[“id”]}
EL 執?表達式:
${num1&&num2} && || ! < > <= <= == && and || or ! not == eq != ne < lt > gt <= le >= ge empty //變量為 null,?度為0的String,size為0的集合
JSTL
JSP Standard Tag Library JSP 標準標簽庫,JSP 為開發者提供的?系列的標簽,使?這些標簽可以完成
?些邏輯處理,?如循環遍歷集合,讓代碼更加簡潔,不再出現 JSP 腳本穿插的情況。
實際開發中 EL 和 JSTL 結合起來使?,JSTL 側重于邏輯處理,EL 負責展示數據。
JSTL 的使?
1、需要導? jar 包(兩個 jstl.jar standard.jar)存放的位置 web/WEB-INF
2、在 JSP ??開始的地?導? JSTL 標簽庫
3、在需要的地?使?
<c:forEach items="${list}" var="user"><tr><td>${user.id}</td><td>${user.name}</td><td>${user.score}</td><td>${user.address.value}</td></tr> </c:forEach>JSTL 優點:
1、提供了統?的標簽
2、可以?于編寫各種動態功能
- 核?標簽庫常?標簽:
set、out、remove、catch
set:向域對象中添加數據
<%requset.setAttribute(key,value) %> <c:set var="name" value="tom" scope="request"></c:set> ${requestScope.name} <% User user = new User(1,"張三",66.6,new Address(1,"科技路")); request.setAttribute("user",user); %> ${user.name} <hr/> <c:set target="${user}" property="name" value="李四"></c:set> ${user.name}out:輸出域對象中的數據
<c:set var="name" value="tom"></c:set> <c:out value="${name}" default="未定義"></c:out>remove:刪除域對象中的數據
<c:remove var="name" scope="page"></c:remove> <c:out value="${name}" default="未定義"></c:out>catch:捕獲異常
<c:catch var="error"><%int a = 10/0;%> </c:catch> ${error}- 條件標簽:if choose
- 迭代標簽:forEach
格式化標簽庫常?的標簽:
<%@ taglib prefix="fmt" uri="http://java.sun.com/jsp/jstl/fmt" %><% request.setAttribute("date",new Date()); %> <fmt:formatDate value="${date}" pattern="yyyy-MM-dd HH:mm:ss"> </fmt:formatDate><br/> <fmt:formatNumber value="32145.23434" maxIntegerDigits="2" maxFractionDigits="3"></fmt:formatNumber>函數標簽庫常?的標簽:
<%@ taglib prefix="fn" uri="http://java.sun.com/jsp/jstl/functions" %><% request.setAttribute("info","Java,C"); %> ${fn:contains(info,"Python")}<br/> ${fn:startsWith(info, "Java")}<br/> ${fn:endsWith(info, "C")}<br/> ${fn:indexOf(info, "va")}<br/> ${fn:replace(info, "C","Python")}<br/> ${fn:substring(info, 2, 3)}<br/> ${fn:split(info, ",")[0]}-${fn:split(info, ",")[1]}過濾器 Filter
功能:
1、?來攔截傳?的請求和傳出的響應。
2、修改或以某種?式處理正在客戶端和服務端之間交換的數據流。
如何使??
與使? Servlet 類似,Filter 是 Java WEB 提供的?個接?,開發者只需要?定義?個類并且實現該接?
即可。
web.xml 中配置 Filter
<filter><filter-name>charcater</filter-name><filter-class>com.southwind.filter.CharacterFilter</filter-class> </filter> <filter-mapping><filter-name>charcater</filter-name><url-pattern>/login</url-pattern><url-pattern>/test</url-pattern> </filter-mapping>【注意】:doFilter ?法中處理完業務邏輯之后,必須添加filterChain.doFilter(servletRequest,servletResponse);
否則請求/響應?法向后傳遞,?直停留在過濾器中。
Filter 的?命周期
當 Tomcat 啟動時,通過反射機制調? Filter 的?參構造函數創建實例化對象,同時調? init ?法實現
初始化,doFilter ?法調?多次,當 Tomcat 服務關閉的時候,調? destory 來銷毀 Filter 對象。
?參構造函數:只調??次,當 Tomcat 啟動時調?(Filter ?定要進?配置)
init ?法:只調??次,當 Filter 的實例化對象創建完成之后調?
doFilter:調?多次,訪問 Filter 的業務邏輯都寫在 Filter 中
destory:只調??次,Tomcat 關閉時調?。
同時配置多個 Filter,Filter 的調?順序是由 web.xml 中的配置順序來決定的,寫在上?的配置先調
?,因為 web.xml 是從上到下順序讀取的。
1、MyFilter
2、CharacterFilter
也可以通過注解的?式來簡化 web.xml 中的配置
<filter><filter-name>my</filter-name><filter-class>com.southwind.filter.MyFilter</filter-class> </filter> <filter-mapping><filter-name>my</filter-name><url-pattern>/login</url-pattern> </filter-mapping>等于
@WebFilter("/login") public class MyFilter implements Filter {}Filter 的使?場景
實際開發中 Filter 的使?場景:
1、統?處理中?亂碼。
2、屏蔽敏感詞。
3、控制資源的訪問權限。
package com.southwind.filter; import javax.servlet.*; import javax.servlet.annotation.WebFilter; import javax.servlet.http.HttpServletRequest; import javax.servlet.http.HttpServletResponse; import javax.servlet.http.HttpSession; import java.io.IOException; @WebFilter("/download.jsp") public class DownloadFilter implements Filter {@Overridepublic void doFilter(ServletRequest servletRequest, ServletResponse servletResponse, FilterChain filterChain) throws IOException, ServletException {HttpServletRequest request = (HttpServletRequest) servletRequest;HttpServletResponse response = (HttpServletResponse) servletResponse;HttpSession session = request.getSession();String name = (String) session.getAttribute("name");if(name == null){//不是登錄狀態response.sendRedirect("/login.jsp");}else{filterChain.doFilter(servletRequest,servletResponse);}} }?件上傳下載
- JSP
1、input 的 type 設置為 file
2、form 表單的 method 設置 post,get 請求會將?件名傳給服務端,?不是?件本身
3、form 表單的 enctype 設置 multipart/form-data,以?進制的形式傳輸數據
- Servlet
fileupload 組件可以將所有的請求信息都解析成 FileIteam 對象,可以通過對 FileItem 對象的操作完成上傳,?向對象的思想。
?件下載
package com.southwind.servlet; import javax.servlet.ServletException; import javax.servlet.annotation.WebServlet; import javax.servlet.http.HttpServlet; import javax.servlet.http.HttpServletRequest; import javax.servlet.http.HttpServletResponse; import java.io.FileInputStream; import java.io.IOException; import java.io.InputStream; import java.io.OutputStream; @WebServlet("/download") public class DownloadServlet extends HttpServlet {@Overrideprotected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {String type = req.getParameter("type");String fileName = "";switch (type){case "png":fileName = "1.png";break;case "txt":fileName = "test.txt";break;}//設置響應?式resp.setContentType("application/x-msdownload");//設置下載之后的?件名resp.setHeader("Content-Disposition","attachment;filename="+fileName);//獲取輸出流OutputStream outputStream = resp.getOutputStream();String path = req.getServletContext().getRealPath("file/"+fileName);InputStream inputStream = new FileInputStream(path);int temp = 0;while((temp=inputStream.read())!=-1){outputStream.write(temp);}inputStream.close();outputStream.close();} }Ajax
Asynchronous JavaScript And XML:異步的 JavaScript 和 XML
AJAX 不是新的編程,指的是?種交互?式,異步加載,客戶端和服務器的數據交互更新在局部??的
技術,不需要刷新整個??(局部刷新)
優點:
1、局部刷新,效率更?
2、?戶體驗更好
【注】:同步:(打電話);異步:(發微信)
基于 jQuery 的 A JAX:
<%@ page contentType="text/html;charset=UTF-8" language="java" %> <html> <head><title>Title</title><script type="text/javascript" src="js/jquery-3.3.1.min.js"></script><script type="text/javascript">$(function(){var btn = $("#btn");btn.click(function(){$.ajax({url:'/test',type:'post',data:'id=1',dataType:'text',success:function(data){var text = $("#text");text.before("<span>"+data+"</span><br/>");}});});})</script> </head> <body><input id="text" type="text"/><br/><input id="btn" type="button" value="提交"/> </body> </html>不能?表單提交請求,改? jQuery ?式動態綁定事件來提交。
Servlet 不能跳轉到 JSP,只能將數據返回
傳統的 WEB 數據交互 VS AJAX 數據交互
- 客戶端請求的?式不同:
傳統:瀏覽器發送同步請求 (form、a)
AJAX:異步引擎對象發送異步請求 - 服務器響應的?式不同:
傳統:響應?個完整 JSP ??(視圖)
AJAX:響應需要的數據 - 客戶端處理?式不同:
傳統:需要等待服務器完成響應并且重新加載整個??之后,?戶才能進?后續的操作
AJAX:動態更新??中的局部內容,不影響?戶的其他操作
AJAX 原理
基于 jQuery 的 AJAX 語法
$.ajax({屬性})
常?的屬性參數:
url:請求的后端服務地址
type:請求?式,默認 get
data:請求參數
dataType:服務器返回的數據類型,text/json
success:請求成功的回調函數
error:請求失敗的回調函數
complete:請求完成的回調函數(?論成功或者失敗,都會調?)
JSON
JavaScript Object Notation,?種輕量級數據交互格式,完成 js 與 Java 等后端開發語?對象數據之間
的轉換。
客戶端和服務器之間傳遞對象數據,需要? JSON 格式。
AJAX的簡單應用
<%@ page contentType="text/html;charset=UTF-8" language="java" %> <html> <head><title>Title</title><script type="text/javascript" src="js/jquery-3.3.1.min.js"></script><script type="text/javascript">$(function(){//修改省份$("#province").change(function () {var id = $(this).val();$.ajax({url:"/location",type:"POST",data:"id="+id+"&type=province",dataType:"JSON",success:function(data){var content = "";var cities = data.cities;for(var i=0;i<cities.length;i++){content += "<option>"+cities[i]+"</option>";}$("#city").html(content);content = "";var areas = data.areas;for(var i=0;i<areas.length;i++){content += "<option>"+areas[i]+"</option>";}$("#area").html(content);}});});//修改城市$("#city").change(function(){var id = $(this).val();$.ajax({url:"/location",type:"POST",data:"id="+id+"&type=city",dataType:"JSON",success:function(data){var content = "";for(var i=0;i<data.length;i++){content += "<option>"+data[i]+"</option>";}$("#area").html(content);}});});});</script> </head> <body>省:<select id="province"><option value="陜?省">陜?省</option><option value="河南省">河南省</option><option value="江蘇省">江蘇省</option></select>市:<select id="city"><option value="?安市">?安市</option><option value="寶雞市">寶雞市</option><option value="渭南市">渭南市</option></select>區:<select id="area"><option>雁塔區</option><option>蓮湖區</option><option>新城區</option></select> </body> </html> package com.southwind.entity; import java.util.List; public class Location {private List<String> cities;private List<String> areas;public List<String> getCities() {return cities;}public void setCities(List<String> cities) {this.cities = cities;}public List<String> getAreas() {return areas;}public void setAreas(List<String> areas) {this.areas = areas;} } package com.southwind.servlet; import com.southwind.entity.Location; import net.sf.json.JSONArray; import net.sf.json.JSONObject; import javax.servlet.ServletException; import javax.servlet.annotation.WebServlet; import javax.servlet.http.HttpServlet; import javax.servlet.http.HttpServletRequest; import javax.servlet.http.HttpServletResponse; import java.io.IOException; import java.util.ArrayList; import java.util.HashMap; import java.util.List; import java.util.Map; @WebServlet("/location") public class LocationServlet extends HttpServlet {private static Map<String, List<String>> cityMap;private static Map<String,List<String>> provinceMap;static {cityMap = new HashMap<>();List<String> areas = new ArrayList<>();//?安areas.add("雁塔區");areas.add("蓮湖區");areas.add("新城區");cityMap.put("?安市",areas);//寶雞areas = new ArrayList<>();areas.add("陳倉區");areas.add("渭賓區");areas.add("新城區");cityMap.put("寶雞市",areas);//渭南areas = new ArrayList<>();areas.add("臨渭區");areas.add("?新區");cityMap.put("渭南市",areas);//鄭州areas = new ArrayList<>();areas.add("鄭州A區");areas.add("鄭州B區");cityMap.put("鄭州市",areas);//洛陽areas = new ArrayList<>();areas.add("洛陽A區");areas.add("洛陽B區");cityMap.put("洛陽市",areas);provinceMap = new HashMap<>();List<String> cities = new ArrayList<>();cities.add("?安市");cities.add("寶雞市");cities.add("渭南市");provinceMap.put("陜?省",cities);cities = new ArrayList<>();cities.add("鄭州市");cities.add("洛陽市");cities.add("開封市");provinceMap.put("河南省",cities);cities = new ArrayList<>();cities.add("南京市");cities.add("蘇州市");cities.add("南通市");provinceMap.put("江蘇省",cities);}@Overrideprotected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {}@Overrideprotected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {String type = req.getParameter("type");resp.setCharacterEncoding("UTF-8");String id = req.getParameter("id");switch (type){case "city":List<String> areas = cityMap.get(id);JSONArray jsonArray = JSONArray.fromObject(areas);resp.getWriter().write(jsonArray.toString());break;case "province":List<String> cities = provinceMap.get(id);String city = cities.get(0);List<String> cityAreas = cityMap.get(city);Location location = new Location();location.setCities(cities);location.setAreas(cityAreas);JSONObject jsonObject = JSONObject.fromObject(location);resp.getWriter().write(jsonObject.toString());break;}} }JDBC
Java DataBase Connectivity 是?個獨?于特定數據庫的管理系統,通?的 SQL 數據庫存取和操作的公
共接?。
定義了?組標準,為訪問不同數據庫提供了統?的途徑。
JDBC 體系結構
JDBC 接?包括兩個層?:
- ?向應?的 API,供程序員調?
- ?向數據庫的 API,供?商開發數據庫的驅動程序
JDBC API
提供者:Java 官?
內容:供開發者調?的接?
java.sql 和 javax.sql
- DriverManager 類
- Connection 接?
- Statement 接?
- ResultSet 接?
DriverManager
提供者:Java 官?
作?:管理不同的 JDBC 驅動
JDBC 驅動
提供者:數據庫?商
作?:負責連接不同的數據庫
JDBC 的使?
1、加載數據庫驅動,Java 程序和數據庫之間的橋梁。
2、獲取 Connection,Java 程序與數據庫的?次連接。
3、創建 Statement 對象,由 Connection 產?,執? SQL 語句。
4、如果需要接收返回值,創建 ResultSet 對象,保存 Statement 執?之后所查詢到的結果。
PreparedStatement
Statement 的?類,提供了 SQL 占位符的功能
使? Statement 進?開發有兩個問題:
1、需要頻繁拼接 String 字符串,出錯率較?。
2、存在 SQL 注?的?險。
SQL 注?:利?某些系統沒有對?戶輸?的信息進?充分檢測,在?戶輸?的數據中注??法的 SQL
語句,從?利?系統的 SQL 引擎完成惡意?為的做法。
數據庫連接池
JDBC 開發流程
- 加載驅動(只需要加載?次)
- 建?數據庫連接(Connection)
- 執? SQL 語句(Statement)
- ResultSet 接收結果集(查詢)
- 斷開連接,釋放資源
數據庫連接對象是通過 DriverManager 來獲取的,每次獲取都需要向數據庫申請獲取連接,驗證?戶
名和密碼,執?完 SQL 語句后斷開連接,這樣的?式會造成資源的浪費,數據連接資源沒有得到很好的重復利?。(栗子:就像是你每次打一個電話都要買一個手機,打完一個電話就把手機扔了,很浪費,為什么我們不一直使用第一次買的手機一直打電話呢?)
可以使?數據庫連接池解決這?問題。
數據庫連接池的基本思想就是為數據庫建??個緩沖池,預先向緩沖池中放??定數量的連接對象,當需要獲取數據庫連接的時候,只需要從緩沖池中取出?個對象,?完之后再放回到緩沖池中,供下?次請求使?,做到了資源的重復利?,允許程序重復使??個現有的數據庫連接對象,?不需要重新創
建。
當數據庫連接池中沒有空閑的連接時,新的請求就會進?等待隊列,等待其他線程釋放連接。
數據庫連接池實現
JDBC 的數據庫連接池使? javax.sql.DataSource 接?來完成的,DataSource 是 Java 官?提供的接
?,使?的時候開發者并不需要??來實現該接?,可以使?第三?的?具,C3P0 是?個常?的第三
?實現,實際開發中直接使? C3P0 即可完成數據庫連接池的操作。
1、導? jar 包
傳統?式拿到的 Connection:com.mysql.cj.jdbc.ConnectionImpl@557caf28
C3P0 拿到的 Connection:com.mchange.v2.c3p0.impl.NewProxyConnection@4988d8b8
2、代碼實現
實際開發,將 C3P0 的配置信息定義在 xml ?件中,Java 程序只需要加載配置?件即可完成數據庫連接
池的初始化操作。
1、配置?件的名字必須是 c3p0-config.xml
2、初始化 ComboPooledDataSource 時,傳?的參數必須是 c3p0-config.xml 中 named-config 標簽的 name 屬性值。
DBUtils
DBUtils 可以幫助開發者完成數據的封裝(結果集到 Java 對象的映射)
1、導? jar 包
ResultHandler 接?是?來處理結果集,可以將查詢到的結果集轉換成 Java 對象,提供了 4 種實現類。
- BeanHandler 將結果集映射成 Java 對象 Student
- BeanListHandler 將結果集映射成 List 集合List <Student >
- MapHandler 將結果集映射成 Map 對象
- MapListHandler 將結果集映射成 MapList 結合
【注】:根據返回值決定以上handler。
public static Student findByDBUtils(Integer id){Connection connection = null;Student student = null;try {connection = dataSource.getConnection();String sql = "select * from student";//String sql = "select * from student where id=?";QueryRunner queryRunner = new QueryRunner();List<Map<String,Object>> list = queryRunner.query(connection,sql,new MapListHandler());//List<Map<String,Object>> list = queryRunner.query(connection,sql,new BeanHandler<>(Student.class),id);for (Map<String,Object> map:list){System.out.println(map);}} catch (SQLException e) {e.printStackTrace();} finally {try {connection.close();} catch (SQLException e) {e.printStackTrace();}}return student; }
【代碼來源】參考楠哥教學視頻:https://www.bilibili.com/video/BV1BJ411L7NR
【JavaWeb實戰代碼及所需jar包】:https://download.csdn.net/download/hhhmonkey/21516713
總結
以上是生活随笔為你收集整理的JavaWeb基础学习笔记的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 实现一个简单的模板引擎,输入模板和数据,
- 下一篇: SpringMVC学习笔记