JavaWeb基础学习笔记
Tomcat
Web 應(yīng)?服務(wù)器:Tomcat、Jboos、Weblogic、Jetty
- 安裝 Tomcat
1、官?下載壓縮?件。https://tomcat.apache.org/download-90.cgi
2、解壓縮。
bin:存放各個(gè)平臺(tái)下啟動(dòng)和停? Tomcat 服務(wù)的腳本?件。
conf:存放各種 Tomcat 服務(wù)器的配置?件。
lib:存放 Tomcat 服務(wù)器所需要的 jar。
logs:存放 Tomcar 服務(wù)運(yùn)?的?志。
temp:Tomcat 運(yùn)?時(shí)的臨時(shí)?件。
webapps:存放允許客戶端訪問(wèn)的資源(Java 程序)。
work:存放 Tomcat 將 JSP 轉(zhuǎn)換之后的 Servlet ?件。
IDEA 集成 Tomcat
1、創(chuàng)建 Java Web ?程。
Servlet
- 什么是 Servlet?
Servlet 是 Java Web 開(kāi)發(fā)的基?,與平臺(tái)?關(guān)的服務(wù)器組件,它是運(yùn)?在 Servlet 容器/Web 應(yīng)?服務(wù)
器/Tomcat,負(fù)責(zé)與客戶端進(jìn)?通信。
Servlet 的功能:
1、創(chuàng)建并返回基于客戶請(qǐng)求的動(dòng)態(tài) HTML ??。
2、與數(shù)據(jù)庫(kù)進(jìn)?通信。 - 如何使? Servlet?
Servlet 本身是?組接?,?定義?個(gè)類(lèi),并且實(shí)現(xiàn) Servlet 接?,這個(gè)類(lèi)就具備了接受客戶端請(qǐng)求以及
做出響應(yīng)的功能。
瀏覽器不能直接訪問(wèn) Servlet ?件,只能通過(guò)映射的?式來(lái)間接訪問(wèn) Servlet,映射需要開(kāi)發(fā)者?動(dòng)配
置,有兩種配置?式。
- 基于 XML ?件的配置?式。
- 基于注解的?式。
上述兩種配置?式結(jié)果完全?致,將 demo2 與 HelloServlet 進(jìn)?映射,即在瀏覽器地址欄中直接訪問(wèn)
demo 就可以映射到 HelloServlet。
Servlet 的?命周期
1、當(dāng)瀏覽器訪問(wèn) Servlet 的時(shí)候,Tomcat 會(huì)查詢當(dāng)前 Servlet 的實(shí)例化對(duì)象是否存在,如果不存在,
則通過(guò)反射機(jī)制動(dòng)態(tài)創(chuàng)建對(duì)象,如果存在,直接執(zhí)?第 3 步。
2、調(diào)? init ?法完成初始化操作。
3、調(diào)? service ?法完成業(yè)務(wù)邏輯操作。
4、關(guān)閉 Tomcat 時(shí),會(huì)調(diào)? destory ?法,釋放當(dāng)前對(duì)象所占?的資源。
反射機(jī)制:(如下圖)
Servlet 的?命周期?法:?參構(gòu)造函數(shù)、init、service、destory
1、?參構(gòu)造函數(shù)只調(diào)??次,創(chuàng)建對(duì)象。
2、init 只調(diào)??次,初始化對(duì)象。
3、service 調(diào)? N 次,執(zhí)?業(yè)務(wù)?法。
4、destory 只調(diào)??次,卸載對(duì)象。
ServletConfig
該接?是?來(lái)描述 Servlet 的基本信息的。
getServletName() 返回 Servlet 的名稱(chēng),全類(lèi)名(帶著包名的類(lèi)名)
getInitParameter(String key) 獲取 init 參數(shù)的值(web.xml)
getInitParameterNames() 返回所有的 initParamter 的 name 值,?般?作遍歷初始化參數(shù)
getServletContext() 返回 ServletContext 對(duì)象,它是 Servlet 的上下?,整個(gè) Servlet 的管理者。
ServletConfig 和 ServletContext 的區(qū)別:
ServletConfig 作?于某個(gè) Servlet 實(shí)例,每個(gè) Servlet 都有對(duì)應(yīng)的 ServletConfig,ServletContext 作?
于整個(gè) Web 應(yīng)?,?個(gè) Web 應(yīng)?對(duì)應(yīng)?個(gè) ServletContext,多個(gè) Servlet 實(shí)例對(duì)應(yīng)?個(gè)
ServletContext。
?個(gè)是局部對(duì)象,?個(gè)是全局對(duì)象。
Servlet 的層次結(jié)構(gòu)
Servlet ====> GenericServlet ====> HttpServlet
HTTP 請(qǐng)求有很多種類(lèi)型,常?的有四種:
GET 讀取
POST 保存
PUT 修改
DELETE 刪除
GenericServlet 實(shí)現(xiàn) Servlet 接?,同時(shí)為它的?類(lèi)屏蔽了不常?的?法,?類(lèi)只需要重寫(xiě) service ?
法即可。
HttpServlet 繼承 GenericServlet,根據(jù)請(qǐng)求類(lèi)型進(jìn)?分發(fā)處理,GET 進(jìn)? doGET ?法,POST 進(jìn)?
doPOST ?法。
開(kāi)發(fā)者?定義的 Servlet 類(lèi)只需要繼承 HttpServlet 即可,重新 doGET 和 doPOST。
JSP
JSP 本質(zhì)上就是?個(gè) Servlet,JSP 主要負(fù)責(zé)與?戶交互,將最終的界?呈現(xiàn)給?戶,
HTML+JS+CSS+Java 的混合?件。
當(dāng)服務(wù)器接收到?個(gè)后綴是 jsp 的請(qǐng)求時(shí),將該請(qǐng)求交給 JSP 引擎去處理,每?個(gè) JSP ??第?次被訪
問(wèn)的時(shí)候,JSP 引擎會(huì)將它翻譯成?個(gè) Servlet ?件,再由 Web 容器調(diào)? Servlet 完成響應(yīng)。
單純從開(kāi)發(fā)的?度看,JSP 就是在 HTML 中嵌? Java 程序。
具體的嵌??式有 3 種:
1、JSP 腳本,執(zhí)? Java 邏輯代碼
2、JSP 聲明:定義 Java ?法
<%!聲明 Java ?法 %>3、JSP 表達(dá)式:把 Java 對(duì)象直接輸出到 HTML ??中
<%=Java變量 %> <%!public String test(){return "HelloWorld"; } %> <% String str = test(); %> <%=str%>JSP內(nèi)置對(duì)象 9 個(gè)
1、request:表示?次請(qǐng)求,HttpServletRequest。
2、response:表示?次響應(yīng),HttpServletResponse。
3、pageContext:??上下?,獲取??信息,PageContext。
4、session:表示?次會(huì)話,保存?戶信息,HttpSession。
5、application:表示當(dāng)前 Web 應(yīng)?,全局對(duì)象,保存所有?戶共享信息,ServletContext。
6、config:當(dāng)前 JSP 對(duì)應(yīng)的 Servlet 的 ServletConfig 對(duì)象,獲取當(dāng)前 Servlet 的信息。
7、out:向?yàn)g覽器輸出數(shù)據(jù),JspWriter。
8、page:當(dāng)前 JSP 對(duì)應(yīng)的 Servlet 對(duì)象,Servlet。
9、exception:表示 JSP ??發(fā)?的異常,Exception。
常?的是 request、response、session、application、pageContext
request 常??法:
1、String getParameter(String key) 獲取客戶端傳來(lái)的參數(shù)。
2、void setAttribute(String key,Object value) 通過(guò)鍵值對(duì)的形式保存數(shù)據(jù)。(服務(wù)端內(nèi)部傳遞參數(shù))
3、Object getAttribute(String key) 通過(guò) key 取出 value。
4、RequestDispatcher getRequestDispatcher(String path) 返回?個(gè) RequestDispatcher 對(duì)象,該對(duì)象的 forward ?法?于請(qǐng)求轉(zhuǎn)發(fā)。
5、String[] getParameterValues() 獲取客戶端傳來(lái)的多個(gè)同名參數(shù)。
6、void setCharacterEncoding(String charset) 指定每個(gè)請(qǐng)求的編碼。
HTTP 請(qǐng)求狀態(tài)碼
200:正常
404:資源找不到
400:請(qǐng)求類(lèi)型不匹配
500:Java 程序拋出異常
response 常??法:
1、sendRedirect(String path) 重定向,??之間的跳轉(zhuǎn)。
轉(zhuǎn)發(fā) getRequestDispatcher 和重定向 sendRedirect 的區(qū)別:
轉(zhuǎn)發(fā)是將同?個(gè)請(qǐng)求傳給下?個(gè)??,重定向是創(chuàng)建?個(gè)新的請(qǐng)求傳給下?個(gè)??,之前的請(qǐng)求結(jié)束?
命周期。
轉(zhuǎn)發(fā):同?個(gè)請(qǐng)求在服務(wù)器之間傳遞,地址欄不變,也叫服務(wù)器跳轉(zhuǎn)。
重定向:由客戶端發(fā)送?次新的請(qǐng)求來(lái)訪問(wèn)跳轉(zhuǎn)后的?標(biāo)資源,地址欄改變,也叫客戶端跳轉(zhuǎn)。
如果兩個(gè)??之間需要通過(guò) request 來(lái)傳值,則必須使?轉(zhuǎn)發(fā),不能使?重定向。
?戶登錄,如果?戶名和密碼正確,則跳轉(zhuǎn)到??(轉(zhuǎn)發(fā)),并且展示?戶名,否則重新回到登陸??
(重定向)。
Session
?戶會(huì)話
服務(wù)器?法識(shí)別每?次 HTTP 請(qǐng)求的出處(不知道來(lái)?于哪個(gè)終端),它只會(huì)接受到?個(gè)請(qǐng)求信號(hào),所
以就存在?個(gè)問(wèn)題:將?戶的響應(yīng)發(fā)送給其他?,必須有?種技術(shù)來(lái)讓服務(wù)器知道請(qǐng)求來(lái)?哪,這就是
會(huì)話技術(shù)。
會(huì)話:就是客戶端和服務(wù)器之間發(fā)?的?系列連續(xù)的請(qǐng)求和響應(yīng)的過(guò)程,打開(kāi)瀏覽器進(jìn)?操作到關(guān)閉瀏
覽器的過(guò)程。
會(huì)話狀態(tài):指服務(wù)器和瀏覽器在會(huì)話過(guò)程中產(chǎn)?的狀態(tài)信息,借助于會(huì)話狀態(tài),服務(wù)器能夠把屬于同?次會(huì)話的?系列請(qǐng)求和響應(yīng)關(guān)聯(lián)起來(lái)。
實(shí)現(xiàn)會(huì)話有兩種?式:
- session
- cookie
屬于同?次會(huì)話的請(qǐng)求都有?個(gè)相同的標(biāo)識(shí)符,sessionID
session 常?的?法:
String getId() 獲取 sessionID
void setMaxInactiveInterval(int interval) 設(shè)置 session 的失效時(shí)間,單位為秒
int getMaxInactiveInterval() 獲取當(dāng)前 session 的失效時(shí)間
void invalidate() 設(shè)置 session ?即失效
void setAttribute(String key,Object value) 通過(guò)鍵值對(duì)的形式來(lái)存儲(chǔ)數(shù)據(jù)
Object getAttribute(String key) 通過(guò)鍵獲取對(duì)應(yīng)的數(shù)據(jù)
void removeAttribute(String key) 通過(guò)鍵刪除對(duì)應(yīng)的數(shù)據(jù)
Cookie
Cookie 是服務(wù)端在 HTTP 響應(yīng)中附帶傳給瀏覽器的?個(gè)??本?件,?旦瀏覽器保存了某個(gè) Cookie,
在之后的請(qǐng)求和響應(yīng)過(guò)程中,會(huì)將此 Cookie 來(lái)回傳遞,這樣就可以通過(guò) Cookie 這個(gè)載體完成客戶端
和服務(wù)端的數(shù)據(jù)交互。
- 創(chuàng)建 Cookie
- 讀取 Cookie
Cookie 常?的?法
void setMaxAge(int age) 設(shè)置 Cookie 的有效時(shí)間,單位為秒
int getMaxAge() 獲取 Cookie 的有效時(shí)間
String getName() 獲取 Cookie 的 name
String getValue() 獲取 Cookie 的 value
Session 和 Cookie 的區(qū)別
session:保存在服務(wù)器
保存的數(shù)據(jù)是 Object
會(huì)隨著會(huì)話的結(jié)束?銷(xiāo)毀
保存重要信息
cookie:保存在瀏覽器
保存的數(shù)據(jù)是 String
可以?期保存在瀏覽器中,?會(huì)話?關(guān)
保存不重要信息
存儲(chǔ)?戶信息:
session:
?命周期:服務(wù)端:只要 WEB 應(yīng)?重啟就銷(xiāo)毀,客戶端:只要瀏覽器關(guān)閉就銷(xiāo)毀。
退出登錄:session.invalidate()
cookie:
response.addCookie(new Cookie(name,"admin")) //存Cookie[] cookies = request.getCookies(); //取 for (Cookie cookie:cookies){if(cookie.getName().equals("name")){out.write("歡迎回來(lái)"+cookie.getValue());} }?命周期:不隨服務(wù)端的重啟?銷(xiāo)毀,客戶端:默認(rèn)是只要關(guān)閉瀏覽器就銷(xiāo)毀,我們通過(guò) setMaxAge()
?法設(shè)置有效期,?旦設(shè)置了有效期,則不隨瀏覽器的關(guān)閉?銷(xiāo)毀,?是由設(shè)置的時(shí)間來(lái)決定。
退出登錄:setMaxAge(0)
JSP 內(nèi)置對(duì)象作?域
4個(gè)
page、request、session、application
setAttribute、getAttribute
page 作?域:對(duì)應(yīng)的內(nèi)置對(duì)象是 pageContext。
request 作?域:對(duì)應(yīng)的內(nèi)置對(duì)象是 request。
session 作?域:對(duì)應(yīng)的內(nèi)置對(duì)象是 session。
application 作?域:對(duì)應(yīng)的內(nèi)置對(duì)象是 application。
page < request < session < application
page 只在當(dāng)前??有效。
request 在?次請(qǐng)求內(nèi)有效。
session 在?次會(huì)話內(nèi)有效。
application 對(duì)應(yīng)整個(gè) WEB 應(yīng)?的。
- ?站訪問(wèn)量統(tǒng)計(jì)
EL 表達(dá)式
Expression Language 表達(dá)式語(yǔ)?,替代 JSP ??中數(shù)據(jù)訪問(wèn)時(shí)的復(fù)雜編碼,可以?常便捷地取出域?qū)?br /> 象(pageContext、request、session、application)中保存的數(shù)據(jù),前提是?定要先 setAttribute,
EL 就相當(dāng)于在簡(jiǎn)化 getAttribute
${變量名} 變量名就是 setAttribute 對(duì)應(yīng)的 key 值。
1、EL 對(duì)于 4 種域?qū)ο蟮哪J(rèn)查找順序:
pageContext ====> request ====> session ====> application
按照上述的順序進(jìn)?查找,找到?即返回,在 application 中也?法找到,則返回 null
2、指定作?域進(jìn)?查找
pageContext:${pageScope.name}
request:${requestScope.name}
session:${sessionScope.name}
application:${applicationScope.name}
數(shù)據(jù)級(jí)聯(lián):
<% // 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>編號(hào)</th><th>姓名</th><th>成績(jī)</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 執(zhí)?表達(dá)式:
${num1&&num2} && || ! < > <= <= == && and || or ! not == eq != ne < lt > gt <= le >= ge empty //變量為 null,?度為0的String,size為0的集合
JSTL
JSP Standard Tag Library JSP 標(biāo)準(zhǔn)標(biāo)簽庫(kù),JSP 為開(kāi)發(fā)者提供的?系列的標(biāo)簽,使?這些標(biāo)簽可以完成
?些邏輯處理,?如循環(huán)遍歷集合,讓代碼更加簡(jiǎn)潔,不再出現(xiàn) JSP 腳本穿插的情況。
實(shí)際開(kāi)發(fā)中 EL 和 JSTL 結(jié)合起來(lái)使?,JSTL 側(cè)重于邏輯處理,EL 負(fù)責(zé)展示數(shù)據(jù)。
JSTL 的使?
1、需要導(dǎo)? jar 包(兩個(gè) jstl.jar standard.jar)存放的位置 web/WEB-INF
2、在 JSP ??開(kāi)始的地?導(dǎo)? JSTL 標(biāo)簽庫(kù)
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 優(yōu)點(diǎn):
1、提供了統(tǒng)?的標(biāo)簽
2、可以?于編寫(xiě)各種動(dòng)態(tài)功能
- 核?標(biāo)簽庫(kù)常?標(biāo)簽:
set、out、remove、catch
set:向域?qū)ο笾刑砑訑?shù)據(jù)
<%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:輸出域?qū)ο笾械臄?shù)據(jù)
<c:set var="name" value="tom"></c:set> <c:out value="${name}" default="未定義"></c:out>remove:刪除域?qū)ο笾械臄?shù)據(jù)
<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}- 條件標(biāo)簽:if choose
- 迭代標(biāo)簽:forEach
格式化標(biāo)簽庫(kù)常?的標(biāo)簽:
<%@ 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>函數(shù)標(biāo)簽庫(kù)常?的標(biāo)簽:
<%@ 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]}過(guò)濾器 Filter
功能:
1、?來(lái)攔截傳?的請(qǐng)求和傳出的響應(yīng)。
2、修改或以某種?式處理正在客戶端和服務(wù)端之間交換的數(shù)據(jù)流。
如何使??
與使? Servlet 類(lèi)似,Filter 是 Java WEB 提供的?個(gè)接?,開(kāi)發(fā)者只需要?定義?個(gè)類(lèi)并且實(shí)現(xiàn)該接?
即可。
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 ?法中處理完業(yè)務(wù)邏輯之后,必須添加filterChain.doFilter(servletRequest,servletResponse);
否則請(qǐng)求/響應(yīng)?法向后傳遞,?直停留在過(guò)濾器中。
Filter 的?命周期
當(dāng) Tomcat 啟動(dòng)時(shí),通過(guò)反射機(jī)制調(diào)? Filter 的?參構(gòu)造函數(shù)創(chuàng)建實(shí)例化對(duì)象,同時(shí)調(diào)? init ?法實(shí)現(xiàn)
初始化,doFilter ?法調(diào)?多次,當(dāng) Tomcat 服務(wù)關(guān)閉的時(shí)候,調(diào)? destory 來(lái)銷(xiāo)毀 Filter 對(duì)象。
?參構(gòu)造函數(shù):只調(diào)??次,當(dāng) Tomcat 啟動(dòng)時(shí)調(diào)?(Filter ?定要進(jìn)?配置)
init ?法:只調(diào)??次,當(dāng) Filter 的實(shí)例化對(duì)象創(chuàng)建完成之后調(diào)?
doFilter:調(diào)?多次,訪問(wèn) Filter 的業(yè)務(wù)邏輯都寫(xiě)在 Filter 中
destory:只調(diào)??次,Tomcat 關(guān)閉時(shí)調(diào)?。
同時(shí)配置多個(gè) Filter,Filter 的調(diào)?順序是由 web.xml 中的配置順序來(lái)決定的,寫(xiě)在上?的配置先調(diào)
?,因?yàn)?web.xml 是從上到下順序讀取的。
1、MyFilter
2、CharacterFilter
也可以通過(guò)注解的?式來(lái)簡(jiǎn)化 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 的使?場(chǎng)景
實(shí)際開(kāi)發(fā)中 Filter 的使?場(chǎng)景:
1、統(tǒng)?處理中?亂碼。
2、屏蔽敏感詞。
3、控制資源的訪問(wèn)權(quán)限。
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){//不是登錄狀態(tài)response.sendRedirect("/login.jsp");}else{filterChain.doFilter(servletRequest,servletResponse);}} }?件上傳下載
- JSP
1、input 的 type 設(shè)置為 file
2、form 表單的 method 設(shè)置 post,get 請(qǐng)求會(huì)將?件名傳給服務(wù)端,?不是?件本身
3、form 表單的 enctype 設(shè)置 multipart/form-data,以?進(jìn)制的形式傳輸數(shù)據(jù)
- Servlet
fileupload 組件可以將所有的請(qǐng)求信息都解析成 FileIteam 對(duì)象,可以通過(guò)對(duì) FileItem 對(duì)象的操作完成上傳,?向?qū)ο蟮乃枷搿?/li>
?件下載
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;}//設(shè)置響應(yīng)?式resp.setContentType("application/x-msdownload");//設(shè)置下載之后的?件名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 不是新的編程,指的是?種交互?式,異步加載,客戶端和服務(wù)器的數(shù)據(jù)交互更新在局部??的
技術(shù),不需要刷新整個(gè)??(局部刷新)
優(yōu)點(diǎn):
1、局部刷新,效率更?
2、?戶體驗(yàn)更好
【注】:同步:(打電話);異步:(發(fā)微信)
基于 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>不能?表單提交請(qǐng)求,改? jQuery ?式動(dòng)態(tài)綁定事件來(lái)提交。
Servlet 不能跳轉(zhuǎn)到 JSP,只能將數(shù)據(jù)返回
傳統(tǒng)的 WEB 數(shù)據(jù)交互 VS AJAX 數(shù)據(jù)交互
- 客戶端請(qǐng)求的?式不同:
傳統(tǒng):瀏覽器發(fā)送同步請(qǐng)求 (form、a)
AJAX:異步引擎對(duì)象發(fā)送異步請(qǐng)求 - 服務(wù)器響應(yīng)的?式不同:
傳統(tǒng):響應(yīng)?個(gè)完整 JSP ??(視圖)
AJAX:響應(yīng)需要的數(shù)據(jù) - 客戶端處理?式不同:
傳統(tǒng):需要等待服務(wù)器完成響應(yīng)并且重新加載整個(gè)??之后,?戶才能進(jìn)?后續(xù)的操作
AJAX:動(dòng)態(tài)更新??中的局部?jī)?nèi)容,不影響?戶的其他操作
AJAX 原理
基于 jQuery 的 AJAX 語(yǔ)法
$.ajax({屬性})
常?的屬性參數(shù):
url:請(qǐng)求的后端服務(wù)地址
type:請(qǐng)求?式,默認(rèn) get
data:請(qǐng)求參數(shù)
dataType:服務(wù)器返回的數(shù)據(jù)類(lèi)型,text/json
success:請(qǐng)求成功的回調(diào)函數(shù)
error:請(qǐng)求失敗的回調(diào)函數(shù)
complete:請(qǐng)求完成的回調(diào)函數(shù)(?論成功或者失敗,都會(huì)調(diào)?)
JSON
JavaScript Object Notation,?種輕量級(jí)數(shù)據(jù)交互格式,完成 js 與 Java 等后端開(kāi)發(fā)語(yǔ)?對(duì)象數(shù)據(jù)之間
的轉(zhuǎn)換。
客戶端和服務(wù)器之間傳遞對(duì)象數(shù)據(jù),需要? JSON 格式。
AJAX的簡(jiǎn)單應(yīng)用
<%@ 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>區(qū):<select id="area"><option>雁塔區(qū)</option><option>蓮湖區(qū)</option><option>新城區(qū)</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("雁塔區(qū)");areas.add("蓮湖區(qū)");areas.add("新城區(qū)");cityMap.put("?安市",areas);//寶雞areas = new ArrayList<>();areas.add("陳倉(cāng)區(qū)");areas.add("渭賓區(qū)");areas.add("新城區(qū)");cityMap.put("寶雞市",areas);//渭南areas = new ArrayList<>();areas.add("臨渭區(qū)");areas.add("?新區(qū)");cityMap.put("渭南市",areas);//鄭州areas = new ArrayList<>();areas.add("鄭州A區(qū)");areas.add("鄭州B區(qū)");cityMap.put("鄭州市",areas);//洛陽(yáng)areas = new ArrayList<>();areas.add("洛陽(yáng)A區(qū)");areas.add("洛陽(yáng)B區(qū)");cityMap.put("洛陽(yáng)市",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("洛陽(yáng)市");cities.add("開(kāi)封市");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 是?個(gè)獨(dú)?于特定數(shù)據(jù)庫(kù)的管理系統(tǒng),通?的 SQL 數(shù)據(jù)庫(kù)存取和操作的公
共接?。
定義了?組標(biāo)準(zhǔn),為訪問(wèn)不同數(shù)據(jù)庫(kù)提供了統(tǒng)?的途徑。
JDBC 體系結(jié)構(gòu)
JDBC 接?包括兩個(gè)層?:
- ?向應(yīng)?的 API,供程序員調(diào)?
- ?向數(shù)據(jù)庫(kù)的 API,供?商開(kāi)發(fā)數(shù)據(jù)庫(kù)的驅(qū)動(dòng)程序
JDBC API
提供者:Java 官?
內(nèi)容:供開(kāi)發(fā)者調(diào)?的接?
java.sql 和 javax.sql
- DriverManager 類(lèi)
- Connection 接?
- Statement 接?
- ResultSet 接?
DriverManager
提供者:Java 官?
作?:管理不同的 JDBC 驅(qū)動(dòng)
JDBC 驅(qū)動(dòng)
提供者:數(shù)據(jù)庫(kù)?商
作?:負(fù)責(zé)連接不同的數(shù)據(jù)庫(kù)
JDBC 的使?
1、加載數(shù)據(jù)庫(kù)驅(qū)動(dòng),Java 程序和數(shù)據(jù)庫(kù)之間的橋梁。
2、獲取 Connection,Java 程序與數(shù)據(jù)庫(kù)的?次連接。
3、創(chuàng)建 Statement 對(duì)象,由 Connection 產(chǎn)?,執(zhí)? SQL 語(yǔ)句。
4、如果需要接收返回值,創(chuàng)建 ResultSet 對(duì)象,保存 Statement 執(zhí)?之后所查詢到的結(jié)果。
PreparedStatement
Statement 的?類(lèi),提供了 SQL 占位符的功能
使? Statement 進(jìn)?開(kāi)發(fā)有兩個(gè)問(wèn)題:
1、需要頻繁拼接 String 字符串,出錯(cuò)率較?。
2、存在 SQL 注?的?險(xiǎn)。
SQL 注?:利?某些系統(tǒng)沒(méi)有對(duì)?戶輸?的信息進(jìn)?充分檢測(cè),在?戶輸?的數(shù)據(jù)中注??法的 SQL
語(yǔ)句,從?利?系統(tǒng)的 SQL 引擎完成惡意?為的做法。
數(shù)據(jù)庫(kù)連接池
JDBC 開(kāi)發(fā)流程
- 加載驅(qū)動(dòng)(只需要加載?次)
- 建?數(shù)據(jù)庫(kù)連接(Connection)
- 執(zhí)? SQL 語(yǔ)句(Statement)
- ResultSet 接收結(jié)果集(查詢)
- 斷開(kāi)連接,釋放資源
數(shù)據(jù)庫(kù)連接對(duì)象是通過(guò) DriverManager 來(lái)獲取的,每次獲取都需要向數(shù)據(jù)庫(kù)申請(qǐng)獲取連接,驗(yàn)證?戶
名和密碼,執(zhí)?完 SQL 語(yǔ)句后斷開(kāi)連接,這樣的?式會(huì)造成資源的浪費(fèi),數(shù)據(jù)連接資源沒(méi)有得到很好的重復(fù)利?。(栗子:就像是你每次打一個(gè)電話都要買(mǎi)一個(gè)手機(jī),打完一個(gè)電話就把手機(jī)扔了,很浪費(fèi),為什么我們不一直使用第一次買(mǎi)的手機(jī)一直打電話呢?)
可以使?數(shù)據(jù)庫(kù)連接池解決這?問(wèn)題。
數(shù)據(jù)庫(kù)連接池的基本思想就是為數(shù)據(jù)庫(kù)建??個(gè)緩沖池,預(yù)先向緩沖池中放??定數(shù)量的連接對(duì)象,當(dāng)需要獲取數(shù)據(jù)庫(kù)連接的時(shí)候,只需要從緩沖池中取出?個(gè)對(duì)象,?完之后再放回到緩沖池中,供下?次請(qǐng)求使?,做到了資源的重復(fù)利?,允許程序重復(fù)使??個(gè)現(xiàn)有的數(shù)據(jù)庫(kù)連接對(duì)象,?不需要重新創(chuàng)
建。
當(dāng)數(shù)據(jù)庫(kù)連接池中沒(méi)有空閑的連接時(shí),新的請(qǐng)求就會(huì)進(jìn)?等待隊(duì)列,等待其他線程釋放連接。
數(shù)據(jù)庫(kù)連接池實(shí)現(xiàn)
JDBC 的數(shù)據(jù)庫(kù)連接池使? javax.sql.DataSource 接?來(lái)完成的,DataSource 是 Java 官?提供的接
?,使?的時(shí)候開(kāi)發(fā)者并不需要??來(lái)實(shí)現(xiàn)該接?,可以使?第三?的?具,C3P0 是?個(gè)常?的第三
?實(shí)現(xiàn),實(shí)際開(kāi)發(fā)中直接使? C3P0 即可完成數(shù)據(jù)庫(kù)連接池的操作。
1、導(dǎo)? jar 包
傳統(tǒng)?式拿到的 Connection:com.mysql.cj.jdbc.ConnectionImpl@557caf28
C3P0 拿到的 Connection:com.mchange.v2.c3p0.impl.NewProxyConnection@4988d8b8
2、代碼實(shí)現(xiàn)
實(shí)際開(kāi)發(fā),將 C3P0 的配置信息定義在 xml ?件中,Java 程序只需要加載配置?件即可完成數(shù)據(jù)庫(kù)連接
池的初始化操作。
1、配置?件的名字必須是 c3p0-config.xml
2、初始化 ComboPooledDataSource 時(shí),傳?的參數(shù)必須是 c3p0-config.xml 中 named-config 標(biāo)簽的 name 屬性值。
DBUtils
DBUtils 可以幫助開(kāi)發(fā)者完成數(shù)據(jù)的封裝(結(jié)果集到 Java 對(duì)象的映射)
1、導(dǎo)? jar 包
ResultHandler 接?是?來(lái)處理結(jié)果集,可以將查詢到的結(jié)果集轉(zhuǎn)換成 Java 對(duì)象,提供了 4 種實(shí)現(xiàn)類(lèi)。
- BeanHandler 將結(jié)果集映射成 Java 對(duì)象 Student
- BeanListHandler 將結(jié)果集映射成 List 集合List <Student >
- MapHandler 將結(jié)果集映射成 Map 對(duì)象
- MapListHandler 將結(jié)果集映射成 MapList 結(jié)合
【注】:根據(jù)返回值決定以上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; }
【代碼來(lái)源】參考楠哥教學(xué)視頻:https://www.bilibili.com/video/BV1BJ411L7NR
【JavaWeb實(shí)戰(zhàn)代碼及所需jar包】:https://download.csdn.net/download/hhhmonkey/21516713
總結(jié)
以上是生活随笔為你收集整理的JavaWeb基础学习笔记的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問(wèn)題。
- 上一篇: 实现一个简单的模板引擎,输入模板和数据,
- 下一篇: SpringMVC学习笔记