1. 程式人生 > >關於Struts2的筆試題(二)

關於Struts2的筆試題(二)

1. 聊一下你對OGNL表示式的瞭解以及OGNL三要素的瞭解

OGNLObject-Graph Navigation Language(物件圖導航語言(所謂的物件圖導航語言指的就是通過 "放置到OgnlContext中的名字.屬性名字" 的方式去獲取對應物件的屬性值)的縮寫,它是一種功能強大的表示式語言,通過它簡單一致的表示式語法,可以存取物件的任意屬性,呼叫物件的方法,遍歷整個物件的結構圖,實現欄位型別轉化等功能。它使用相同的表示式去存取物件的屬性。

1.表示式(Expression)是整個OGNL的核心內容,所有的OGNL操作都是針對表示式解析後進行的。通過表示式來告訴OGNL操作到底要幹些什麼。因此,表示式其實是一個帶有語法含義的字串,整個字串將規定操作的型別和內容。

OGNL表示式支援大量的表示式,如鏈式訪問物件、表示式計算、甚至還支援Lambda表示式。

2.OGNLRoot物件可以理解為OGNL的操作物件。當我們指定了一個表示式的時候,我們需要指定這個表示式針對的是哪個具體的物件。而這個具體的物件就是Root物件,這就意味著,如果有一個OGNL表示式,那麼我們需要針對Root物件來進行OGNL表示式的計算並且返回結果。

3.有個Root物件和表示式,我們就可以使用OGNL進行簡單的操作了,如對Root物件的賦值與取值操作。但是,實際上在OGNL的內部,所有的操作都會在一個特定的資料環境中執行。這個資料環境就是上下文環境(Context)。OGNL的上下文環境是一個

Map結構,稱之為OgnlContextRoot物件也會被新增到上下文環境當中去。

2.談一談你對ValueStack的瞭解

①Struts2將XWork對Ognl的擴充套件這一套機制封裝起來,這個物件叫ValueStack。ValueStack實際上就是一個容器。它由Struts框架建立,當前端頁面如jsp傳送一個請求時,Struts的預設攔截器會將請求中的資料進行封裝,併入ValueStack的棧頂。----百度百科

獲取ValueStack的三種方式:(2和3可以算一種,通過request獲取)

1.ValueStack valueStack = ActionContext.getContext().getValueStack();

2.ValueStack valueStack = ServletActionContext.getValueStack(ServletActionContext.getRequest())

3.ValueStack valueStack = (ValueStack) ServletActionContext.getRequest().getAttribute("struts.valueStack");

③.ValueStack貫穿整個action的生命週期,每一個action例項都擁有一個ValueStack物件,其中儲存了當前action物件和其他相關物件.

④struts2把ValueStack物件儲存在名為:struts.valueStack的request域中.即ValueStack作用域為request.當action建立的時候,ValueStack就建立了,action被銷燬的時候,ValueStack就銷燬了

⑤ValueStack中的資料分兩部分存放:root(棧結構,CompoundRoot)和context(map形式,OgnlContext)

3.如何向ValueStack中存資料以及取資料?

要在ValueStack中存取資料,先要獲得ValueStack

第一種方式:可以直接通過request物件來獲取.

 

第二種方式:使用ActionContext來獲取

 

set方法存資料:


在頁面取set方法存的資料:

 

使用push方法存資料

 

在頁面取push方法存的資料

 

4. OGNL表示式中如何去使用#、%和$這三個符號

#:它是從非root中獲取資料

 

%用於強制是否要解析ognl表示式,%提供一個ognl表示式執行環境

 

$它主要是用於配置檔案中獲取valueStack中資料

 

5. 攔截器的生命週期

1)當我們啟動伺服器時,就已經建立了自定義攔截棧中所有攔截器的物件(如果自己未引用自定義攔截器棧,則執行預設的攔截器棧),並且所有物件都執行了初始化方法init().

2)當用戶訪問action時,首先是建立Action示例,此時並沒有馬上執行action對應的業務邏輯方法execute(),而是執行了攔截器中的業務處理方法中invocation.invoke()這行程式碼之前的程式碼(包括自己這行程式碼).invocation.invoke()相當於servlet程式設計中過濾器的核心業務方法中的chain.doFilter().緊接著,就是先去執行Action中的業務邏輯方法execute(),當執行完execute()之後才會去繼續執行攔截器業務處理方法中的invocation.invoke()之後的程式碼直到方法結束.

3)當伺服器關閉,攔截器才會銷燬

簡單點說就是:

·啟動伺服器時候,申明在配置檔案的攔截器,被初始化,呼叫init方法

·當有請求訪問攔截器作用的action時,先建立action物件,

·執行該攔截器的intercepot方法攔截。在action目標方法 invocation.invoke()執行前後,寫相應的業務邏輯。

·當伺服器停止時,攔截器物件才被銷燬

6. 攔截器的執行流程