【转】Java学习---Java Web基础面试题整理
【原文】https://www.toutiao.com/i6592359948632457731/
1、什么是Servlet?
可以從兩個(gè)方面去看Servlet:
a、API:有一個(gè)接口servlet,它是servlet規(guī)范中定義的用來處理客戶端請求的程序需要實(shí)現(xiàn)的頂級(jí)接口。
b、組件:服務(wù)器端用來處理客戶端請求的組件,需要在web.xml文件中進(jìn)行配置。
2、Servlet的生命周期,并說出Servlet和CGI的區(qū)別?
servlet有良好的生存期的定義,包括加載和實(shí)例化、初始化、處理請求以及服務(wù)結(jié)束。
這個(gè)生存期由javax.servlet.servlet接口中的init、service、destroy方法表達(dá)。
web容器加載servlet,生命周期開始。通過調(diào)用servlet的init()方法進(jìn)行servlet的初始化。通過調(diào)用service()方法實(shí)現(xiàn)根據(jù)請求的不同調(diào)用不同的do**()方法。結(jié)束服務(wù),web容器調(diào)用servlet的destroy()方法。
區(qū)別:
Servlet處于服務(wù)器進(jìn)程中,它通過多線程運(yùn)行service()方法,一個(gè)實(shí)例可以服務(wù)于多個(gè)請求,并且實(shí)例一般不會(huì)被銷毀;而CGI對(duì)每個(gè)請求都產(chǎn)生一個(gè)新的進(jìn)程,服務(wù)完成后就銷毀,所有效率低于Servlet
3、Servlet接口中有哪些方法?
Servlet接口定義了5個(gè)方法:
4、get和post請求的區(qū)別?
a、get是用來從服務(wù)器上獲取數(shù)據(jù),而post是用來向服務(wù)器傳遞數(shù)據(jù);
b、get將表單中數(shù)據(jù)按照variable=value的形式,添加到action所指向的URL后面,并且兩者用"?"連接,變量之間用"&"連接;而post是將表單中的數(shù)據(jù)放在form的數(shù)據(jù)體中,按照變量與值對(duì)應(yīng)的方式,傳遞到action所指定的URL。
c、get是不安全的,因?yàn)樵趥鬏斶^程中,數(shù)據(jù)是被放在請求的URL中;而post的所有操作對(duì)用戶來說都是不可見的。
d、get傳輸?shù)臄?shù)據(jù)量小,這主要應(yīng)為受url長度限制;而post可以傳輸大量的數(shù)據(jù),所有上傳文件只能用post提交。
e、get限制form表單的數(shù)據(jù)集必須為ASCII字符;而post支持整個(gè)IS01 0646字符集。
f、get是form表單的默認(rèn)方法。
5、什么情況下調(diào)用doGet()和doPost()?
默認(rèn)情況是調(diào)用doGet()方法,JSP頁面中的Form表單的method屬性設(shè)置為post的時(shí)候,調(diào)用的為doPost()方法;為get的時(shí)候,調(diào)用deGet()方法。
6、轉(zhuǎn)發(fā)(Forward)和重定向(Redirect)的區(qū)別?
轉(zhuǎn)發(fā)是服務(wù)器行為,重定向是客戶端行為。
轉(zhuǎn)發(fā)(Forword)
通過RequestDispatcher對(duì)象的forward(HttpServletRequest request,HttpServletResponse response)方法實(shí)現(xiàn)的。RequestDispatcher可以通過HttpServletRequest 的getRequestDispatcher()方法獲得。例如下面的代碼就是跳轉(zhuǎn)到login_success.jsp頁面。
request.getRequestDispatcher("login_success.jsp").forward(request, response);
重定向(Redirect) 是利用服務(wù)器返回的狀態(tài)嗎來實(shí)現(xiàn)的。客戶端瀏覽器請求服務(wù)器的時(shí)候,服務(wù)器會(huì)返回一個(gè)狀態(tài)碼。服務(wù)器通過HttpServletRequestResponse的setStatus(int status)方法設(shè)置狀態(tài)碼。如果服務(wù)器返回301或者302,則瀏覽器會(huì)到新的網(wǎng)址重新請求該資源。
1. 從地址欄顯示來說
forward是服務(wù)器請求資源,服務(wù)器直接訪問目標(biāo)地址的URL,把那個(gè)URL的響應(yīng)內(nèi)容讀取過來,然后把這些內(nèi)容再發(fā)給瀏覽器。瀏覽器根本不知道服務(wù)器發(fā)送的內(nèi)容從哪里來的,所以它的地址欄還是原來的地址。
redirect是服務(wù)端根據(jù)邏輯,發(fā)送一個(gè)狀態(tài)碼,告訴瀏覽器重新去請求那個(gè)地址,所以地址欄顯示的是新的URL。
2. 從數(shù)據(jù)共享來說
forward:轉(zhuǎn)發(fā)頁面和轉(zhuǎn)發(fā)到的頁面可以共享request里面的數(shù)據(jù).
redirect:不能共享數(shù)據(jù).
3. 從運(yùn)用地方來說
forward:一般用于用戶登陸的時(shí)候,根據(jù)角色轉(zhuǎn)發(fā)到相應(yīng)的模塊.
redirect:一般用于用戶注銷登陸時(shí)返回主頁面和跳轉(zhuǎn)到其它的網(wǎng)站等
4. 從效率來說
forward:高.
redirect:低.
7、自動(dòng)刷新(Refresh)
自動(dòng)刷新不僅可以實(shí)現(xiàn)一段時(shí)間之后自動(dòng)跳轉(zhuǎn)到另一個(gè)頁面,還可以實(shí)現(xiàn)一段時(shí)間之后自動(dòng)刷新本頁面。Servlet中通過HttpServletResponse對(duì)象設(shè)置Header屬性實(shí)現(xiàn)自動(dòng)刷新例如:
Response.setHeader("Refresh","1000;URL=http://localhost:8080/servlet/example.htm");
其中1000為時(shí)間,單位為毫秒。URL指定就是要跳轉(zhuǎn)的頁面(如果設(shè)置自己的路徑,就會(huì)實(shí)現(xiàn)沒過一秒自動(dòng)刷新本頁面一次)
8、Servlet與線程安全
Servlet不是線程安全的,多線程并發(fā)的讀寫會(huì)導(dǎo)致數(shù)據(jù)不同步的問題。 解決的辦法是盡量不要定義name屬性,而是要把name變量分別定義在doGet()和doPost()方法內(nèi)。雖然使用synchronized(name){}語句塊可以解決問題,但是會(huì)造成線程的等待,不是很科學(xué)的辦法。
注意:多線程的并發(fā)的讀寫Servlet類屬性會(huì)導(dǎo)致數(shù)據(jù)不同步。但是如果只是并發(fā)地讀取屬性而不寫入,則不存在數(shù)據(jù)不同步的問題。因此Servlet里的只讀屬性最好定義為final類型的。
9、JSP和Servlet有哪些相同點(diǎn)和不同點(diǎn),他們之間的聯(lián)系是什么?
JSP是Servlet的擴(kuò)展,本質(zhì)上是Servlet的簡易方式,更強(qiáng)調(diào)應(yīng)用的外表表達(dá)。JSP編譯后是"類Servlet"。Servlet和JSP最主要的不同點(diǎn)在于,Servlet的應(yīng)用邏輯是在java文件中,并且完全從表示層中的HTML里分離開來。而JSP的情況是java和HTML可以組合成一個(gè)擴(kuò)展名為.jsp的文件。JSP偏重于視圖,Servlet偏重于業(yè)務(wù)邏輯。
10、JSP工作原理:
JSP是一種Servlet,但是與HttpServlet的工作方式不太一樣。HttpServlet是先由源代碼編譯為class文件后部署到服務(wù)器下,為先編譯后部署。而JSP則是先部署后編譯。JSP會(huì)在客戶端第一次請求JSP文件時(shí)被編譯為HttpJspPage類(接口Servlet的一個(gè)子類)。該類會(huì)被服務(wù)器臨時(shí)存放在服務(wù)器工作目錄里面。下面通過實(shí)例給大家介紹。
工程JspLoginDemo下有一個(gè)名為login.jsp的Jsp文件,把工程第一次部署到服務(wù)器上后訪問這個(gè)Jsp文件,我們發(fā)現(xiàn)這個(gè)目錄下多了下圖這兩個(gè)東東。
.class文件便是JSP對(duì)應(yīng)的Servlet。編譯完畢后再運(yùn)行class文件來響應(yīng)客戶端請求。以后客戶端訪問login.jsp的時(shí)候,Tomcat將不再重新編譯JSP文件,而是直接調(diào)用class文件來響應(yīng)客戶端請求。
由于JSP只會(huì)在客戶端第一次請求的時(shí)候被編譯 ,因此第一次請求JSP時(shí)會(huì)感覺比較慢,之后就會(huì)感覺快很多。如果把服務(wù)器保存的class文件刪除,服務(wù)器也會(huì)重新編譯JSP。
開發(fā)Web程序時(shí)經(jīng)常需要修改JSP。Tomcat能夠自動(dòng)檢測到JSP程序的改動(dòng)。如果檢測到JSP源代碼發(fā)生了改動(dòng)。Tomcat會(huì)在下次客戶端請求JSP時(shí)重新編譯JSP,而不需要重啟Tomcat。這種自動(dòng)檢測功能是默認(rèn)開啟的,檢測改動(dòng)會(huì)消耗少量的時(shí)間,在部署Web應(yīng)用的時(shí)候可以在web.xml中將它關(guān)掉。
11、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() :返回請求中的字符編碼方式 = getContentLength() :返回請求的 Body的長度
- getHeader(String name) :獲得HTTP協(xié)議定義的文件頭信息
- getHeaders(String name) :返回指定名字的request Header 的所有值,結(jié)果是一個(gè)枚舉的實(shí)例
- getHeaderNames() :返回所以request Header 的名字,結(jié)果是一個(gè)枚舉的實(shí)例
- getInputStream() :返回請求的輸入流,用于獲得請求中的數(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ā)出請求字符串的客戶端地址
- getRemoteAddr():獲取客戶端的 IP 地址
- getRemoteHost() :獲取客戶端的名字
- getSession([Boolean create]) :返回和請求相關(guān) Session
- getServerName() :獲取服務(wù)器的名字
- getServletPath():獲取客戶端所請求的腳本文件的路徑
- getServerPort():獲取服務(wù)器的端口號(hào)
- removeAttribute(String name):刪除請求中的一個(gè)屬性
12、request.getAttribute()和 request.getParameter()有何區(qū)別?
a、request.getParameter()獲取的類型是String;request.getAttribute()獲取的類型是Object。
b、request.getPrameter()獲取的是POST/GET傳遞的參數(shù)值和URL中的參數(shù);request.getAttribute()獲取的是對(duì)象容器中的數(shù)據(jù)值/對(duì)象。
c、request.setAttribute()和request.getAttribute()可以發(fā)送、接收對(duì)象;request.getParamter()只能接收字符串,官方不開放request.setParamter()(也就是沒有這個(gè)方法)。
setAttribute()和getAttribute()的傳參原理:
setAttribute()是應(yīng)用服務(wù)器把這個(gè)對(duì)象放在該頁面所對(duì)應(yīng)的一塊內(nèi)存中去,當(dāng)你的頁面服務(wù)器重定向到另外一個(gè)頁面時(shí),應(yīng)用服務(wù)器會(huì)把這塊內(nèi)存拷貝到另一個(gè)頁面所對(duì)應(yīng)的那塊內(nèi)存中。這個(gè)就可以通過getAttribute()獲取到相應(yīng)的參數(shù)值或者對(duì)象。
13、JSP中動(dòng)態(tài)include和靜態(tài)include的區(qū)別?
a、靜態(tài)include:語法:<%@ include file="文件名" %>,相當(dāng)于復(fù)制,編輯時(shí)將對(duì)應(yīng)的文件包含進(jìn)來,當(dāng)內(nèi)容變化時(shí),不會(huì)再一次對(duì)其編譯,不易維護(hù)。
b、動(dòng)態(tài)include:語法:<jsp:include page="文件名">,能夠自動(dòng)檢查被包含文件,當(dāng)客戶端對(duì)JSP文件進(jìn)行請求時(shí),會(huì)重新將對(duì)應(yīng)的文件包含進(jìn)來,進(jìn)行實(shí)時(shí)的更新。
14、JSP有哪些內(nèi)置對(duì)象?作用分別是什么?
JSP一共有9個(gè)內(nèi)置對(duì)象:
15、JSP有哪些動(dòng)作?作用分別是什么?
JSP一共有以下6中基本動(dòng)作:
16、JSP常用指令有哪些?
page、include、taglib
a、page指令:定義頁面的一些屬性。
常用屬性:
contentType="text/html;charset=utf-8"; 向?yàn)g覽器端輸出數(shù)據(jù)的編碼
pageEncoding="utf-8"; JSP編譯成java文件時(shí)所用的編碼
session="true" 是否自動(dòng)創(chuàng)建session
b、include指令:引入一個(gè)靜態(tài)的JSP頁面
c、taglib指令:引入一個(gè)標(biāo)簽庫
17、講解JSP中的四種作用域
JSP中的四種作用域包括page、request、session和application,具體來說:
a、page是代表一個(gè)頁面相關(guān)的對(duì)象和屬性。一個(gè)頁面由一個(gè)編譯好的java servlet類(可以帶有include指令,但不可以帶有include動(dòng)作)表示。這既包括servlet又包括編譯成servlet的jsp頁面。
b、request是代表與web客戶機(jī)發(fā)出的一個(gè)請求相關(guān)的對(duì)象和屬性。一個(gè)請求可能跨越多個(gè)頁面,涉及多個(gè)web組件(由于forware指令和include動(dòng)作的關(guān)系)
c、session是代表與用于某個(gè)web客戶機(jī)的一個(gè)用戶體驗(yàn)相關(guān)的對(duì)象和屬性。一個(gè)web回話也可以經(jīng)常跨域多個(gè)客戶機(jī)請求。
d、application是代表與整個(gè)web應(yīng)用程序相關(guān)的對(duì)象和屬性。這實(shí)質(zhì)上是跨域整個(gè)web應(yīng)用程序,包括多個(gè)頁面、請求和回話的一個(gè)全局作用域。
18、如何實(shí)現(xiàn)JSP或Servlet的單線程模式?
在JSP中使用page指令進(jìn)行設(shè)置,具體代碼如下:
<%@page isThreadSafe="false"%>
對(duì)于Servlet,可以讓自定義的Servlet實(shí)現(xiàn)SingleThreadModel標(biāo)識(shí)接口。
說明:如果將JSP或Servlet設(shè)置成單線程工作模式,會(huì)導(dǎo)致每個(gè)請求創(chuàng)建一個(gè)Servlet實(shí)例,這種實(shí)踐將導(dǎo)致嚴(yán)重的性能問題(服務(wù)器的內(nèi)存壓力很大,還會(huì)導(dǎo)致頻繁的垃圾回收),所以通常情況下并不會(huì)這么做。
19、JSP亂碼如何解決?
a、JSP頁面亂碼:<%@page contentType="text/html;charset=utf-8" %>
b、表單提交時(shí)出現(xiàn)亂碼:request.setCharacterEncoding("utf-8");
c、數(shù)據(jù)庫出現(xiàn)亂碼:jdbc:mysql://localhost:3306:/user?useSSL=false&useUnicode=true&characterEncoding=utf-8;
其實(shí)我一般的處理的方法就是配置一個(gè)過濾器對(duì)每個(gè)JSP頁面進(jìn)行字符集處理。
20、實(shí)現(xiàn)會(huì)話跟蹤的技術(shù)有哪些?
1. 使用Cookie
向客戶端發(fā)送Cookie
Cookie c =new Cookie("name","value"); //創(chuàng)建Cookie
c.setMaxAge(60*60*24); //設(shè)置最大時(shí)效,此處設(shè)置的最大時(shí)效為一天
response.addCookie(c); //把Cookie放入到HTTP響應(yīng)中
從客戶端讀取Cookie
String name ="name";
Cookie[]cookies =request.getCookies();
if(cookies !=null){
for(int i= 0;i<cookies.length;i++){
Cookie cookie =cookies[i];
if(name.equals(cookis.getName()))
//something is here.
//you can get the value
cookie.getValue();
}
}
優(yōu)點(diǎn): 數(shù)據(jù)可以持久保存,不需要服務(wù)器資源,簡單,基于文本的Key-Value
缺點(diǎn): 大小受到限制,用戶可以禁用Cookie功能,由于保存在本地,有一定的安全風(fēng)險(xiǎn)。
2. URL 重寫
在URL中添加用戶會(huì)話的信息作為請求的參數(shù),或者將唯一的會(huì)話ID添加到URL結(jié)尾以標(biāo)識(shí)一個(gè)會(huì)話。
優(yōu)點(diǎn): 在Cookie被禁用的時(shí)候依然可以使用
缺點(diǎn): 必須對(duì)網(wǎng)站的URL進(jìn)行編碼,所有頁面必須動(dòng)態(tài)生成,不能用預(yù)先記錄下來的URL進(jìn)行訪問。
3. 隱藏的表單域
<input type="hidden" name ="session" value="..."/>
優(yōu)點(diǎn): Cookie被禁時(shí)可以使用
缺點(diǎn): 所有頁面必須是表單提交之后的結(jié)果。
4. HttpSession
在所有會(huì)話跟蹤技術(shù)中,HttpSession對(duì)象是最強(qiáng)大也是功能最多的。當(dāng)一個(gè)用戶第一次訪問某個(gè)網(wǎng)站時(shí)會(huì)自動(dòng)創(chuàng)建 HttpSession,每個(gè)用戶可以訪問他自己的HttpSession。可以通過HttpServletRequest對(duì)象的getSession方 法獲得HttpSession,通過HttpSession的setAttribute方法可以將一個(gè)值放在HttpSession中,通過調(diào)用 HttpSession對(duì)象的getAttribute方法,同時(shí)傳入屬性名就可以獲取保存在HttpSession中的對(duì)象。與上面三種方式不同的 是,HttpSession放在服務(wù)器的內(nèi)存中,因此不要將過大的對(duì)象放在里面,即使目前的Servlet容器可以在內(nèi)存將滿時(shí)將HttpSession 中的對(duì)象移到其他存儲(chǔ)設(shè)備中,但是這樣勢必影響性能。添加到HttpSession中的值可以是任意Java對(duì)象,這個(gè)對(duì)象最好實(shí)現(xiàn)了 Serializable接口,這樣Servlet容器在必要的時(shí)候可以將其序列化到文件中,否則在序列化時(shí)就會(huì)出現(xiàn)異常。
21、Cookie和Session的的區(qū)別?
22、什么是Tomcat?
Tomcat是一種web服務(wù)器,java編寫的web項(xiàng)目可以部署在上面,用戶在客戶端請求時(shí),都是將請求發(fā)到Tomcat上,Tomcat在將請求發(fā)到對(duì)應(yīng)的項(xiàng)目上。
23、 詳細(xì)描述MVC
基于java的web應(yīng)用系統(tǒng)采用MVC設(shè)計(jì)模型,即用Model(模型)、View(視圖)和Controller(控制)分離設(shè)計(jì),這是目前web應(yīng)用服務(wù)系統(tǒng)的主流設(shè)置方向。
Model:處理業(yè)務(wù)邏輯的模塊。
View:負(fù)責(zé)頁面顯示,顯示Model的處理結(jié)果給用戶,主要實(shí)現(xiàn)數(shù)據(jù)到頁面的轉(zhuǎn)換過程。
Controller:負(fù)責(zé)每個(gè)請求的分發(fā),把Form數(shù)據(jù)傳遞給Model進(jìn)行處理,處理完成后,把處理結(jié)果返回給相應(yīng)的View顯示給用戶。
轉(zhuǎn)載于:https://www.cnblogs.com/ftl1012/p/9584821.html
總結(jié)
以上是生活随笔為你收集整理的【转】Java学习---Java Web基础面试题整理的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: deepin关机卡在图标界面 mysq
- 下一篇: SELinux 入门