- Servlet總結(jié)
- 闡述Servlet和CGI的區(qū)別?
- CGI的不足之處:
- Servlet的優(yōu)點(diǎn):
- Servlet接口中有哪些方法及Servlet生命周期探秘
- get和post請(qǐng)求的區(qū)別
- 什么情況下調(diào)用doGet()和doPost()
- 轉(zhuǎn)發(fā)(Forward)和重定向(Redirect)的區(qū)別
- 自動(dòng)刷新(Refresh)
- Servlet與線程安全
- JSP和Servlet是什么關(guān)系
- JSP工作原理
- JSP有哪些內(nèi)置對(duì)象轰枝、作用分別是什么
- Request對(duì)象的主要方法有哪些
- request.getAttribute()和 request.getParameter()有何區(qū)別
1.Servlet總結(jié)
在Java Web程序中召廷,Servlet主要負(fù)責(zé)接收用戶請(qǐng)求HttpServletRequest,在doGet(),doPost()中做相應(yīng)的處理鼻吮,并將回應(yīng)HttpServletResponse反饋給用戶拂铡。Servlet可以設(shè)置初始化參數(shù)殷绍,供Servlet內(nèi)部使用萨螺。一個(gè)Servlet類只會(huì)有一個(gè)實(shí)例决乎,在它初始化時(shí)調(diào)用init()方法岳悟,銷毀時(shí)調(diào)用destroy()方法佃迄。Servlet需要在web.xml中配置(MyEclipse中創(chuàng)建Servlet會(huì)自動(dòng)配置),一個(gè)Servlet可以設(shè)置多個(gè)URL訪問(wèn)贵少。Servlet不是線程安全呵俏,因此要謹(jǐn)慎使用類變量。
2.闡述Servlet和CGI的區(qū)別?
3.CGI的不足之處:
1滔灶,需要為每個(gè)請(qǐng)求啟動(dòng)一個(gè)操作CGI程序的系統(tǒng)進(jìn)程普碎。如果請(qǐng)求頻繁,這將會(huì)帶來(lái)很大的開銷录平。
2麻车,需要為每個(gè)請(qǐng)求加載和運(yùn)行一個(gè)CGI程序缀皱,這將帶來(lái)很大的開銷
3,需要重復(fù)編寫處理網(wǎng)絡(luò)協(xié)議的代碼以及編碼动猬,這些工作都是非常耗時(shí)的啤斗。
4.Servlet的優(yōu)點(diǎn):
1,只需要啟動(dòng)一個(gè)操作系統(tǒng)進(jìn)程以及加載一個(gè)JVM枣察,大大降低了系統(tǒng)的開銷
2争占,如果多個(gè)請(qǐng)求需要做同樣處理的時(shí)候,這時(shí)候只需要加載一個(gè)類序目,這也大大降低了開銷
3臂痕,所有動(dòng)態(tài)加載的類可以實(shí)現(xiàn)對(duì)網(wǎng)絡(luò)協(xié)議以及請(qǐng)求解碼的共享,大大降低了工作量猿涨。
4握童,Servlet能直接和Web服務(wù)器交互,而普通的CGI程序不能叛赚。Servlet還能在各個(gè)程序之間共享數(shù)據(jù)澡绩,使數(shù)據(jù)庫(kù)連接池之類的功能很容易實(shí)現(xiàn)。
補(bǔ)充:Sun Microsystems公司在1996年發(fā)布Servlet技術(shù)就是為了和CGI進(jìn)行競(jìng)爭(zhēng)俺附,Servlet是一個(gè)特殊的Java程序肥卡,一個(gè)基于Java的Web應(yīng)用通常包含一個(gè)或多個(gè)Servlet類。Servlet不能夠自行創(chuàng)建并執(zhí)行事镣,它是在Servlet容器中運(yùn)行的步鉴,容器將用戶的請(qǐng)求傳遞給Servlet程序,并將Servlet的響應(yīng)回傳給用戶璃哟。通常一個(gè)Servlet會(huì)關(guān)聯(lián)一個(gè)或多個(gè)JSP頁(yè)面氛琢。以前CGI經(jīng)常因?yàn)樾阅荛_銷上的問(wèn)題被詬病,然而Fast CGI早就已經(jīng)解決了CGI效率上的問(wèn)題随闪,所以面試的時(shí)候大可不必信口開河的詬病CGI阳似,事實(shí)上有很多你熟悉的網(wǎng)站都使用了CGI技術(shù)绝淡。
參考:《javaweb整合開發(fā)王者歸來(lái)》P7
5.Servlet接口中有哪些方法及Servlet生命周期探秘
Servlet接口定義了5個(gè)方法屋确,其中前三個(gè)方法與Servlet生命周期相關(guān):
- void init(ServletConfig config) throws ServletException
- void service(ServletRequest req, ServletResponse resp) throws ServletException, java.io.IOException
- void destory()
- java.lang.String getServletInfo()
- ServletConfig getServletConfig()
生命周期: Web容器加載Servlet并將其實(shí)例化后,Servlet生命周期開始弯菊,容器運(yùn)行其init()方法進(jìn)行Servlet的初始化盛杰;請(qǐng)求到達(dá)時(shí)調(diào)用Servlet的service()方法挽荡,service()方法會(huì)根據(jù)需要調(diào)用與請(qǐng)求對(duì)應(yīng)的doGet或doPost等方法;當(dāng)服務(wù)器關(guān)閉或項(xiàng)目被卸載時(shí)服務(wù)器會(huì)將Servlet實(shí)例銷毀即供,此時(shí)會(huì)調(diào)用Servlet的destroy()方法定拟。init方法和destory方法只會(huì)執(zhí)行一次,service方法客戶端每次請(qǐng)求Servlet都會(huì)執(zhí)行。Servlet中有時(shí)會(huì)用到一些需要初始化與銷毀的資源青自,因此可以把初始化資源的代碼放入init方法中株依,銷毀資源的代碼放入destroy方法中,這樣就不需要每次處理客戶端的請(qǐng)求都要初始化與銷毀資源延窜。
參考:《javaweb整合開發(fā)王者歸來(lái)》P81
6.get和post請(qǐng)求的區(qū)別
網(wǎng)上也有文章說(shuō):get和post請(qǐng)求實(shí)際上是沒(méi)有區(qū)別恋腕,大家可以自行查詢相關(guān)文章!我下面給出的只是一種常見(jiàn)的答案逆瑞。
①get請(qǐng)求用來(lái)從服務(wù)器上獲得資源荠藤,而post是用來(lái)向服務(wù)器提交數(shù)據(jù);
②get將表單中數(shù)據(jù)按照name=value的形式获高,添加到action 所指向的URL 后面哈肖,并且兩者使用"?"連接,而各個(gè)變量之間使用"&"連接念秧;post是將表單中的數(shù)據(jù)放在HTTP協(xié)議的請(qǐng)求頭或消息體中淤井,傳遞到action所指向URL;
③get傳輸?shù)臄?shù)據(jù)要受到URL長(zhǎng)度限制(1024字節(jié)即256個(gè)字符)摊趾;而post可以傳輸大量的數(shù)據(jù)币狠,上傳文件通常要使用post方式;
④使用get時(shí)參數(shù)會(huì)顯示在地址欄上砾层,如果這些數(shù)據(jù)不是敏感數(shù)據(jù)漩绵,那么可以使用get;對(duì)于敏感數(shù)據(jù)還是應(yīng)用使用post肛炮;
⑤get使用MIME類型application/x-www-form-urlencoded的URL編碼(也叫百分號(hào)編碼)文本的格式傳遞參數(shù)渐行,保證被傳送的參數(shù)由遵循規(guī)范的文本組成,例如一個(gè)空格的編碼是"%20"铸董。
補(bǔ)充:GET方式提交表單的典型應(yīng)用是搜索引擎。GET方式就是被設(shè)計(jì)為查詢用的肴沫。
還有另外一種回答粟害。推薦大家看一下:
- https://www.zhihu.com/question/28586791
- https://mp.weixin.qq.com/s?__biz=MzI3NzIzMzg3Mw==&mid=100000054&idx=1&sn=71f6c214f3833d9ca20b9f7dcd9d33e4#rd
7.什么情況下調(diào)用doGet()和doPost()
Form標(biāo)簽里的method的屬性為get時(shí)調(diào)用doGet(),為post時(shí)調(diào)用doPost()颤芬。
8.轉(zhuǎn)發(fā)(Forward)和重定向(Redirect)的區(qū)別
轉(zhuǎn)發(fā)是服務(wù)器行為悲幅,重定向是客戶端行為。
轉(zhuǎn)發(fā)(Forword) 通過(guò)RequestDispatcher對(duì)象的forward(HttpServletRequest request,HttpServletResponse response)方法實(shí)現(xiàn)的站蝠。RequestDispatcher可以通過(guò)HttpServletRequest 的getRequestDispatcher()方法獲得汰具。例如下面的代碼就是跳轉(zhuǎn)到login_success.jsp頁(yè)面。
request.getRequestDispatcher("login_success.jsp").forward(request, response);
重定向(Redirect) 是利用服務(wù)器返回的狀態(tài)嗎來(lái)實(shí)現(xiàn)的菱魔×衾螅客戶端瀏覽器請(qǐng)求服務(wù)器的時(shí)候,服務(wù)器會(huì)返回一個(gè)狀態(tài)碼澜倦。服務(wù)器通過(guò)HttpServletRequestResponse的setStatus(int status)方法設(shè)置狀態(tài)碼聚蝶。如果服務(wù)器返回301或者302杰妓,則瀏覽器會(huì)到新的網(wǎng)址重新請(qǐng)求該資源。
- 從地址欄顯示來(lái)說(shuō)
forward是服務(wù)器請(qǐng)求資源,服務(wù)器直接訪問(wèn)目標(biāo)地址的URL,把那個(gè)URL的響應(yīng)內(nèi)容讀取過(guò)來(lái),然后把這些內(nèi)容再發(fā)給瀏覽器.瀏覽器根本不知道服務(wù)器發(fā)送的內(nèi)容從哪里來(lái)的,所以它的地址欄還是原來(lái)的地址. redirect是服務(wù)端根據(jù)邏輯,發(fā)送一個(gè)狀態(tài)碼,告訴瀏覽器重新去請(qǐng)求那個(gè)地址.所以地址欄顯示的是新的URL.
- 從數(shù)據(jù)共享來(lái)說(shuō)
forward:轉(zhuǎn)發(fā)頁(yè)面和轉(zhuǎn)發(fā)到的頁(yè)面可以共享request里面的數(shù)據(jù). redirect:不能共享數(shù)據(jù).
- 從運(yùn)用地方來(lái)說(shuō)
forward:一般用于用戶登陸的時(shí)候,根據(jù)角色轉(zhuǎn)發(fā)到相應(yīng)的模塊. redirect:一般用于用戶注銷登陸時(shí)返回主頁(yè)面和跳轉(zhuǎn)到其它的網(wǎng)站等
- 從效率來(lái)說(shuō)
forward:高. redirect:低.
9.自動(dòng)刷新(Refresh)
自動(dòng)刷新不僅可以實(shí)現(xiàn)一段時(shí)間之后自動(dòng)跳轉(zhuǎn)到另一個(gè)頁(yè)面碘勉,還可以實(shí)現(xiàn)一段時(shí)間之后自動(dòng)刷新本頁(yè)面巷挥。Servlet中通過(guò)HttpServletResponse對(duì)象設(shè)置Header屬性實(shí)現(xiàn)自動(dòng)刷新例如:
Response.setHeader("Refresh","5;URL=http://localhost:8080/servlet/example.htm");
其中5為時(shí)間,單位為秒验靡。URL指定就是要跳轉(zhuǎn)的頁(yè)面(如果設(shè)置自己的路徑倍宾,就會(huì)實(shí)現(xiàn)沒(méi)過(guò)一秒自動(dòng)刷新本頁(yè)面一次)
10.Servlet與線程安全
Servlet不是線程安全的,多線程并發(fā)的讀寫會(huì)導(dǎo)致數(shù)據(jù)不同步的問(wèn)題胜嗓。 解決的辦法是盡量不要定義name屬性高职,而是要把name變量分別定義在doGet()和doPost()方法內(nèi)。雖然使用synchronized(name){}語(yǔ)句塊可以解決問(wèn)題兼蕊,但是會(huì)造成線程的等待初厚,不是很科學(xué)的辦法。 注意:多線程的并發(fā)的讀寫Servlet類屬性會(huì)導(dǎo)致數(shù)據(jù)不同步孙技。但是如果只是并發(fā)地讀取屬性而不寫入产禾,則不存在數(shù)據(jù)不同步的問(wèn)題。因此Servlet里的只讀屬性最好定義為final類型的牵啦。
參考:《javaweb整合開發(fā)王者歸來(lái)》P92
11.JSP和Servlet是什么關(guān)系
其實(shí)這個(gè)問(wèn)題在上面已經(jīng)闡述過(guò)了亚情,Servlet是一個(gè)特殊的Java程序,它運(yùn)行于服務(wù)器的JVM中哈雏,能夠依靠服務(wù)器的支持向?yàn)g覽器提供顯示內(nèi)容楞件。JSP本質(zhì)上是Servlet的一種簡(jiǎn)易形式,JSP會(huì)被服務(wù)器處理成一個(gè)類似于Servlet的Java程序裳瘪,可以簡(jiǎn)化頁(yè)面內(nèi)容的生成土浸。Servlet和JSP最主要的不同點(diǎn)在于,Servlet的應(yīng)用邏輯是在Java文件中彭羹,并且完全從表示層中的HTML分離開來(lái)黄伊。而JSP的情況是Java和HTML可以組合成一個(gè)擴(kuò)展名為.jsp的文件。有人說(shuō)派殷,Servlet就是在Java中寫HTML还最,而JSP就是在HTML中寫Java代碼,當(dāng)然這個(gè)說(shuō)法是很片面且不夠準(zhǔn)確的毡惜。JSP側(cè)重于視圖拓轻,Servlet更側(cè)重于控制邏輯,在MVC架構(gòu)模式中经伙,JSP適合充當(dāng)視圖(view)而Servlet適合充當(dāng)控制器(controller)扶叉。
12.JSP工作原理
JSP是一種Servlet,但是與HttpServlet的工作方式不太一樣。HttpServlet是先由源代碼編譯為class文件后部署到服務(wù)器下辜梳,為先編譯后部署粱甫。而JSP則是先部署后編譯。JSP會(huì)在客戶端第一次請(qǐng)求JSP文件時(shí)被編譯為HttpJspPage類(接口Servlet的一個(gè)子類)作瞄。該類會(huì)被服務(wù)器臨時(shí)存放在服務(wù)器工作目錄里面茶宵。下面通過(guò)實(shí)例給大家介紹。 工程JspLoginDemo下有一個(gè)名為login.jsp的Jsp文件宗挥,把工程第一次部署到服務(wù)器上后訪問(wèn)這個(gè)Jsp文件乌庶,我們發(fā)現(xiàn)這個(gè)目錄下多了下圖這兩個(gè)東東。 .class文件便是JSP對(duì)應(yīng)的Servlet契耿。編譯完畢后再運(yùn)行class文件來(lái)響應(yīng)客戶端請(qǐng)求瞒大。以后客戶端訪問(wèn)login.jsp的時(shí)候,Tomcat將不再重新編譯JSP文件搪桂,而是直接調(diào)用class文件來(lái)響應(yīng)客戶端請(qǐng)求透敌。
由于JSP只會(huì)在客戶端第一次請(qǐng)求的時(shí)候被編譯 ,因此第一次請(qǐng)求JSP時(shí)會(huì)感覺(jué)比較慢踢械,之后就會(huì)感覺(jué)快很多酗电。如果把服務(wù)器保存的class文件刪除,服務(wù)器也會(huì)重新編譯JSP内列。開發(fā)Web程序時(shí)經(jīng)常需要修改JSP撵术。Tomcat能夠自動(dòng)檢測(cè)到JSP程序的改動(dòng)。如果檢測(cè)到JSP源代碼發(fā)生了改動(dòng)话瞧。Tomcat會(huì)在下次客戶端請(qǐng)求JSP時(shí)重新編譯JSP嫩与,而不需要重啟Tomcat。這種自動(dòng)檢測(cè)功能是默認(rèn)開啟的交排,檢測(cè)改動(dòng)會(huì)消耗少量的時(shí)間划滋,在部署Web應(yīng)用的時(shí)候可以在web.xml中將它關(guān)掉。
參考:《javaweb整合開發(fā)王者歸來(lái)》P97
13.JSP有哪些內(nèi)置對(duì)象埃篓、作用分別是什么
JSP有9個(gè)內(nèi)置對(duì)象:
- request:封裝客戶端的請(qǐng)求古毛,其中包含來(lái)自GET或POST請(qǐng)求的參數(shù);
- response:封裝服務(wù)器對(duì)客戶端的響應(yīng)都许;
- pageContext:通過(guò)該對(duì)象可以獲取其他對(duì)象;
- session:封裝用戶會(huì)話的對(duì)象嫂冻;
- application:封裝服務(wù)器運(yùn)行環(huán)境的對(duì)象胶征;
- out:輸出服務(wù)器響應(yīng)的輸出流對(duì)象;
- config:Web應(yīng)用的配置對(duì)象桨仿;
- page:JSP頁(yè)面本身(相當(dāng)于Java程序中的this)睛低;
- exception:封裝頁(yè)面拋出異常的對(duì)象。
13.Request對(duì)象的主要方法有哪些
- setAttribute(String name,Object):設(shè)置名字為name的request 的參數(shù)值
- getAttribute(String name):返回由name指定的屬性值
- getAttributeNames():返回request 對(duì)象所有屬性的名字集合,結(jié)果是一個(gè)枚舉的實(shí)例
- getCookies():返回客戶端的所有 Cookie 對(duì)象钱雷,結(jié)果是一個(gè)Cookie 數(shù)組
- getCharacterEncoding() :返回請(qǐng)求中的字符編碼方式 = getContentLength() :返回請(qǐng)求的 Body的長(zhǎng)度
- getHeader(String name) :獲得HTTP協(xié)議定義的文件頭信息
- getHeaders(String name) :返回指定名字的request Header 的所有值骂铁,結(jié)果是一個(gè)枚舉的實(shí)例
- getHeaderNames() :返回所以request Header 的名字,結(jié)果是一個(gè)枚舉的實(shí)例
- getInputStream() :返回請(qǐng)求的輸入流罩抗,用于獲得請(qǐng)求中的數(shù)據(jù)
- getMethod() :獲得客戶端向服務(wù)器端傳送數(shù)據(jù)的方法
- getParameter(String name) :獲得客戶端傳送給服務(wù)器端的有 name指定的參數(shù)值
- getParameterNames() :獲得客戶端傳送給服務(wù)器端的所有參數(shù)的名字拉庵,結(jié)果是一個(gè)枚舉的實(shí)例
- getParameterValues(String name):獲得有name指定的參數(shù)的所有值
- getProtocol():獲取客戶端向服務(wù)器端傳送數(shù)據(jù)所依據(jù)的協(xié)議名稱
- getQueryString() :獲得查詢字符串
- getRequestURI() :獲取發(fā)出請(qǐng)求字符串的客戶端地址
- getRemoteAddr():獲取客戶端的 IP 地址
- getRemoteHost() :獲取客戶端的名字
- getSession([Boolean create]) :返回和請(qǐng)求相關(guān) Session
- getServerName() :獲取服務(wù)器的名字
- getServletPath():獲取客戶端所請(qǐng)求的腳本文件的路徑
- getServerPort():獲取服務(wù)器的端口號(hào)
- removeAttribute(String name):刪除請(qǐng)求中的一個(gè)屬性
14.request.getAttribute()和 request.getParameter()有何區(qū)別
從獲取方向來(lái)看:
getParameter()是獲取 POST/GET 傳遞的參數(shù)值;
getAttribute()是獲取對(duì)象容器中的數(shù)據(jù)值套蒂;
從用途來(lái)看:
getParameter用于客戶端重定向時(shí)钞支,即點(diǎn)擊了鏈接或提交按扭時(shí)傳值用,即用于在用表單或url重定向傳值時(shí)接收數(shù)據(jù)用操刀。
getAttribute用于服務(wù)器端重定向時(shí)烁挟,即在 sevlet 中使用了 forward 函數(shù),或 struts 中使用了 mapping.findForward。 getAttribute 只能收到程序用 setAttribute 傳過(guò)來(lái)的值骨坑。
另外撼嗓,可以用 setAttribute,getAttribute 發(fā)送接收對(duì)象.而 getParameter 顯然只能傳字符串。 setAttribute 是應(yīng)用服務(wù)器把這個(gè)對(duì)象放在該頁(yè)面所對(duì)應(yīng)的一塊內(nèi)存中去欢唾,當(dāng)你的頁(yè)面服務(wù)器重定向到另一個(gè)頁(yè)面時(shí)且警,應(yīng)用服務(wù)器會(huì)把這塊內(nèi)存拷貝另一個(gè)頁(yè)面所對(duì)應(yīng)的內(nèi)存中。這樣getAttribute就能取得你所設(shè)下的值匈辱,當(dāng)然這種方法可以傳對(duì)象振湾。session也一樣,只是對(duì)象在內(nèi)存中的生命周期不一樣而已亡脸。getParameter只是應(yīng)用服務(wù)器在分析你送上來(lái)的 request頁(yè)面的文本時(shí)押搪,取得你設(shè)在表單或 url 重定向時(shí)的值。
總結(jié):
getParameter 返回的是String,用于讀取提交的表單中的值;(獲取之后會(huì)根據(jù)實(shí)際需要轉(zhuǎn)換為自己需要的相應(yīng)類型浅碾,比如整型大州,日期類型啊等等)
getAttribute 返回的是Object,需進(jìn)行轉(zhuǎn)換,可用setAttribute 設(shè)置成任意對(duì)象垂谢,使用很靈活厦画,可隨時(shí)用