Java面試題_第二階段(Servlet、HTTP、Session、JSP、 Ajax、Filter、JDBC、Mysql、Spring)


1.1. 描述Servlet調用過程?

答案:

(1)在瀏覽器輸入地址,瀏覽器先去查找hosts文件,將主機名翻譯為ip地址,如果找不到就再去查詢dns服務器將主機名翻譯成ip地址

(2)瀏覽器根據ip地址端口號訪問服務器,組織http請求信息發送給服務器

(3)服務器收到請求后首先根據Host請求頭判斷當前訪問的是哪台虛擬主機。

(4)服務器根據http請求頭中的請求URI判斷當前訪問的是哪個web應用

(5)服務器根據http請求頭中的請求URI判斷當前訪問的是web應用中的哪個web資源。

(6)檢查web應用的web.xml文件,如果根據路徑找到具體的servlet處理類的全路徑名交給該servlet處理,如果找不到就交給缺省servlet處理

(7)這個過程中瀏覽器只知道自己發出來http請求,不久就收到了http響應,瀏覽器不知道也不關心服務器內部是如何處理的。瀏覽器和服務器之間的關系是非常單純的,只有HTTP協議

(8)解析請求、封裝RequestResponse對象、創建Servlet、調用Service方法都是服務器自動進行的,開發人員只需要寫好Servlet配置進容器中即可,無需操心具體的底層實現。

1.2. 簡述Servlet生命周期?

答案:

(1)Servlet第一次被訪問到時創建對象,創建出來后立即執行init方法執行初始化的操作。

(2)從此以后該對象一直駐留在內存中為后續的對這個Servlet的請求進行服務。

(3)直到服務器關閉web應用移除出容器時,隨着web應用的銷毀Servlet對象銷毀掉,在銷毀之前調用destory方法執行善后工作。

(4)在存活期間,每次對Servlet 的調用都會導致Service方法的執行

1.3. 什么是http協議?

答案:

HTTP協議就是一套基於tcp/ip協議的應用層協議 。簡單來說,就是一個基於應用層的通信規范,雙方要進行通信,大家都要遵守一個規范,這個規范就是HTTP協議。它規定了客戶端(通常是瀏覽器)和服務器之間的通信方式。

1.4. HTTP協議工作原理?

答案:

HTTP協議基於請求響應模型。

一次請求對應一次響應

首先客戶端發送一個請求(request)給服務器,服務器在接收到這個請求后將生成一個響應(response)返回給客戶端。

1.5. HTTP協議的特點是什么 ?

答案:

(1) 它是一個無狀態的協議,服務器端在處理相應請求后不會保留任何客戶端的信息,每次請求都是獨立的

(2) 客戶端與服務器端的每一次數據交互,都要經過一次請求/響應的過程。

(3) 服務器端無法識別能夠出發客戶端請求的方法

(4) 一個典型的HTTP請求分為 一個請求行 若干請求頭 一個空行 實體內容

1.6. get和post請求的區別?

答案:

(1) get請求用來從服務器上獲得資源,而post是用來向服務器提交數據;

(2) get將表單中數據按照name=value的形式,添加到action 所指向的URL 后面,並且兩者使用"?"連接,而各個變量之間使用"&"連接;post是將表單中的數據放在HTTP協議的請求頭或消息體中,傳遞到action所指向URL;

(3) get傳輸的數據要受到URL長度限制(1024字節);而post可以傳輸大量的數據, POST數據是沒有限制的,上傳文件通常要使用post方式;

(4) 使用get時參數會顯示在地址欄上,如果這些數據不是敏感數據,那么可以使用get;對於敏感數據還是應用使用post;

(5) get使用MIME類型application/x-www-form-urlencoded的URL編碼(也叫百分號編碼)文本的格式傳遞參數,保證被傳送的參數由遵循規范的文本組成,例如一個空格的編碼是"%20"。

(6) Jsp頁面中的FORM標簽里的method屬性為get時調用doGet(),為post時調用doPost()。

1.7. 請求亂碼產生的原因?

答案:

瀏覽器用什么碼表來打開表單頁面就用什么編碼來發送數據。當前我們的注冊頁面指定了用utf-8來打開。

這就決定了瀏覽器是用utf-8打開的頁面,瀏覽器在提交表單時是用utf-8編碼的。

而tomcat默認情況下會使用iso8859-1來進行解碼。

我們知道全世界的碼表都兼容iso8859-1,所以英文處理是沒有問題的。

但是iso8859-1中並沒有中文,iso8859-1對於無法處理的字節都使用?替代,所以我們看到的都是?。

1.8. 如何來處理get請求產生的亂碼?

答案:

由於客戶端發送時使用的是utf-8編碼而服務器用iso8859-1解碼造成了亂碼,雖然字符已經亂掉了,但底層的字節仍然是正確的,我們只要將亂碼字符getBytes(“iso8859-1”)轉換為字節,就是正確的字節,再將這些字節new String(bytes,“utf-8”)按照正確的碼表編碼,就可以轉換回正確的字符了。從而解決了亂碼。

1.9. Request生命周期

答案:

request對象的生命周期是針對一個客戶端(一個瀏覽器應用程序)的一次請求,當請求完畢之后,request里邊的內容也將被釋放,一個請求開始時創建,請求結束后銷毀。

1.10. 如何處理響應亂碼?

答案:

通過response.setHeader("Content-Type", "text/html;charset=utf-8")方法,通知服務器發送數據時的碼表;通過response.setCharacterEncoding("utf-8")方法,通知瀏覽器解析時使用的碼表。兩碼相同就不會有亂碼了。

response提供了setContentType("text/html;charset=UTF-8")快捷方法,在它的底層,會同時做上面兩件事,所以可以一行代碼解決response產生的亂碼問題。

1.11. 簡述ServletContext生命周期?

答案:

ServletContext對象代表當前web應用。當服務器啟動時,服務器在啟動時會依次加載web應用,每一個web應用加載完成后都會創建一個ServletContext對象唯一代表該web應用,這個對象一直存活,直到web應用移除出容器或服務器關閉時,隨着應用銷毀,ServletContext對象跟着銷毀。

1.12. 轉發與重定向的比較?

答案:

轉發是服務器內部資源跳轉,重定向是通過302+Location實現瀏覽器跳轉訪問。

轉發一次請求一次響應,重定向兩次請求兩次響應。

轉發地址欄不發生變化,重定向地址欄會發生變化。

轉發之前和轉發之后request是一個,重定向之前和之后不是一個request。

1.13. Session生命周期?

答案:

當程序第一次調用到request.getSession()代碼時,服務器明確的知道了需要用到session了,此時創建session。

如果session超過30分鍾(可以在web.xml中配置的)沒人使用,服務器認為這個session超時了,銷毀session。

明確的調用session.invalidate(),session立即銷毀。

服務器被非正常關閉或web應用被移除出容器,此時隨着web應用的銷毀session銷毀.如果是正常關閉,session會被鈍化.當下次服務器正常啟動時,沒有超時的session還會被活化回來。

1.14. session的原理?

答案:

session的原理:在服務器第一次調用request.getSession()方法的時候,會在內存中創建一個session對象,此對象具有一個獨一無二的id值,此id值將會以cookie(JSESSIONID)的形式發送給瀏覽器,瀏覽器以后每次訪問都會帶着此cookie,服務器就利用此cookie區分瀏覽器找到對應的session空間。

1.15. cookie與session的區別

答案:

cookie數據存放在客戶的瀏覽器上,session數據放在服務器上

cookie不是很安全,別人可以分析存放在本地的COOKIE並進行COOKIE欺騙,考慮到安全應當使用session

session會在一定時間內保存在服務器上。當訪問增多,會比較占用你服務器的性能,考慮到減輕服務器性能方面,應當使用COOKIE

1.16. JSP和Servlet是什么關系?

答案:

其實這個問題在上面已經闡述過了,Servlet是一個特殊的Java程序,它運行於服務器的JVM中,能夠依靠服務器的支持向瀏覽器提供顯示內容。JSP本質上是Servlet的一種簡易形式,JSP會被服務器處理成一個類似於Servlet的Java程序,可以簡化頁面內容的生成。Servlet和JSP最主要的不同點在於,Servlet的應用邏輯是在Java文件中,並且完全從表示層中的HTML分離開來。而JSP的情況是Java和HTML可以組合成一個擴展名為.jsp的文件。有人說,Servlet就是在Java中寫HTML,而JSP就是在HTML中寫Java代碼,當然這個說法是很片面且不夠准確的。JSP側重於視圖,Servlet更側重於控制邏輯。

1.17. JSP的九大隱式對象是哪九個

答案:

1:request: 請求對象 在javax.servlet.ServletRequest  作用域為Request來自客服端的請求,如:FORM表單中填寫的信息,常用的方法有getParameter,getParamterName   和getParamterValue通過表用獲取請求對象中包含的參數值。

2:response表示客服端的響應。

3:pageContext對象為頁面的上下文對象,代表當請運行頁面的一些屬性。

4:session:對象代碼服務器與客服端所建立的會話,比如在寫購物,客服軌跡跟蹤,

session”是建立在cookie的基礎之上的。常用方法有getId,getValues等。

5:application對象負責提供應用程序在服務端運行時的一些全局信息,方法有getMimeType等。

6:out:與response不同,通過out對象發送的內容是瀏覽器需要的顯示內容,還可以直接想客服端編寫一個有程序動態生成的HTML的文件。

7:page:page里的變量沒法從index.jsp傳遞到test.jsp。只要頁面跳轉了,就不見了。

8: exception:他是一個列外的對象,當頁面發生了列外,就會會創建該對象。

9:config:是在servlet初始化Servlet的時候,JSP引擎向他傳遞信息用的,此消息包括Servlet初始化時所需要的參數。

1.18. 如何防止SQL注入攻擊呢?

答案:

SQL注入:就是通過把SQL命令插入到Web表單遞交或輸入域名或頁面請求的查詢字符串,最終達到欺騙服務器執行惡意的SQL命令。具體來說,它是利用現有應用程序,將(惡意)的SQL命令注入到后台數據庫引擎執行的能力,它可以通過在Web表單中輸入(惡意)SQL語句得到一個存在安全漏洞的網站上的數據庫,而不是按照設計者意圖去執行SQL語句。

防止的方法:

(1) 永遠不要信任用戶的輸入,要對用戶的輸入進行校驗,可以通過正則表達式,或限制長度,對單引號和雙"-"進行轉換等。

(2) 永遠不要使用動態拼裝SQL,可以使用參數化的SQL或者直接使用存儲過程進行數據查詢存取。

(3) 永遠不要使用管理員權限的數據庫連接,為每個應用使用單獨的權限有限的數據庫連接。

(4) 不要把機密信息明文存放,請加密或者hash掉密碼和敏感的信息。

(5) 應用的異常信息應該給出盡可能少的提示,最好使用自定義的錯誤信息對原始錯誤信息進行包裝,把異常信息存放在獨立的表中。

1.19. Mysql數據庫優化

答案:

(1)查詢時,能不用* 就不用,盡量寫全字段名。

(2)索引不是越多越好,每個表控制在6個索引以內。范圍where條件的情況下,索引不起作用,比如where value<100

(3)大部分情況連接效率遠大於子查詢,但是有例外。當你對連接查詢的效率都感到不能接受的時候可以試試用子查詢,雖然大部分情況下你會更失望,但總有碰到驚喜的時候不是么...

(4)多用explain 和 profile分析查詢語句

(5)有時候可以1條大的SQL可以分成幾個小SQL順序執行,分了吧,速度會快很多。

(6)每隔一段時間用alter table table_name engine=innodb;優化表

(7)連接時注意:小表 jion 大表的原則

(8)學會用explain 和 profile判斷是什么原因使你的SQL慢

(9)查看慢查詢日志,找出執行時間長的SQL進行優化

(10)盡量避免使用order by

(11)因為where子句后面的條件是執行順序是從右到左,所以盡量把能過濾掉大部分數據的條件放在最后

1.20. Filter 的作用是什么

答案:

init為初始化方法,在Filter對象被創建出來時,Servlet容器會調用該方法對filter進行初始化。

destory為銷毀的方法,在過濾器對象被銷毀之前,服務器會調用這個方法執行善后工作。

doFilter為過濾器中最核心的方法,對訪問的請求和響應進行攔截,當過濾器攔截到對資源的訪問時,服務器會自動調用該方法執行過濾代碼。 我們只需要在這個方法中設計過濾器的邏輯代碼即可。

1.21. Filter的生命周期?

答案:

當服務器啟動,web應用加載后,立即創建出這個web應用中的所有過濾器對象,創建出來后立即調用過濾器的init方法執行初始化操作.從此這些過濾器對象駐留在內存中為后續的攔截進行服務.每當攔截到資源時,都會導致dofilter方法執行.最終直到服務器關閉或web應用移除出容器時,隨着web應用的銷毀,過濾器對象銷毀,銷毀之前調用destory方法執行善后工作。

1.22. 什么是數據庫連接池及其工作原理

答案:

對於共享資源,有一個很著名的設計模式:資源池(resource pool)。該模式正是為了解決資源的頻繁分配﹑釋放所造成的問題。為解決上述問題,可以采用數據庫連接池技術。數據庫連接池的基本思想就是為數據庫連接建立一個“緩沖池”。預先在緩沖池中放入一定數量的連接,當需要建立數據庫連接時,只需從“緩沖池”中取出一個,使用完畢之后再放回去。我們可以通過設定連接池最大連接數來防止系統無盡的與數據庫連接。更為重要的是我們可以通過連接池的管理機制監視數據庫的連接的數量﹑使用情況,為系統開發﹑測試及性能調整提供依據。

 

1.23. 如何自己實現一個數據庫連接池

答案:

思路如下:

1:利用class實現DataSource接口

2:在class的構造器一次性創建指定的鏈接將鏈接保存LinkedList中

3:實現getConnection從LinkedList返回一個鏈接

4:提供將鏈接放回方法

Public class MyDataSource inplements DataSource{
    Private LinkedList<Connection> dataSource=new LinkedList<>();
    Public MyDataSource(){
        for(int a=0;a<1000;a++){
            Try{
                DriverManager.registerDriver(new SQLServerDriver());
                Connection con=DriverManager.getConnection(“jdbc:sqlserver://localhost:1443;DatabaseName=liming”,”root”,”liming”
            }catch(Exception e){
            
            }
        }
        Public Connection getConnetion(){
          Final Connection conn=dataSource.removeFirst();
        }
        Public void releasConnection(Connection conn){
          dataSource.add(conn);
        }
    }
}

 

1.24.  http和https的區別?

答案:

HTTP協議傳輸的數據都是未加密的,也就是明文的,因此使用HTTP協議傳輸隱私信息非常不安全,為了保證這些隱私數據能加密傳輸,於是網景公司設計了SSL(Secure Sockets Layer)協議用於對HTTP協議傳輸的數據進行加密,從而就誕生了HTTPS。簡單來說,HTTPS協議是由SSL+HTTP協議構建的可進行加密傳輸、身份認證的網絡協議,要比http協議安全。

1.25. Servlet的單例問題

答案:

Servlet是一個供其他java程序調用的類,它不能獨立運行,針對客戶端的多次請求,通常狀況下,Servlet只會創建一個Servlet實例對象,一旦創建它就會駐留在內存中,為后續的請求提供服務,直至退出web應用為止,也就是當我們關閉了瀏覽器之后我們的Servlet就終止了。
當Servlet第一次訪問的時候,就被加載到內存中,以后該實例對各個請求服務,沒次情況會調用一次service方法。
這樣會出現什么問題:因為Servlet是單例的,所以會出現線程安全問題

1.26. "" 和 null的區別

答案:

如果說str是null,那么內存根本沒創建字符串對像,並由str引用。不能調用object的方法。

如果說str是空串,那么確實存在一個由str引用的字符串對像,只不過這個字符串的值是""。長度為0;

在獲取請求參數的時候為什么要這樣判斷呢?

if(null==str || "".equals(str)){
    return "不合法參數";
}

如果我們在表單中什么都不填 接收到的字符串就是null;

如果我們在表單中填“”,接受到的字符串是“”,但是存入數據庫后,查詢出來的就是null;

1.27. Servlet的多線程同步問題

答案:

  Servlet本身是單實例的,這樣當有多個用戶同時訪問某個Servlet時,會訪問該唯一的Servlet實例中的成員變量,如果對成員變量進行寫入操作,那就會導致Servlet的多線程問題,即數據不一致。
1.解決Servlet多線程同步問題的最好方式:去除實例變量,使用局部變量。
不使用成員變量,而使用局部變量,因為局部變量在每個線程中都有各自的實例。
  所以對Servlet來說,如果要對某個變量做寫入操作,一定不要使用成員變量,而要使用局部變量。
2.使用同步代碼塊
  synchronized{}
3.Servlet實現javax.serlvet.SingleThreadModel,Servlet2.4中已經廢棄了該接口,此時Servlet容器將保證Servlet實例以單線程方式運行,也就是說,同一時刻,只會有一個線程執行Servlet的service()方法。

1.28. request.getParameter()和request.getAttribute()的區別?

答案:

a、request.getParameter()獲取的類型是String;

    request.getAttribute()獲取的類型是Object

b、request.getPrameter()獲取的是POST/GET傳遞的參數值和URL中的參數;

     request.getAttribute()獲取的是對象容器中的數據值/對象

c、request.setAttribute()和request.getAttribute()可以發送、接收對象;

    request.getParamter()只能接收字符串,官方不開放request.setParamter()(也就是沒有這個方法)

    setAttribute()和getAttribute()的傳參原理:

    setAttribute()是應用服務器把這個對象放在該頁面所對應的一塊內存中去,當你的頁面服務器重定向到另外一個頁面時,

    應用服務器會把這塊內存拷貝到另一個頁面所對應的那塊內存中。這個就可以通過getAttribute()獲取到相應的參數值或者對象。

1.29. JSP中動態include和靜態include的區別?

答案:

 a、靜態include:語法:<%@ include file="文件名" %>,相當於復制,編輯時將對應的文件包含進來,當內容變化時,不會再一次對其編譯,不易維護。

 b、動態include:語法:<jsp:include page="文件名">,能夠自動檢查被包含文件,當客戶端對JSP文件進行請求時,會重新將對應的文件包含進來,進行實時的更新。

 

1.30.  詳細描述MVC。

答案:

基於java的web應用系統采用MVC設計模型,即用Model(模型)、View(視圖)和Controller(控制)分離設計,這是目前web應用服務系統的主流設置方向。

      Model:處理業務邏輯的模塊。

      View:負責頁面顯示,顯示Model的處理結果給用戶,主要實現數據到頁面的轉換過程。

      Controller:負責每個請求的分發,把Form數據傳遞給Model進行處理,處理完成后,把處理結果返回給相應的View顯示給用戶。

1.31. EL表達式的功能,為什么要用EL表達式?(Expression Language)

答案:

功能:

a、從四個域對象中取出數據數據顯示。

b、取出請求參數數據顯示。

原因:

在頁面中用jsp腳本和jsp表達式來獲取數據顯示比較麻煩

a、需要判斷

b、可能需要強轉

1.32. 如何防止表單重復提交?

答案:

使用session技術:

a、在regist.jsp頁面中生成一個為一個隨機值,將其保存到session中,同時將其保存為表單的隱藏域的值。

b、在處理注冊的請求時,獲取session中的值,獲取請求參數的值,比較兩者是否相同,如果相同說明不是重復提交,請求通過同時刪除session中保存的的值,如果不相同則是重復提交,不能通過。

1.33. 什么是web容器?

答案:

給處於其中的應用程序組件(JSP、Servlet)提供一個環境,是JSP、Servlet直接跟容器中的變量交互,不必關注其他系統問題。

主要有web服務器來實現。例如:tomcat、weblogic、sphere、JBoss等。該容器提供的接口嚴格遵守J2EE規范中的web application標准。

我們把遵守以上標准的web服務器叫做J2EE的web容器。

1.34. J2EE常用的設計模式?說明工廠模式。

答案:

Java中一共有23中設計模式:

Factory(工廠模式)、Builder(建造模式)、Factory Method(工廠方法模式)、ProtoType(原始模型模式)、Singleton(單例模式)、

Facade(門面模式)、Adapter(適配器模式)、Bridge(橋梁模式)、Composite(合成模式)、Decorator(裝飾模式)、

FlyWeight(享元模式)、Proxy(代理模式)、Command(命令模式)、Interpreter(解釋器模式)、Visitor(訪問者模式)、

Iterator(迭代子模式)、Mediator(調停者模式)、Memento(備忘錄模式)、Observer(觀察者模式)、State(狀態模式)、

Strategy(策略模式)、Template Method(模板方法模式)、Chain Of Responsibility(責任鏈模式)、

工廠模式:工廠模式是一種經常被使用到的模式,根據工廠模式實現的類可以根據提供的數據生成一組類中某個類的實例,通常一組類中有一個公共的抽象父類並且實現了相同的方法,但是這些方法針對不同的數據進行了不同的操作。首先需要定義一個基類,該類的子類通過不同的方法實現了基類中的方法。然后定義一個工廠類,工廠類可以根據條件生成不同的子類實例。當得到子類的實例后,開發人員可以調用基類中的方法而不必考慮到底返回的是哪一個子類的實例。

1.35. 什么是事務?

答案:

事務作為一個邏輯單元執行的一系列操作,一個邏輯工作單元必須有四個屬性,稱為ACID(原子性、一致性、隔離性和持久性)屬性,

只有這樣才能成為一個事務:

原子性:事務必須是原子工作單元,對於其數據修改,要么全都執行,要么全都不執行。

一致性:事務在完成時,必須使所有的數據保持一致的狀態。在相關數據庫中,所有規則都必須應用於事務的修改,以保持所有數據的完整性。事務結束時,所有的內部數據結構(如B樹索引或雙向鏈表)都必須是正確的。

隔離性:由並發事務所做的修改必須與任何其他並發事務所做的修改隔離。事務查看數據時數據所處的狀態,要么是另一並發事務修改它之前

的狀態,要么是另一並發事務修改它之后的狀態,事務不會查看中間狀態的數據。這稱為可串行性,因為它能夠重新裝載起始數據,並且重播

一系列事務,以使數據結束時的狀態與原始事務執行的狀態相同。

持久性:事務完成后,它對於系統的影響是永久性的。該修改即使出現系統故障也將一直保持。

1.36. 數據庫有幾種隔離級別?

答案:

1、Serializable (串行化):可避免臟讀、不可重復讀、幻讀的發生

2、Repeatable read (可重復讀):可避免臟讀、不可重復讀的發生。

3、Read committed (讀已提交):可避免臟讀的發生。

4、Read uncommitted (讀未提交):最低級別,任何情況都無法保證

1.37. 簡述web.xml的作用

答案:

屬於部署描述符,在整個JAVA中只要是容器都會存在部署描述符,此部署描述符可以控制整個WEB中各個組件的運行狀態,也可以配置整個窗口的狀態

1.38. sql優化:(索引、范式)

答案:

三范式:

   第一范式(確保每列保持原子性)最基本范式。數據庫表中所有字段值都是不可分解的原子值,就滿足了第一范式。

第二范式(確保表中的每列都和主鍵相關)在第一范式上更近一層。確保數據庫表中的每一列都和主鍵相關,而不能只與主鍵的某一部分相關,也就是說一個表中只能保存一種數據,不可以吧多種數據保存在一張表中。

第三范式:確保每列都和主鍵列直接相關,不是間接相關

索引:

    避免對索引字段進行計算、避免索引在字段上使用not、<>、!=、避免在索引上使用IS NULL和NOT NULL避免在索引列上出現數據類型轉換、避免索引字段使用函數、避免建立索引的列出現空值

1.39. Ajax原理

答案:

Ajax的工作原理相當於在用戶和服務器之間加了—個中間層,使用戶操作與服務器響應異步化。並不是所有的用戶請求都提交給服務器,像—些數據驗證和數據處理等都交給Ajax引擎自己來做, 只有確定需要從服務器讀取新數據時再由Ajax引擎代為向服務器提交請求。

    Ajax其核心只有JavaScript、XMLHTTPRequest和DOM,在舊的交互方式中,由用戶觸發一個HTTP請求到服務器,服務器對其進行處理后再返回一個新的HTHL頁到客戶端, 每當服務器處理客戶端提交的請求時,客戶都只能空閑等待,並且哪怕只是一次很小的交互、只需從服務器端得到很簡單的一個數據,都要返回一個完整的HTML頁,而用戶每次都要浪費時間和帶寬去重新讀取整個頁面。而使用Ajax后用戶從感覺上幾乎所有的操作都會很快響應沒有頁面重載(白屏)的等待。

1.40. JDBC的原理

答案:

 

 

1.41. SQL注入攻擊

答案:

SQL注入是一種將SQL代碼添加到輸入參數中,傳遞到服務器解析並執行的一種攻擊手法。

SQL注入攻擊是輸入參數未經過濾,然后直接拼接到SQL語句當中解析,執行達到預想之外的一種行為,稱之為SQL注入攻擊。

1.42. 如何防止SQL注入攻擊

答案:

利用新對象PreparedStatement對象完成,先將SQL骨架發送給數據庫服務器,然后再將參數單獨發給服務器,並將參數中的關鍵字當做一個普通字符串來處理,進而起到防止SQL注入的問題

1.43. 對連接池的理解

答案:

用來提高程序的效率,創建一個容器,容器中存放已經獲取到了的數據庫連接對象,對外提供獲取連接和還回連接的方法,外界需要時就從容器中獲取,用完就還回容器中。

1.44. HTML和xml的區別?

答案:

XML是可擴展標記語言,而HTML超文本標記語言。不同之處:

1、語法有所不同。XML語法比較嚴謹而HTML語法比較松散。

2、用途不同。XML主要用於數據格式化存儲而HTML主要用於網頁的編輯。

1.45. 在JS中==和===的區別?

答案:

簡單來說: == 代表相同, ===代表嚴格相同, 為啥這么說呢,

這么理解: 當進行雙等號比較時候: 先檢查兩個操作數數據類型,如果相同, 則進行===比較, 如果不同, 則願意為你進行一次類型轉換, 轉換成相同類型后再進行比較, 而===比較時, 如果類型不同,直接就是false.

1.46. SQL優化

答案:

1. SELECT子句中避免使用‘*’

2. SQL語句用大寫的

3. 用IN來替換OR

4. 查詢語句中不要使用 *

5. 盡量減少子查詢,使用關聯查詢(left join,right join,inner  join)替代

6. 減少使用IN或者NOT IN ,使用exists,not exists或者關聯查詢語句替代

7. or 的查詢盡量用 union或者union all 代替

8. 合理的增加冗余的字段(減少表的聯接查詢)

9. 增加中間表進行優化(這個主要是在統計報表的場景,

1.47. Tomcat配置,部署優化

答案:

1.內存優化:Tomcat依賴於JVM,可以配置JVM的內存配置

2.最大連接數配置(並發能力)

通常搭配Nginx提升Tomcat的並發性能

1.48. 自動刷新,定時刷新

答案:

自動刷新不僅可以實現一段時間之后自動跳轉到另一個頁面,還可以實現一段時間之后自動刷新本頁面。Servlet中通過HttpServletResponse對象設置Header屬性實現自動刷新例如:

Response.setHeader("Refresh","1000;URL=http://localhost:8080/servlet/example.htm");

其中1000為時間,單位為毫秒。URL指定就是要跳轉的頁面(如果設置自己的路徑,就會實現沒過一秒自動刷新本頁面一次)

1.49. BS和CS的區別?

答案:

1. C/S用戶固定,並且處於相同區域,要求擁有相同的操作系統。B/S要有操作系統和瀏覽器就行。與操作系統平台無關。

2. C/S客戶端的計算機電腦配置要求較高。B/S客戶端的計算機電腦配置要求較低。

3. C/S每一個客戶端都必須安裝和配置軟件,客戶端不必安裝,使用瀏覽器訪問,易推廣。B/S最大的優點就是可以在任何地方進行操作而不用安裝任何專門的軟件。

4. C/S每一個客戶端都要升級程序。可以采用自動升級。BS客戶端不必安裝及維護。

5. C/S一般面向相對固定的用戶群,程序更加注重流程,它可以對權限進行多層次校驗,提供了更安全的存取模式,對信息安全的控制能力很強。一般高度機密的信息系統采用C/S結構適宜。

1.50. 事務有哪些特性

事務的特性:ACID

A - 原子性 Atomic

   數據操作的最小單元是事務,而不是SQL語句

C - 一致性 Consistency

轉賬前 a+b = 100

轉帳后 a+b = 100

I - 隔離性 Isolation

一個事物進行中時,另一事物不能操作數據

D - 持久性 Durancy

事務沒有提交之前,數據操作只保存在日志文件中

提交事務之后,數據持久生效

1.51. html和jsp的區別及優缺點

答案:

 HTML(Hypertext Markup Language)文本標記語言,它是靜態頁面,和JavaScript一樣解釋性語言,為什么說是解釋性語言呢?因為,只要你有一個瀏覽器那么它就可以正常顯示出來,而不需要指定的編譯工具,只需在TXT文檔中寫上HTML標記就OK。
JSP(Java Server Page)看這個意思就知道是Java服務端的頁面,所以它是動態的,它是需要經過JDK編譯后把內容發給客戶端去顯示,我們都知道,Java文件編譯后會產生一個class文件,最終執行的就是這個class文件,JSP也一樣,它也要編譯成class文件!JSP不止要編譯,它還得要轉譯,首先把JSP轉譯成一個Servlet文件,然后在編譯成class文件。當用戶訪問JSP時就執行了class文件,最 終......

1.最簡單的區別就是,HTML能直接打開,jsp只能發布到Tomact等服務器上才能打開

2.定義上HTML頁面是靜態頁面可以直接運行,JSP頁面是動態頁它運行時需要轉換成servlet

3.他們的表頭不同,這個是JSP的頭“ <%@ page language="java" import="java.util.*" pageEncoding="gbk"%>”在表頭中有編碼格式和導入包等

4.也是很好區分的在jsp中用<%%>就可以寫Java代碼了,而html沒有<%%>

1.52. HTML和Servlet的異同

答案:

不同: Html是靜態,servlet是動態 html頁面由服務器直接返回, servlet是用來處理客戶請求,並返回html頁面 ,Servlet需要服務器調用servlet方法生成動態html頁面,且需要在web.xml中配置url路徑

1.53. request ,response,session 和 application是怎么用的

答案:

1、Request是客戶端向服務端發送請求

2、Response是服務端對客戶端請求做出響應

3、Session在servlet中不能直接使用,需要通過getSession()創建,如果沒有設定它的生命周期,或者通過invildate()方法銷毀,關閉瀏覽器session就會消失

4、Application不能直接創建,存在於服務器的內存中,由服務器創建和銷毀

1.54. Request和Session的取值區別,以及出現亂碼的解決方式(不能在java代碼中設置)

答案:

1、Request可以通過getAttribute()方法直接取值,也可通過getParameter()取值

2、Session需要通過request.getSession().getAttribute()才能取值

3、Request是針對一次請求,Session是針對整個會話

4、在頁面通過contentType,pageEncoding,content設置編碼格式,必須要一致

1.55. 說明一下jsp中<jsp: include page..>和<%@ include file%>的區別

答案:

動態導入

是行為元素、是在請求處理階段引入的,引入執行頁面或servlet所生成的應答文本

先編譯,后包含,就是將每個jsp頁面都單獨轉化成html頁面,最后再將所有的html頁面相加,如果有相同變量不會沖突

<%@ include file="" %> 靜態導入

是指令元素是編譯時包含,引入靜態文本(html,jsp),在JSP頁面被轉化成servlet之前和它融和到一起。先包含,后編譯

1.56. Spring 在ssm中起什么作用?

答案:

Spring:輕量級框架

作用:Bean工廠,用來管理Bean的生命周期和框架集成。

兩大核心:

1、IOC/DI(控制反轉/依賴注入) :把dao依賴注入到service層,service層反轉給action層,Spring頂層容器為BeanFactory。

2、AOP:面向切面編程

1.57. Spring的配置文件中的內容?

答案:

開啟事務注解驅動

事務管理器

開啟注解功能,並配置掃描包

配置數據庫

配置SQL會話工廠,別名,映射文件

不用編寫Dao層的實現類

1.58. Spring主要使用了什么模式?

答案:

工廠模式:每個Bean的創建通過方法

單例模式:默認的每個Bean的作用域都是單例

代理模式:關於Aop的實現通過代理模式

 

1.59. Struts2 和 SpringMvc的區別?

答案:

入口不同:

Struts2:filter過濾器

SpringMvc:一個Servlet即前端控制器

開發方式不同:

Struts2:基於類開發,傳遞參數通過類的屬性,只能設置為多例

SpringMvc:基於方法開發(一個url對應一個方法),請求參數傳遞到方法形參,可以為單例也可以為多例(建議單例)

請求方式不同:

Struts2:值棧村塾請求和響應的數據,通過OGNL存取數據

SpringMvc:通過參數解析器將request請求內容解析,給方法形參賦值,將數據和視圖封裝成ModelAndView對象,最后又將ModelAndView中的模型數據通過request域傳輸到頁面,jsp視圖解析器默認使用的是jstl。

1.60. Mybatis的好處?

答案:

把Sql語句從Java中獨立出來。

封裝了底層的JDBC,API的調用,並且能夠將結果集自動轉換成JavaBean對象,簡化了Java數據庫編程的重復工作。

自己編寫Sql語句,更加的靈活。

入參無需用對象封裝(或者map封裝),使用@Param注解

 

 

ending...

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM