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