Java的面试汇总,有这些还担心不通过?
面試官提問的內(nèi)容通常會由易到難,如果前面容易的內(nèi)容都答不上來,往往就被刷了,如果是前面提問的都答上來了,他會問一些有深度的問題,這時候就算你回答不上來也不要慌張,他只是看看你的薪資水平而已
接下來我就說一下java面試通常會問到的一些知識點
如果你的簡歷上面沒有寫框架的東西,只寫了web的一些技術(shù),比如servlet和jsp,他一般會問java基礎(chǔ),但是如果寫了框架,一般就不問java基礎(chǔ)了,當然,servlet和jsp是要問的
一我這里就先開始說servlet
1:servlet的生命周期
void init(ServletConfig):出生之后(1次)
void service(ServletRequest request,ServletResponse response):每次處理請求時都會被調(diào)用
void destroy():臨死之前(1次);
這樣說也夠了,但是為了顯示自己很厲害,還可以說明他們分別是什么時候使用,是干啥的
第一次創(chuàng)建servlet對象之后,服務(wù)器會調(diào)用init(ServletConfig),他是是用來初始化servlet,參數(shù)ServletConfig就是servlet的配置信息;每次接收請求,都會調(diào)用service(),他是用來處理請求;服務(wù)器關(guān)閉時會調(diào)用destroy(),destroy可以用來釋放資源
2:servlet是干什么的
Servlet是JavaWeb的三大組件之一,它屬于動態(tài)資源。Servlet的作用是處理請求,服務(wù)器會把接收到的請求交給Servlet來處理,在Servlet中通常需要:(1) 接收請求數(shù)據(jù);(2) 處理請求;(3)完成響應。
3:servlet是怎么得到的
有三種:(1)實現(xiàn)servlet接口(2)繼承GenericServlet抽象類(3)繼承HttpServlet抽象類
這樣答基本上就可以了,但是我們還可以解釋一下
GenericServlet抽象類實現(xiàn)servlet接口,而HttpServlet抽象類是是GenericServlet抽象類的子類,通常用的都是繼承HttpServlet抽象類,因為他是跟Http協(xié)議相關(guān)的,專門用來處理Http協(xié)議的請求
4:有哪些域?qū)ο?/p>
(1)域?qū)ο缶褪怯脕碓诙鄠€Servlet中傳遞數(shù)據(jù),底層是一個map,用來存數(shù)據(jù)和取數(shù)據(jù)
(2)ServletRequest;作用范圍是一個請求
(3)HttpSession;l 一個會話創(chuàng)建一個HttpSession對象,同一會話中的多個請求中可以共享session中的數(shù)據(jù);
(4)ServletContext;服務(wù)器會為每一個項目創(chuàng)建一個ServletContext對象!作用范圍是整個項目 ServletContext對象的作用是在整個項目的動態(tài)資源之間共享數(shù)據(jù)!
5:重定向和請求轉(zhuǎn)發(fā)和請求包含
(1)l請求轉(zhuǎn)發(fā)是一個請求,而重定向是兩個請求;
(2)請求轉(zhuǎn)發(fā)的目標只能是本應用中的資源,重定向的目標可以是其他應用
請求轉(zhuǎn)發(fā)和請求包含都是一次請求,而且請求轉(zhuǎn)發(fā)是留頭不留體,也就是的前一個servlet的響應頭是可以設(shè)置的,但是響應體是不允許輸出,而只能使用后一個servlet的
請求包含是留頭又留體,響應體和響應頭都允許輸出
所以請求包含大多都是在jsp頁面中,用來完成多頁面的合并,請求轉(zhuǎn)發(fā)大多都是在servlet中。轉(zhuǎn)發(fā)目標大多是jsp頁面
6關(guān)于servlet
Servlet是線程不安全的,而且是單實例對象,當多個請求向一個Servlet發(fā)出時,有可能會存在一個線程對其進行讀操作。另一個對其進行寫操作,
有三種解決方法
不要在Servlet中創(chuàng)建成員!創(chuàng)建局部變量即可!
可以創(chuàng)建無狀態(tài)成員!(也就是沒有g(shù)et()、set()方法)
可以創(chuàng)建有狀態(tài)的成員,但狀態(tài)必須為只讀的!(也就是沒有set()方法)
二jsp
1:jsp是干什么的
JSP(Java Server Pages)是JavaWeb服務(wù)器端的動態(tài)資源。他是用來顯示數(shù)據(jù)和獲取數(shù)據(jù)。
JSP是一種特殊的Servlet,當JSP頁面首次被訪問時,容器(Tomcat)會先把JSP編譯成Servlet,然后再去執(zhí)行Servlet。所以JSP其實就是一個Servlet!
2:會話跟蹤技術(shù)
(1)HTTP協(xié)議中可以使用Cookie來完成會話跟蹤!在JavaWeb中,使用session來完成會話跟蹤,session底層依賴Cookie技術(shù)
(2)cookie
不同瀏覽器之間是不共享Cookie的
如果服務(wù)器端發(fā)送重復的Cookie那么會覆蓋原有的Cookie
當客戶端向服務(wù)器發(fā)出請求時會把所有這個服務(wù)器Cookie包含在請求中發(fā)送給服務(wù)器,這樣服務(wù)器就可以識別客戶端了!
cookie的生命,默認情況下是保存在瀏覽器內(nèi)存中,一旦瀏覽器關(guān)閉cookie就消失了
但是可以通過設(shè)置時間來讓他保存在磁盤中,這樣在瀏覽器關(guān)閉之后也會存在,存在時間就是設(shè)置的時間
請求路徑如果包含了Cookie路徑,那么會在請求中包含這個Cookie,否則不會請求中不會包含這個Cookie。
這里要注意,cookie的路徑要比請求的路徑要大,應該這么想,一個cookie可以被多個請求帶上
(3)session
HttpSession也是一個域?qū)ο?/p>
當首次使用session時,服務(wù)器端要創(chuàng)建session,session是保存在服務(wù)器端,而給客戶端的session的id(一個cookie中保存了sessionId)。客戶端帶走的是sessionId,而數(shù)據(jù)是保存在session中。
當客戶端再次訪問服務(wù)器時,在請求中會帶上sessionId,而服務(wù)器會通過sessionId找到對應的session,而無需再創(chuàng)建新的session。
session保存在服務(wù)器,而sessionId通過Cookie發(fā)送給客戶端,但這個Cookie的生命不-1,即只在瀏覽器內(nèi)存中存在,也就是說如果用戶關(guān)閉了瀏覽器,那么這個Cookie就丟失了。
當用戶再次打開瀏覽器訪問服務(wù)器時,就不會有sessionId發(fā)送給服務(wù)器,那么服務(wù)器會認為你沒有session,所以服務(wù)器會創(chuàng)建一個session,并在響應中把sessionId中到Cookie中發(fā)送給客戶端。
這里有一個很重要的問題,就是頁面的路徑的范圍小于等于Cookie的路徑的范圍
Cookie中不能存在中文
如果是在瀏覽器內(nèi)存中就會出現(xiàn)當開兩個相同的瀏覽器時是沒有關(guān)聯(lián)的,是屬于兩個用戶
如果是在計算機硬盤中,說明就是有關(guān)聯(lián)的,是屬于一個用戶
4三大指令:
page指令(定義整個頁面的一些屬性和值)、include指令(靜態(tài)包含,先合并,再編譯,如果是動態(tài)包含,就是先編譯再合并)、taglib指令(導入標簽庫)
5九大內(nèi)置對象:
out --> jsp的輸出流,用來向客戶端響應
page --> 當前jsp對象! 它的引用類型是Object,即真身中有如下代碼:Object page = this;
config --> 它對應真身(就是轉(zhuǎn)譯成的Java文件,它其實是一個Servlet)中的ServletConfig對象!
pageContext --> 一個頂9個!(以下那些都和Servlet里的匹配起來,他們的使用方法是一樣的)
request --> HttpServletEequest
response --> HttpServletResponse
exception --> Throwable
session --> HttpSession
application --> ServletContext(一個jsp頁面!這個域是在當前jsp頁面和當前jsp頁面中使用的標簽之間共享數(shù)據(jù)!)
代理其他域:pageContext.setAttribute("xxx", "XXX", PageContext.SESSION_SCOPE);
> 全域查找:pageContext.findAttribute("xxx");從小到大,依賴查找!
> 獲取其他8個內(nèi)置對象:
多個用戶請求一個JSP頁面時,要為每一個用戶開辟一個線程
6.一般問到的是打開一個IE瀏覽器打開一個網(wǎng)站,之后再打開這個瀏覽器,也打開這個網(wǎng)站,總共有幾個session對象創(chuàng)建
這個這樣答比較詳細:可能一個,也可能兩個,因為session本身是存在于服務(wù)器端的,session的識別是通過cookie中的JSessionID,session的底層是依賴于cookie的,而如果cookie設(shè)置的時間是默認的(-1),說明cookie是存在于瀏覽器內(nèi)存中,這樣cookie是相對于瀏覽器存在的,一個瀏覽器一個對象;而如果設(shè)置的時間大于0,那么cookie就會存在于磁盤中,只要是相同的瀏覽器開啟之后都會是一個session對象,而且雖然cookie存在于磁盤中,不同的瀏覽器也不會有相同的session對象,肯定是不一樣的,不同的瀏覽器是不共享cookie的
7.還可能會問session是依賴于什么存在的
先回答是cookie,因為session對象本身是存在于服務(wù)器端的,而把JSessionID是存放在cookie中,當再次進行請求時,cookie中會帶上JSessionID,這樣就可以得到服務(wù)器端的session了
但是如果這個請求時沒有cookie的,如果我們還想使用session,我們也可以通過URL重寫的方式,這需要在每個URL后面都加上sessionId!這樣用戶的請求中就包含了sessionId,服務(wù)器就可以通過sessionId找到對應的session對象了。
所以session是依賴于cookie或者URL重寫
三:過濾器
1過濾器是怎么執(zhí)行的
當用戶請求某個Servlet時,會先執(zhí)行部署在這個請求上的Filter,如果Filter“放行”,那么會繼承執(zhí)行用戶請求的Servlet;如果Filter不“放行”,那么就不會執(zhí)行用戶請求的Servlet。
doFilter()方法的參數(shù)中有一個類型為FilterChain的參數(shù),它只有一個方法:doFilter(ServletRequest,ServletResponse)。執(zhí)行這個方法就會放行
2有哪幾種攔截方式
攔截方式:REQUEST、FORWARD、INCLUDE、ERROR,默認是REQUEST方式。
l REQUEST:攔截直接請求方式;
l FORWARD:攔截請求轉(zhuǎn)發(fā)方式;
l INCLUDE:攔截請求包含方式;
l ERROR:攔截錯誤轉(zhuǎn)發(fā)方式。
<filter-mapping>的配置順序決定了過濾器的執(zhí)行順序!
四:Struts2
1攔截器的作用?攔截器與過濾器的區(qū)別?
1)一組攔截器構(gòu)成了過濾器來實現(xiàn),而過濾器和action是Struts2的核心組件,同時可以減輕代碼冗余,提高重用率。
2) 過濾器是攔截用戶請求的,范圍明顯比攔截器大的多。
2如何在 Struts2 中使用 Ajax 功能
3Struts2 如何訪問 HttpServletRequest、HttpSession、ServletContext 三個域?qū)ο?(訪問servlet的API)
(1)通過ActionContext來訪問,這種方式可以訪問這servlet的API對象,但是無法直接獲得對象
(2)實現(xiàn)接口,ServletRequestAware,都是API+Aware,實現(xiàn)這些接口,并且寫上相應的與對象的變量和set方法就可以了
(3)ServletActionContext的靜態(tài)方法可以獲取
4.為什么要使用 Struts2 & Struts2 的優(yōu)點(Struts2和Struts1和webWork的關(guān)系)
5.Struts2的前端控制器是什么
StrutsPrepareAndExecuteFilter,他其實就是一個過濾器,他有兩個功能,一個是預處理,一個是執(zhí)行,預處理是通過他的生命周期方法init加載action配置文件,過濾器由一組攔截器組成,這些攔截器就是進行攔截
6action中是怎么編寫的呢
a:只寫個普通類,不實現(xiàn)任何接口,不繼承任何類
b:實現(xiàn)action接口
c:繼承actionSupport類(這個類就已經(jīng)實現(xiàn)了action接口,還實現(xiàn)了很多其他的接口)
7Struts2的配置文件的加載順序
struts.xml->struts.properties->web.xml
8:Struts2中的數(shù)據(jù)封裝有哪幾種方法
可以這么說,有兩種,一個是屬性封裝,一個是模型驅(qū)動封裝,屬性封裝有包括set方法和表達式封裝
也可以說有三種,一個是屬性封裝,一個是模型驅(qū)動封裝,一個是表達式封裝
屬性封裝:設(shè)置屬性的set方法
模型驅(qū)動封裝:通過實現(xiàn)ModelDriver接口來接收請求參數(shù);里面的泛型是要封裝的類,之后手動構(gòu)建對象;重寫getModel()方法返回的就是Action所使用的數(shù)據(jù)模型對象
表達式封裝:其實他本質(zhì)上也是屬性封裝,只是當屬性很多的時候,就會寫很多set方法,這樣很臃腫,所以就把這些屬性和setget方法封裝到一個對象中,在action中直接使用這個對象
區(qū)別:表達式封裝是本質(zhì)上就屬于屬性封裝,只是當屬性太多時,將這些屬性封裝到了一個對象中,直接使用對象,所以當屬性少的時候就用屬性封裝,當屬性多的時候就用表達式封裝;而表達式封裝和模型驅(qū)動封裝本質(zhì)上是不同的,如果操作現(xiàn)有的pojo對象,就用模型驅(qū)動封裝,而如果操作的屬性很多,但是不構(gòu)成現(xiàn)有的pojo對象,或者構(gòu)成了多個pojo對象,就需要使用表達式封裝
9:攔截器是怎么進行攔截的?
攔截器是動態(tài)攔截action的調(diào)用對象,可以定義在執(zhí)行action之前或之后可以執(zhí)行的一些功能,也可以判斷是否進行攔截
他這里用到了Aop思想,面向切面思想,也就是不通過修改源代碼而去擴展功能
還有就是責任鏈(也叫攔截器鏈),將攔截器按照一定的順序組成一個鏈,之后當訪問這個action時會按照定義好的順序進行攔截
五:spring
1:spring的特性是什么?
(1)spring是一站式框架,在web層有springMVC,在service層有IOC,在dao層有JDBCTamplate,對于常見的dao層框架也有相應的Template,
(2)IOC思想,控制反轉(zhuǎn):對象的創(chuàng)建不是通過new方式來實現(xiàn),而是通過spring配置創(chuàng)建類對象
(3)AOP思想,面向切面編程:不通過修改源代碼而實現(xiàn)功能的擴展
2:IOC底層原理是怎么實現(xiàn)的?
dom4j解析xml文件,工廠設(shè)計模式,反射(最主要就要說出反射)
3:spring是怎么配置創(chuàng)建類對象的?
可以這么答:有兩種,一個是配置文件配置,一種是注解方式
配置的方式有三種:使用類的無參構(gòu)造創(chuàng)建
為了讓學習變得輕松、高效,今天給大家免費分享一套Java入門教學資源。幫助大家在成為Java架構(gòu)師的道路上披荊斬棘。需要入門的資料歡迎加入學習交流群:9285,05736
創(chuàng)作挑戰(zhàn)賽新人創(chuàng)作獎勵來咯,堅持創(chuàng)作打卡瓜分現(xiàn)金大獎總結(jié)
以上是生活随笔為你收集整理的Java的面试汇总,有这些还担心不通过?的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: java 二进制文件 数据库_java从
- 下一篇: 10个理由告诉你为何要学Java编程?