什么是不可變對象
- 不可變對象是指對象一旦被創(chuàng)建,狀態(tài)就不能再改變。任何修改都會創(chuàng)建一個新的對象,如String,Integer及其它包裝類
& 和 && 的區(qū)別
- &是位運算符,而&&是邏輯運算符。邏輯運算符具有短路特性,而&不具備短路特性
final與static關鍵字可以用于哪里?他們的作用是什么
- final:修飾變量,值不可被修改;修飾方法,方法無法被重寫;修飾類無法被繼承
- static修飾變量,靜態(tài)變量可直接用類名訪問;修飾方法,可直接通過類名調(diào)用
抽象類是否可以繼承具體類
- 抽象類可以繼承具體類,但前提是實體類必須有明確的構造函數(shù)
抽象類中是否可以用靜態(tài)的main方法
抽象類中可以用靜態(tài)的main方法,如果定義一個抽象方法test(),并且在main方法中用到這個抽象方法test()時就不能用了
HashMap和HashTable的區(qū)別
- HashTable是線程安全的,HashMap不是;HashMap中允許存在null鍵和null值,而HashTable中不允許
什么是類的反射機制
- 動態(tài)獲得對象
- 通過類(Class對象),可以得出當前類的fields、method、construtor、interface、superClass、modified等,同時可以通過類實例化一個實例、設置屬性、喚醒方法。Spring中一切都是反射、struts、Hibernate等都是通過反射進行開發(fā)的
類的反射機制中的包及核心類
- java.lang.Class
- java.lang.refrection.Method
- java.lang.refrection.Field
- java.lang.refrection.Constructor
- java.lang.refrection.Modifier
- java.lang.refrection.Interface
Servlet的生命周期
- Servlet生命周期包括三部分:
- 初始化:web容器加載servlet,調(diào)用init()方法
- 處理請求:通過調(diào)用service()方法實現(xiàn),根據(jù)請求的不同調(diào)用不同的do***()(doGet()或doPost())方法
- 銷毀:當服務器決定將實例銷毀的時候調(diào)用其destroy()方法
什么情況下調(diào)用doGet()和doPost()?
- jsp頁面中的form標簽里的method屬性為get時調(diào)用doGet(),為post時調(diào)用doPost()
JSP與Servlet有什么區(qū)別
- Servlet是服務器端的程序,動態(tài)生成html頁面發(fā)送到客戶端,但是這樣程序里會有很多out.println(),java與html語言混在一起很亂,所以后來sun公司推出了JSP,其實JSP就是Servlet,每次運行的時候JSP都首先被編譯成servlet文件,然后再被編譯成.class文件運行。有了JSP,在MVC項目中servlet不再負責動態(tài)生成頁面,轉而去負責控制程序邏輯的作用,控制JSP與JavaBean之間的流轉
四種會話跟蹤技術作用域
- page:一個頁面
- request:一次請求
- session:一次會話
- application:服務器從啟動到停止
四種會話跟蹤技術
- page:是代表與一個頁面相關的對象和屬性。一個頁面由一個編譯好的Java Servlet類(可以帶有任何的include指令,但是沒有include動作)表示。這即包括Servlet又包括被編譯成Servlet的頁面
- request是代表與web客戶端發(fā)送的一個請求相關的對象和屬性。一個請求可以跨越多個頁面,涉及多個web組件
- session代表與用于某個web客戶端的一個用戶體驗相關的對象和屬性,一個web會話可以也經(jīng)常會跨越多個客戶機請求
- application是代表與整個web應用程序相關的對象和屬性,這實際上是跨越多個web應用程序,包括多個頁面、請求和會話的一個全局作用域
forward和redirect的區(qū)別
轉發(fā)與重定向
- 從地址欄顯示來說
1)forward是服務器請求資源,服務器直接訪問目標地址的URL,把那個URL的響應內(nèi)容讀取過來,然后把這些內(nèi)容再發(fā)給瀏覽器。瀏覽器不知道服務器發(fā)送的內(nèi)容是從哪里來的,所以它的地址欄還是原來的地址。
2)redirect是服務端根據(jù)邏輯,發(fā)送一個狀態(tài)碼,告訴瀏覽器重新去請求那個地址。所以地址欄顯示的是新的URL。 - 從數(shù)據(jù)共享來說
1)forward:轉發(fā)頁面和轉發(fā)到的頁面可以共享request里面的數(shù)據(jù)
2)redirect:不能共享數(shù)據(jù) - 從運用地方來說
1)forward:一般用于用戶登錄的時候,根據(jù)角色轉發(fā)到相應的模塊
2)redirect:一般用于用戶注銷登錄時返回主頁和跳轉到其他的網(wǎng)站等 - 從效率來說
1)forward:高
2)redirect:低
為什么在session少放對象
- 因為session底層是由cookie實現(xiàn)的,當客戶端的cookie被禁用后,session也會失效,且應盡量少向session中保存信息,session的數(shù)據(jù)保存在服務器端
JSP和Servlet有哪些相同點和不同點
- JSP時Servler技術的擴展,本質上是Servlet的簡易方式,更強調(diào)應用的外部表達。JSP編譯后是"類 Servlet"。Servlet和JSP最主要的不同點在于Servlet的應用邏輯是在Java文件中,并且完全從表達層中HTML里分離出來,而JSP是Java和HTML結合成一個擴展名為.jsp的文件,JSP側重于視圖,Servlet側重于控制邏輯。
Tomcat有幾種部署項目的方式
-
部署項目的第一種方式(項目直接放入webapps目錄中)
1、將編寫并編譯好的web項目(注意要是編譯好的,如果是eclipse,可以將項目達成war包放入),放入到webapps中
image.png
2、啟動tomcat服務器(雙擊tomcat路徑\bin目錄下的startup.bat,啟動服務器)

3、在瀏覽器輸入:http://localhost:端口號/項目名/訪問的文件名

-
部署項目的第二種方式(修改conf/server.xml文件)
1、打開tomcat下conf/server.xml,在<Host></Host>標簽之間輸入項目配置信息
image.png
參數(shù)說明:
① path:瀏覽器訪問時的路徑名
2、雙擊startup.bat,啟動tomcat服務器然后在瀏覽器輸入訪問的項目名稱路徑
② docBase:web項目的WebRoot所在的路徑,注意是WebRoot的路徑,不是項目的路徑。其實就是編譯后的項目
③reloadble:設定項目有改動時,tomcat是否重新加載該姓名
image.png
注意:如果你配置的 path="/xx",那么訪問的時候就是這樣:

-
部署項目的第三種方式(E:\apache-tomcat-9.0.12\conf\Catalina\localhost)
1、進入到E:\apache-tomcat-9.0.12\conf\Catalina\localhost目錄,新建一個項目名.xml文件
image.png
2、在那個新建的xml中間中,添加下面配置語句(和上面的是一樣的,但是不需要 path 配置,加上也沒什么用)
<Context docBase="D:/WebProject" reloadable="true" />

3、在瀏覽器輸入路徑:localhost:8080/xml文件名/訪問的文件名

總結:
第一種方法比較普通,但是我們需要將編譯好的項目重新 copy 到 webapps 目錄下,多出了兩步操作
第二種方法直接在 server.xml 文件中配置,但是從 tomcat5.0版本開始后,server.xml 文件作為 tomcat 啟動的主要配置文件,一旦 tomcat 啟動后,便不會再讀取這個文件,因此無法再 tomcat 服務啟動后發(fā)布 web 項目
第三種方法是最好的,每個項目分開配置,tomcat 將以\conf\Catalina\localhost 目錄下的 xml 文件的文件名作為 web 應用的上下文路徑,而不再理會 <Context>中配置的 path 路徑,因此在配置的時候,可以不寫 path。
通常使用第三種方法
Servlet相關API
-
request.getParameter()返回客戶端的請求參數(shù)的值 -
request.getParameterNames()返回所有可用屬性名的枚舉 -
request.getParameterValues()返回包含參數(shù)的所有值的數(shù)組
-
request.getAttribute()和request.getParameter()區(qū)別
用途上:-
request.getAttribute(),一般用于獲取request域對象的數(shù)據(jù)(在跳轉之前把數(shù)據(jù)實用setAttribute來放到request對象上) -
request.getParameter(),一般用于獲取客戶端提交的參數(shù)
存儲數(shù)據(jù)上: -
request.getAttribute()可以獲取Object對象 -
request.getParameter()只能獲取字符串(這就是為什么它一般用于獲取客戶端提交數(shù)據(jù))
-
session和cookie的區(qū)別
- 從隱式安全上比較
- cookie存儲在瀏覽器中,對客戶端是可見的。信息容易泄露出去。如果使用cookie最好將cookie加密
- session存儲在服務器上,對客戶端是透明的。不存在敏感信息泄露問題
- 從有效期上比較
- cookie保存在硬盤中,只需要設置maxAge屬性為比較大的正整數(shù),即使關閉瀏覽器,cookie還是存在的
- session的保存在服務器中,設置maxInactiveInterval屬性值來確定session的有效期。并且session依賴于名為JSESSIONID的cookie,該cookie默認的maxAge屬性為-1。如果關閉了瀏覽器,該session雖然沒有從服務器中消亡,但也失效了。
Servlet安全性問題
- 由于Servlet是單例的,當多個 用戶訪問Servlet的時候,服務器會為每個用戶創(chuàng)建一個線程。當多個用戶并發(fā)訪問Servlet共享資源的時候就會出現(xiàn)線程安全問題。
- 規(guī)則:
- 如果一個變量需要多個用戶共享,則應當在訪問該變量的時候,加同步機制
synchronized(對象){} - 如果一個變量不需要共享,則直接在doGet()或者doPost(),這樣不會存在線程安全問題
- 如果一個變量需要多個用戶共享,則應當在訪問該變量的時候,加同步機制
JSP有哪些動作以及作用是什么?
-
jsp:include:在頁面被請求的時候引入一個文件 -
jsp:useBean:尋找或者實例化 一個JavaBean -
jsp:setProperty:設置JavaBean的屬性 -
jsp:getProperty:輸出某個JavaBean的屬性 -
jsp:forwar:把請求轉到一個新的頁面 -
jsp:plugin:根據(jù)瀏覽器類型為Java查詢生成OBJECT或EMBED標記 -
jsp:param:動作(傳遞參數(shù)):到達跳轉頁面也可以通過request.getParameter("參數(shù)名")方式取出參數(shù)值
jsp有哪些內(nèi)置對象
- request
- response
- pageContext
- session
- application
- out
- config
- page
- exception
如何配置Servlet
- Servlet的聲明:
<servlet>
<servlet-name>servlet的名字</servlet-name>
<servlet-class>servlet的完整類名</servlet-class>
</servlet>
- Servlet訪問方式的聲明
<servlet-mapping>
<servlet-name>servlet的名字(應該和聲明的名字保持一致)</servlet-name>
<url-pattern>訪問路徑</url-pattern>
</servlet-mapping>
JSP中動態(tài)include和靜態(tài)include有什么區(qū)別?
- 靜態(tài)include指令用于把另一個頁面包含到當前頁面中,在轉換成servlet的時候包含進去的。
動態(tài)include用jsp:include動作失效<jsp:include page="included.jsp" flush="true"/>它總是會檢查所含文件中的變化,適合用于包含動態(tài)頁面,并且可以帶參數(shù) - 靜態(tài)包含:將兩個頁面編譯成一個class,里面的資源可共享
動態(tài)包含:將兩個頁面編譯成兩個獨立的class,里面的資源無法共享
JSP如何處理JSON
- 在JSP總處理JSON,通常需要配套使用jQuery控件,并且導入一些Common jar包。使用jQuery控件是因為它能有效的解析并且展示JSON數(shù)據(jù)。
如何處理Servlet的線程不安全問題
- 不適用字段變量
- 使用final修飾變量
- 線程安全就是多線程操作同一個對象不會有問題,線程同步一般來保護線程安全
判斷瀏覽器是否支持Cookie
- 可以使用JavaScript的方法navigator.cookieEnabled判斷瀏覽器是否支持cookie
JSP頁面跳轉
- JSP頁面跳轉有兩種方式,forward和redirect(轉發(fā)和重定向)
404、500、304分別是什么意思
- 404:找不到URL請求的路徑,一般是工程名不對或者拼寫錯誤
- 500:服務器內(nèi)部錯誤,一般是服務器內(nèi)部代碼編寫錯誤,也有可能是拋異常導致
- 304:表示瀏覽器端有緩存,并且服務端未更新,不用向服務器端請求資源
Servlet監(jiān)聽器的作用
- Servlet監(jiān)聽器對特定的事件進行監(jiān)聽,當產(chǎn)生這些事件的時候,會執(zhí)行監(jiān)聽器的代碼??梢詫玫募虞d、卸載,對session的初始化、銷毀,對session中值的變化等事件進行監(jiān)聽
四大共享范圍:
- application:全局作用范圍,整個應用程序共享,就是在部署文件總的同一個webApp共享,生命周期為:應用程序啟動到停止
- session:會話作用域,當用戶首次訪問時,產(chǎn)生一個新的會話,以后服務器就可以記住這個會話狀態(tài)。生命周期:會話超時,或者服務器強制使session會話失效
- request:請求作用,就是客戶端的一次請求
- page:一個JSP頁面
以上作用范圍越來越小,request和page的生命周期都是短暫的,它們之間的區(qū)別就是:一個request可以包含多個page頁(include、forward和filter)
我們沒有寫Servlet的構造方法,那么容器是怎么創(chuàng)建Servlet的實例?
- 容器會自動為Servlet寫一個無參的構造方法,并通過Class.forName(className).newInstance()來創(chuàng)建Servlet實例。
Document對象常用方法:
-
getElementById():返回擁有指定id的第一個對象的引用 -
getElementsByName():返回帶有指定名稱的對象的集合 -
getElementsByTagName():返回帶有指定標簽名的對象的集合 -
getElementsByClassName():返回帶有指定類名的對象的集合 -
write():向文檔寫文本、HTML或JavaScript代碼
spring中BeanFactory和ApplicationContext的區(qū)別
| BeanFactory | ApplicationContext |
|---|---|
| 使用懶加載 | 使用即使加載 |
| 使用語法顯示提供資源對象 | 自己創(chuàng)建和管理資源對象 |
| 不支持國際化 | 支持國際化 |
| 不支持基于依賴的注解 | 支持基于依賴的注解 |
Ajax的原理和實現(xiàn)步驟
-
Ajax即"Asynchronous JavaScript And XML"(異步JavaScript和XML),通過在后臺與服務器進行少量數(shù)據(jù)交換,可以使網(wǎng)頁實現(xiàn)異步更新。這意味著可以在不重新加載整個網(wǎng)頁的情況下,對網(wǎng)頁的某部分進行跟新 - 原理:HTTP協(xié)議的異步通信
- 實現(xiàn)步驟:
創(chuàng)建XMLHttpRequest對象
注冊回調(diào)函數(shù)
設置連接信息
發(fā)送數(shù)據(jù),與服務器開始交互
接受服務器返回數(shù)據(jù)
數(shù)據(jù)庫的分類及常用的數(shù)據(jù)庫
- 數(shù)據(jù)庫分為:關系型數(shù)據(jù)庫和非關系型數(shù)據(jù)庫
- 關系型:MySQL、Oracle、SQL server等
- 非關系型:redis、memcache、mogodb、Hadoop等
事務四個基本特征或ACID特性
事務必須滿足四大特征:原子性、一致性、隔離性、持久性/持續(xù)性
- 原子性:表示事務內(nèi)操作不可分割。要么都成功、要么都是失敗
- 一致性:要么都成功、要么都是失敗。后面的失敗了要對前面的操作進行回滾
- 隔離性:一個事務開始后,不能被其他事務干擾
- 持久性/持續(xù)性:表示事務開始了,就不能終止
如何實現(xiàn)對象克隆
- 1.實現(xiàn)Cloneable接口并重寫Object類中的clone()方法
- 2.實現(xiàn)Serializable接口,通過對象的序列化和反序列化實現(xiàn)克隆
線程的生命周期
- 新建(New)、就緒(Runnable)、運行(Running)、阻塞(Blocked)和死亡(Dead)五種狀態(tài)
Java類實現(xiàn)序列化有幾種方法
- 實現(xiàn)Serializable接口或實現(xiàn)Externalizable
在Collection框架中實現(xiàn)排序,要實現(xiàn)什么樣的接口
- Collection框架中實現(xiàn)比較要實現(xiàn)Comparable接口或Comparator接口,并實現(xiàn)比較方法
解釋Serializable接口的作用
- Serializable接口描述啟動其序列化功能,未實現(xiàn)此接口的類將無法使其任何狀態(tài)序列化或反序列化。Serializable接口沒有方法或字段,僅用于標識可序列化,標識實現(xiàn)了該接口的對象屬性可被序列化
集合
- 集合類存放于java.util包中
- 集合類存放的都是對象的引用,,而非對象本身,出于表達上的便利,稱集合中的對象就是指集合中對象的引用(reference)
- 集合類型主要有3種:set、list和map
- 集合接口分為:Colleection和Map,list、set實現(xiàn)了Collection接口
實現(xiàn)Set接口的常用類有
- HashSet類(底層數(shù)據(jù)結構是數(shù)組 + 單鏈表 + 紅黑樹,無序)
- LinkedHashSet(底層數(shù)據(jù)結構是數(shù)組 + 單鏈表 + 紅黑樹 + 雙向鏈表,無序)
- TreeSet(底層數(shù)據(jù)結構紅黑樹,有序)
什么是不可變對象
- 不可變對象是指對象一旦被創(chuàng)建,狀態(tài)就不能再改變。任何修改都會創(chuàng)建一個新的對象,如String、Integer及其它包裝類
Java中的final關鍵字有哪些用法
- 修飾類:表示該類不能被繼承
- 修飾方法:表示方法不能被重寫
- 修飾變量:表示變量只能一次賦值以后值不能被修改(常量)
常見的運行時異常
- ArithmeticException(算術異常)
- ClassCaseException(類轉換異常)
- IllegalArgumentException(非法參數(shù)異常)
- IndexOutOfBoundsException(下標越界異常)
- NullPointerException(空指針異常)
什么是線程安全
- 如果代碼所在的進程中有多個線程在同時運行,而這些線程可能會同時運行這段代碼。如果每次運行結果和單線程運行的結果是一樣的,而且其他的變量的值也和預期的是一樣的,就是線程安全的。一個線程安全的計數(shù)器類的同一個實例對象在被多個線程使用的情況下也不會出現(xiàn)計算失誤。
Vector是一個線程安全類?
- Vector是用同步方法來實現(xiàn)線程安全的,而和它相似的ArrayList不是線程安全的
集合框架中的泛型有什么優(yōu)點
- 避免了在運行時出現(xiàn)ClassCaseException
- 使代碼更整潔
- 不會產(chǎn)生類型檢查的字節(jié)碼指令,給運行時帶來好處
如果兩個建的hashcode相同,如何獲取值對象
- 當我們調(diào)用get()方法,HashMap會使用鍵對象的hashcode找到bucket位置,然后會調(diào)用keys.equals()方法去找到鏈表中正確的節(jié)點,最終找到要找的值對象
為什么Map接口不繼承Collection接口
- 盡管Map接口和它的實現(xiàn)也是集合框架的一部分,但Map不是集合,集合也不是Map。因此,Map繼承Collection毫無意義。如果Map繼承Collection接口,那么元素去哪兒?Map包含key-value鍵值對,它提供抽取key或value列表集合的方法,但是它不適合"一組對象"規(guī)范



