面試官常問的 web後臺 問題 (二)

11、四種會話跟蹤技術作用域

page、request、session、application

(1)page:一個頁面
(2)request::一次請求
(3)session:一次會話
(4)application:服務器從啓動到停止

12、MVC 的各個部分都有那些技術來實現?如何實現?

MVC(Model(業務邏輯層)-View(表示層)-Controller(控制層))

MVC 是 Model-View-Controller 的簡寫。
Model 代表的是應用的業務邏輯(通過 JavaBean,EJB 組件實現)
View 是應用的表示面(由 JSP 頁面產生)
Controller 是提供應用的處理過程控制(一般是一個 Servlet)
通過這種設計模型把應用邏輯,處理過程和顯示邏輯分成不同的組件實現,這些組件可以進行交互和重用。

13、web.xml 文件中可以配置哪些內容?

web.xml 用於配置 Web 應用的相關信息。
如:監聽器(listener)、過濾器(filter)、 Servlet、相關參數、會話超時時間、安全驗證方式、錯誤頁面。

14、session 和 cookie 有什麼區別?

cookie 數據放在瀏覽器,不安全,有被 cookie 欺騙的風險;服務器性能比session高,但單個 cookie 保存的數據太小。
session 數據放在服務器,安全性比cookie高;在一定時間內保存在服務器上,當訪問增多,會比較佔用服務器的性能;

1、cookie 數據存放在客戶的瀏覽器上,session 數據放在服務器上。
2、cookie 不是很安全,別人可以分析存放在本地的 COOKIE 並進行 COOKIE 欺騙,考慮到安全應當使用 session。
3、session 會在一定時間內保存在服務器上。當訪問增多,會佔用服務器性能。
4、單個 cookie 保存的數據不能超過 4K,很多瀏覽器都限制一個站點最多保存 20 個 cookie。

15、CS 與 BS 的聯繫與區別

C/S(Client/Server):建立在局域網;高度機密;注重流程;重用性差;升級難;
B/S(Brower/Server):建立在廣域網;可部分公開;注重速度;重用性好;無縫升級;

C/S 是 Client/Server 的縮寫。服務器通常採用高性能的 PC、工作站或小型機,並採用大型數據庫系統,如 SQLServer、MySQL、Oracle 等,客戶端需要安裝專用的客戶端軟件。
B/S是 Brower/Server 的縮寫,客戶機上只要安裝一個瀏覽器(Browser),如 Google 瀏覽器或 Internet Explorer,服務器安
裝 Oracle、MySQL 或 SQL Server 等數據庫。在這種結構下,用戶界面完全通過 WWW 瀏覽器實現,一部分事務邏輯在前端實現,但是主要事務邏輯在服務器端實現。瀏覽器通過Web Server 同數據庫進行數據交互。

C/S 與 B/S 區別:
1.硬件環境不同:
C/S 一般建立在專用的網絡上, 小範圍裏的網絡環境, 局域網之間再通過專門服務器提供連接和數據交換服務。
B/S 建立在廣域網之上的, 不必是專門的網絡硬件環境,例與電話上網, 租用設備. 信息自己管理. 有比 C/S 更強的適應範圍, 一般只要有操作系統和瀏覽器就行。
2.對安全要求不同
C/S 一般面向相對固定的用戶羣, 對信息安全的控制能力很強. 一般高度機密的信息系統採用 C/S 結構適宜.,可以通過 B/S
發佈部分可公開信息。
B/S 建立在廣域網之上, 對安全的控制能力相對弱, 可能面向不可知的用戶。
3.對程序架構不同
C/S 程序可以更加註重流程, 可以對權限多層次校驗, 對系統運行速度可以較少考慮.
B/S 對安全以及訪問速度的多重的考慮, 建立在需要更加優化的基礎之上. 比 C/S 有更高的要求 ,B/S 結構的程序架構是發
展的趨勢。
4.軟件重用不同
C/S 程序可以不可避免的整體性考慮, 構件的重用性不如在 B/S 要求下的構件的重用性好.
B/S 對的多重結構,要求構件相對獨立的功能. 能夠相對較好的重用.就如買來的餐桌可以再利用,而不是做在牆上的石頭桌子
5.系統維護不同
C/S 程序由於整體性, 必須整體考察, 處理出現的問題以及系統升級. 升級難. 可能是再做一個全新的系統
B/S 構件組成,方面構件個別的更換,實現系統的無縫升級. 系統維護開銷減到最小.用戶從網上自己下載安裝就可以實現升
級.
6.處理問題不同
C/S 程序可以處理用戶面固定, 並且在相同區域, 安全要求高需求, 與操作系統相關. 應該都是相同的系統
B/S 建立在廣域網上, 面向不同的用戶羣, 分散地域, 這是 C/S 無法作到的. 與操作系統平臺關係最小.
7.用戶接口不同
C/S 多是建立的 Window 平臺上,表現方法有限,對程序員普遍要求較高
B/S 建立在瀏覽器上, 有更加豐富和生動的表現方式與用戶交流. 並且大部分難度減低,減低開發成本.
8.信息流不同
C/S 程序一般是典型的中央集權的機械式處理, 交互性相對低
B/S 信息流向可變化, B-B B-C 等信息、流向的變化, 更像交易中心。

16、Java 反射技術主要實現類有哪些,作用分別是什麼?

在 JDK 中,主要由以下類來實現 Java 反射機制,這些類都位於 java.lang.reflect 包中。
1)Class 類:代表一個類
2)Field 類:代表類的成員變量(屬性)
3)Method 類:代表類的成員方法
4)Constructor 類:代表類的構造方法
5)Array 類:提供了動態創建數組,以及訪問數組的元素的靜態方法

17、攔截器與過濾器的區別

攔截器:基於 java 反射機制;不依賴 servlet 容器;只對 action 請求起作用;可訪問 action 上下文和值棧裏的對象;可被多次調用;可獲取IOC容器中各個bean;
過濾器:基於函數回調;依賴servlet 容器;可對幾乎所有請求起作用;不可訪問 action 上下文和值棧裏的對象;只在初始化被調用一次;不可獲取IOC容器中各個bean;

攔截器是基於 java 的反射機制的,而過濾器是基於函數回調。
攔截器不依賴 servlet 容器,過濾器依賴 servlet 容器。
攔截器只能對 action 請求起作用,而過濾器則可以對幾乎所有的請求起作用。
攔截器可以訪問 action 上下文、值棧裏的對象,而過濾器不能訪問。
在 action 的生命週期中,攔截器可以多次被調用,而過濾器只能在容器初始化時被調用一次
攔截器可以獲取 IOC 容器中的各個 bean,而過濾器就不行,這點很重要,在攔截器裏注入一個 service,可以調用業務邏輯。

18、Struts2 的工作流程

①. 請求發送給 StrutsPrepareAndExecuteFilter
②. StrutsPrepareAndExecuteFilter 判定該請求是否是一個 Struts2 請求
③. 若該請求是一個 Struts2 請求,則 StrutsPrepareAndExecuteFilter 把請求的處理交給 ActionProxy
④. ActionProxy 創建一個 ActionInvocation 的實例,並進行初始化
⑤. ActionInvocation 實例在調用 Action 的過程前後,涉及到相關攔截器(Intercepter)的調用
⑥. Action 執行完畢,ActionInvocation 負責根據 struts.xml 中的配置找到相對應的返回結果,調用結果的 execute 方法。
⑦. 執行各個攔截器 invocation.invoke()之後的代碼
⑧. 把結果發送到客戶端

FilterDispatcher是控制器的核心,就是MVC的Struts 2實現中控制層(Controller)的核心!
在這裏插入圖片描述

19、Struts2 優點

①. 基於 MVC 架構,框架結構清晰;
②. 使用 OGNL(Object Graphic Navigation Language 對象圖導航語言):OGNL 可以快速的訪問值棧中的數據、調用值棧中對象的方法;
③. 攔截器:struts2 中的很多特性都是通過攔截器實現的,例如異常處理、文件上傳、驗證等,攔截器是可配置與重用的;
④. 多種表現層技術,如:JSP、FreeMarker、Velocity 等
⑤. 通過配置文件,就可以掌握整個系統各部分之間的關係。
⑥. 異常處理機制,只需在配置文件中配置異常的映射,即可對異常做相應的處理。

Struts2框架是替代了servelt、jsp的一種全新的框架,用於處理用戶發送的請求。

20、談談值棧 ValueStack

在Struts2裏面提供一種存儲機制,類似於域對象,是值棧,可以存值和取值,在action裏面把數據放到值棧裏面,在頁面中獲取到值棧數據。

①. ValueStack 貫穿整個 Action 的生命週期,保存在 request 域中,所以 ValueStack 和 request 的生命週期時一樣的;
②. ValueStack 是多實例的,因爲 Action 是多實例的(Servlet 是單例的),每個 Action 都有一個對應的值棧,Action 對象默認
保存在棧頂;
③. ValueStack 本質上就是一個 ArrayList;
④. 使用 OGNL 訪問值棧內容是,不需要#號,而訪問作用域中的值時,需要#號;
⑤. Struts2 重寫了 request 的 getAttribute 方法,所以可以用 EL 直接訪問值棧中的內容;

ValueStack 實際上就是一個容器,由Struts框架創建,當前端頁面發送請求時,Struts的默認攔截器會將請求中的數據進行封裝,並存入ValueStack的棧頂。

Struts2在啓動時,會創建一個ValueStack對象,當用戶發送請求到對應的Action時,Struts2會把當前被請求的Action01放入CompoundRoot 對象的“棧空間”棧頂,請求結束,Action01會被清除。 (當下一次另一個請求到來時,Struts2會把該請求對應的Action02放入“棧頂”) 所以,我們可以通過Ognl表達式訪問CompoundRoot對象棧頂的Action。
Struts2在請求到來時,首先會創建一個ValueStack; 然後,把當前的Action對象放入棧頂(CompoundRoot); Struts2會把ValueStack存放在request中,屬性爲”struts.valueStack“, 所以,標記庫可以訪問到ValueStack Struts2的很多標記就是通過訪問ValueStack獲得數據的:

  • 通過ognl從ValueStack取數據,並且顯示

      <s:property value="ognl..."/>
    
  • 省略value,取出ValueStack的棧頂

      <s:property />
    
  • 通過ognl從ValueStack取出集合,依次將集合中的對象置於棧頂,在循環中,ValueStack棧頂即爲要顯示的數據

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章