-
什么是JDBC劈猪?
JDBC(Java DataBase Connectivity),是一套面向?qū)ο蟮膽?yīng)用程序接口(API),制定了統(tǒng)一的訪問各類關(guān)系數(shù)據(jù)庫的標(biāo)準(zhǔn)接口低剔,為各個(gè)數(shù)據(jù)庫廠商提供了標(biāo)準(zhǔn)的實(shí)現(xiàn)瞒渠。通過JDBC技術(shù)皮璧,開發(fā)人員可以用純Java語言和標(biāo)準(zhǔn)的SQL語句編寫完整的數(shù)據(jù)庫應(yīng)用程序技潘,并且真正地實(shí)現(xiàn)了軟件的跨平臺(tái)性遥巴。
-
通常情況下使用JDBC完成以下操作:
①同數(shù)據(jù)庫建立連接千康;
②向數(shù)據(jù)庫發(fā)送SQL語句;
③處理從數(shù)據(jù)庫返回的結(jié)果挪哄; - 驅(qū)動(dòng)(Driver)在JDBC中的角色
jdbc本身是一套接口吧秕,驅(qū)動(dòng)其實(shí)就是它的實(shí)現(xiàn)類琉闪,只有提供了驅(qū)動(dòng)才能與對(duì)應(yīng)的數(shù)據(jù)庫建立連接的通道迹炼。驅(qū)動(dòng)必須要提供java.sql包下面這些類的實(shí)現(xiàn):Connection, Statement, PreparedStatement,CallableStatement, ResultSet和Driver。 - Class.forName()方法
Class.forName(xxx.xx.xx)的作用是初始化參數(shù)指定的類颠毙,并且返回此類對(duì)應(yīng)的Class 對(duì)象斯入,即要求JVM查找并加載指定的類。forName() + newinstance()
和new
的作用相當(dāng)蛀蜜,如A a =(A) Class.forName ("pacage.A").newInstance()
這和A a =new A();
是一樣的效果刻两。
JDBC中使用class.forname()加載驅(qū)動(dòng)。
-
PreparedStatement比Statement有什么優(yōu)勢滴某?
PreparedStatements作為statement的子類磅摹,繼承了statement的所有方法
- PreparedStatement是預(yù)編譯的,性能會(huì)比Statement好
- PreparedStatement可以防止sql注入霎奢,安全性比Statement高
- PreparedStatements可以寫動(dòng)態(tài)參數(shù)化的查詢户誓,提高了代碼的可擴(kuò)展性與可維護(hù)性
數(shù)據(jù)庫連接池是什么意思?
數(shù)據(jù)庫連接的建立幕侠、關(guān)閉資源消耗巨大帝美。
傳統(tǒng)數(shù)據(jù)庫訪問方式:一次數(shù)據(jù)訪問對(duì)應(yīng)一個(gè)物理連接,每次操作數(shù)據(jù)庫都要打開關(guān)閉該物理連接晤硕,系統(tǒng)性能嚴(yán)重受損悼潭。
解決方案:數(shù)據(jù)庫連接池。系統(tǒng)初始運(yùn)行時(shí)舞箍,主動(dòng)建立足夠足夠的連接舰褪,組成一個(gè)池,每次應(yīng)用程序請(qǐng)求數(shù)據(jù)庫連接時(shí)疏橄,無需重新打開連接抵知,而是從池中取出已有的連接,使用完后软族,不再關(guān)閉刷喜,而是歸還。什么是RMI立砸?
- 定義:Remote Method Invocation掖疮,遠(yuǎn)程方法調(diào)用,是Java所特有的分布式計(jì)算技術(shù)颗祝。其基本原則就是把對(duì)象的使用和對(duì)象的創(chuàng)建相分離浊闪,它允許運(yùn)行在一個(gè)Java虛擬機(jī)上的對(duì)象調(diào)用運(yùn)行在另一個(gè)Java虛擬機(jī)上的對(duì)象的方法恼布。
- 開發(fā)步驟:
①定義一個(gè)遠(yuǎn)程接口(遠(yuǎn)程接口必須繼承接口,每個(gè)方法必須拋出遠(yuǎn)程異常搁宾,方法參數(shù)和方法返回值都必須是可序列化的)
②實(shí)現(xiàn)遠(yuǎn)程接口
③定義使用遠(yuǎn)程對(duì)象的客戶程序
④產(chǎn)生遠(yuǎn)程訪問對(duì)象的樁和框
⑤注冊遠(yuǎn)程對(duì)象
⑥運(yùn)行服務(wù)器和客戶程序 - RMI體系結(jié)構(gòu)
①存根和骨架層(Stub and Skeleton layer):這一層對(duì)程序員是透明的折汞,它主要負(fù)責(zé)攔截客戶端發(fā)出的方法調(diào)用請(qǐng)求,然后把請(qǐng)求重定向給遠(yuǎn)程的RMI服務(wù)盖腿。
②遠(yuǎn)程引用層(Remote Reference Layer):RMI體系結(jié)構(gòu)的第二層用來解析客戶端對(duì)服務(wù)端遠(yuǎn)程對(duì)象的引用爽待。這一層解析并管理客戶端對(duì)服務(wù)端遠(yuǎn)程對(duì)象的引用。連接是點(diǎn)到點(diǎn)的翩腐。
③傳輸層(Transport layer):這一層負(fù)責(zé)連接參與服務(wù)的兩個(gè)JVM鸟款。這一層是建立在網(wǎng)絡(luò)上機(jī)器間的TCP/IP連接之上的。它提供了基本的連接服務(wù)茂卦,還有一些防火墻穿透策略何什。 -
java.rmi.Naming
類
該類主要用于存儲(chǔ)或獲取遠(yuǎn)程對(duì)象的引用,參數(shù)是是URL格式的String等龙。
bind
和rebind
方法注冊對(duì)象处渣,把對(duì)象與一個(gè)名字name綁定。比如蛛砰,通過Naming.rebind("http://localhost/MyServer", new ServerOperation());
將ServerOperation
對(duì)象賦給一個(gè)URI罐栈,讓客戶端可以通過這個(gè)URI訪問該對(duì)象。其中bind
需要未綁定的地址暴备,否則將會(huì)報(bào)錯(cuò)悠瞬。 - 分布式垃圾回收(DGC)
當(dāng)客戶機(jī)創(chuàng)建(序列化)遠(yuǎn)程引用時(shí),會(huì)在服務(wù)器端 DGC 上調(diào)用 dirty()涯捻。當(dāng)客戶機(jī)完成遠(yuǎn)程引用后浅妆,它會(huì)調(diào)用對(duì)應(yīng)的 clean() 方法。 -
Marshalling
和demarshalling
Marshalling就是object->xml障癌,把內(nèi)存對(duì)象跨網(wǎng)絡(luò)傳遞到另一臺(tái)主機(jī)或者是持久化到存儲(chǔ)凌外,demarshalling是其反過程。
-
什么是Servlet涛浙?
servlet是基于java語言的web服務(wù)器端編程技術(shù)康辑,運(yùn)行在servlet容器中的java類,它能處理客戶端的http請(qǐng)求并產(chǎn)生http響應(yīng)轿亮。
- 體系結(jié)構(gòu):
Servlet類 ← GenericServlet類 ← HttpServlet類 ← MyServlet類(自己建的類) (←代表繼承)
①GenericServlet類實(shí)現(xiàn)了Servlet和ServletConfig接口疮薇。實(shí)現(xiàn)了除了service()之外的其他方法,在創(chuàng)建Servlet對(duì)象時(shí)我注,可以繼承GenericServlet類來簡化程序的代碼按咒,但需要實(shí)現(xiàn)service()方法。
②HttpServlet類繼承了GeneriServlet類但骨。實(shí)際開發(fā)中励七,通常繼承HttpServlet類智袭,重寫我們需要的doGet(),doPost()請(qǐng)求即可掠抬。 - 使用過程
①init()初試化Servlet
②service()相應(yīng)Servlet請(qǐng)求
③destroy()銷毀Servlet -
doGet
和doPOST
分別用于處理get和post請(qǐng)求吼野。Get是路徑傳參,效率高两波,安全性差瞳步;POST是實(shí)體傳參,效率低雨女,安全性好谚攒。 - Servlet鏈(Servlet Chaining):是把一個(gè)Servlet的輸出發(fā)送給另一個(gè)Servlet的方法阳准,依次類推氛堕。鏈條上最后一個(gè)Servlet負(fù)責(zé)把響應(yīng)發(fā)送給客戶端。提供了將一個(gè)servlet的輸出重定向?yàn)榱硪粋€(gè)servlet的輸入的能力野蝇,這樣就可以劃分工作讼稚。
- 判斷Servlet請(qǐng)求來源
request.getRemoteAddr();//ipaddr
request.getRemoteHost();//主機(jī)名
request.getRequestURL();//返回全路徑
request.getRequestURI();//返回除去host(域名或者ip)部分的路徑
request.getContextPath();//返回工程名部分,如果工程映射為/绕沈,此處返回則為空
request.getServletPath();//返回除去host和工程名部分的路徑
- 什么是JSP
- jsp的9個(gè)內(nèi)置對(duì)象
request:封裝客戶端的請(qǐng)求锐想,其中包含來自GET或POST請(qǐng)求的參數(shù);
response:封裝服務(wù)器對(duì)客戶端的響應(yīng)乍狐;
pageContext:通過該對(duì)象可以獲取其他對(duì)象赠摇;
session:封裝用戶會(huì)話的對(duì)象;
application:封裝服務(wù)器運(yùn)行環(huán)境的對(duì)象浅蚪;
out:輸出服務(wù)器響應(yīng)的輸出流對(duì)象藕帜;
config:Web應(yīng)用的配置對(duì)象;
page:JSP頁面本身(相當(dāng)于Java程序中的this)惜傲;
exception:封裝頁面拋出異常的對(duì)象洽故。
- jsp的4個(gè)作用域
page
代表與一個(gè)頁面相關(guān)的對(duì)象和屬性。
request
代表與Web客戶機(jī)發(fā)出的一個(gè)請(qǐng)求相關(guān)的對(duì)象和屬性盗誊。
session
代表與某個(gè)用戶與服務(wù)器建立的一次會(huì)話相關(guān)的對(duì)象和屬性时甚。
application
代表與整個(gè)Web應(yīng)用程序相關(guān)的對(duì)象和屬性。
- jsp 和 servlet
JSP的本質(zhì)就是Servlet哈踱,是Servlet的一種簡化荒适,jsp經(jīng)編譯后就變成了Servlet。
① jsp更擅長表現(xiàn)于頁面顯示开镣,servlet更擅長于邏輯控制刀诬。
② Servlet中沒有內(nèi)置對(duì)象,Jsp中有內(nèi)置對(duì)象
- session和cookie有什么區(qū)別哑子?
- 區(qū)別:cookie保存在客戶端瀏覽器中舅列,而session保存在服務(wù)器上肌割。
-
cookie
:實(shí)際上是一小段的文本信息。服務(wù)器還可以根據(jù)需要修改cookie的內(nèi)容帐要。
過程:客戶端請(qǐng)求服務(wù)——>服務(wù)器向客戶端瀏覽器頒發(fā)一個(gè)cookie——>客戶端瀏覽器保存cookie——>客戶端請(qǐng)求服務(wù)——>客戶端發(fā)送請(qǐng)求地址和cookie——>服務(wù)器檢查該cookie把敞,從而判斷用戶的狀態(tài)。
典型的應(yīng)用如榨惠,將用戶名和密碼信息存入cookie中奋早,下次登錄時(shí)讀取cookie內(nèi)容能自動(dòng)填入。 -
session
:另一種記錄客戶狀態(tài)的機(jī)制赠橙。不同的是客戶端瀏覽器訪問服務(wù)器的時(shí)候耽装,服務(wù)器把客戶端信息以某種形式記錄在服務(wù)器上,這就是session期揪。類似于一個(gè)大號(hào)的map掉奄,里面的鍵存儲(chǔ)的是用戶的Session ID。一般Session ID是通過Cookie來傳遞的凤薛。但禁用cookie之后姓建,也可以通過URL傳值等方式獲取ID從而使用session。
缤苫。
- HTTP請(qǐng)求和響應(yīng)結(jié)構(gòu)
- HTTP響應(yīng)由三部分組成:狀態(tài)行速兔、響應(yīng)頭、響應(yīng)正文:
狀態(tài)行
:包括協(xié)議版本Version活玲、狀態(tài)碼Status Code涣狗、回應(yīng)短語;
響應(yīng)頭
:包括搭建服務(wù)器的軟件舒憾,發(fā)送響應(yīng)的時(shí)間镀钓,回應(yīng)數(shù)據(jù)的格式等信息;
響應(yīng)正文
:就是響應(yīng)的具體數(shù)據(jù)珍剑。 - HTTP請(qǐng)求由狀態(tài)行掸宛、請(qǐng)求頭、請(qǐng)求正文三部分組成:
狀態(tài)行
:包括請(qǐng)求方式Method招拙、資源路徑URL唧瘾、協(xié)議版本Version;
請(qǐng)求頭
:包括一些訪問的域名别凤、用戶***饰序、Cookie等信息;
請(qǐng)求正文
:就是HTTP請(qǐng)求的數(shù)據(jù)规哪。
HTTP隧道
有時(shí)候需要訪問服務(wù)器除了80端口之外的其他端口求豫,但是服務(wù)器上裝有的防火墻軟件 會(huì)阻止客戶端訪問除了80端口之外的其他端口,這個(gè)時(shí)候需要將訪問其他端口的協(xié)議“包裝”一下 變成訪問80端口的http協(xié)議,這個(gè)就是http隧道蝠嘉。sendRedirect()和forward()方法有什么區(qū)別最疆?
forward(轉(zhuǎn)發(fā)):是服務(wù)器內(nèi)部的跳轉(zhuǎn),瀏覽器的地址欄不會(huì)發(fā)生變化蚤告,同時(shí)可以把request和response傳遞給后一個(gè)請(qǐng)求努酸。
sendRedirect(重定向):是瀏覽器方面的跳轉(zhuǎn),要發(fā)送兩次請(qǐng)求杜恰,地址欄也會(huì)發(fā)生變化获诈,同時(shí)request和response也會(huì)發(fā)生變化,重新生成新的對(duì)象心褐。