1. 程式人生 > >JAVA企業面試題精選 Struts 11-18

JAVA企業面試題精選 Struts 11-18

3.11.請簡述Struts2中各元件的作用及呼叫順序

參考答案:

  Struts2有6大核心自檢,分別為前端控制器filter,業務控制器Action,值物件ValueStack,攔截器Interceptor,輸出元件Result,Struts2標籤.
  它們的呼叫順序是,請求提交給前端控制器filter,它會根據struts.xml中的配置找到對應的業務控制器Action,然後例項化值物件ValueStack並例項化Action放於ValueStack的棧頂,在呼叫Action 的業務方法,在呼叫過程中會被攔截器元件所攔截.最終根據Action方法的返回值,filter從struts.xml中可以找到對應的Result,於是使用這個Result向頁面輸出內容.
  當然,最常見的輸出實際上是將請求轉發給一個JSP.name在容器解析JSP生成HTML的過程中,Struts2標籤將被解析.此時標籤中的OGNL表示式會發送給ValueStack取值,返回的結果被寫入最終生成的HTML.

3.12.簡述攔截器的作用

參考答案:

  攔截器適合封裝一些共通處理,便於重複利用.例如請求引數給Action屬性,日誌的記錄,許可權檢查,事務處理等.攔截器是通過配置方式呼叫,因此使用方法比較靈活,便於維護和擴充套件.

3.13.Struts2有哪些UI標籤,請簡述其作用

參考答案:

  Struts2中有如下UI標籤:
  1.表單標籤,可以生成form元素.
  2.文字框,密碼框,文字域標籤,這些標籤很相似,都是生成一個框體,然後在框體中顯示出預設的內容,差異僅僅是長相不同.
  3.布林框,可以生成一個checkbox,要求使用者進行確認選擇.這個標籤可以做預設的勾選,但是要求OGNL表示式訪問的值是布林型別的.
  4.單選框標籤,可以生成一組單選框,並根據OGNL取值自動勾上一個單選框.
  5.複選框標籤,可以生成一組複選框,並根據OGNL取值自動勾選上幾個複選框.
  6.下拉列表標籤,可以生成一個下拉列表,包含一組option,並根據OGNL取值自動勾選上一個option.
  注意,上述單選框,複選框,下拉列表標籤,在使用上都有2中初始化選項的方式,一種是靜態的方式,可以直接在標籤上寫出固定的範圍,並根據此範圍初始化選項.也可以在標籤上通過OGNL表示式訪問Action中的一個集合,並根據此集合來初始化選項.

3.14.Struts2中的攔截器有什麼用,與Spring中的AOP有什麼區別和聯絡

參考答案:

  Struts2中的攔截器可以批量擴充套件Action,處理一組Action的通用業務邏輯.
  Struts2中的攔截器實際上就是採用AOP思想實現的,只是它只能處理Action的通用邏輯,無法處理其他元件的通用邏輯.而Spring的AOP實現更為靈活,可以實現任意一批元件的通用業務邏輯.

3.15.Action預設引用哪個攔截器,如果沒有預設引用,會導致什麼問題?

參考答案:

  Action預設引用一個攔截器棧,叫做defaultStack.這個預設引用不能丟掉,因為裡面包含了Struts2框架所必須依賴的一些攔截器,如果丟掉會導致專案報錯.因此我們在開發時,如果自己引用了自定義攔截器,要注意不丟掉預設的攔截器棧.

3.16.Struts2寫Action的時候,需不需要繼承什麼類?

參考答案:

  可以繼承自ActionSupport類,也可以不繼承.

3.17.Struts Action是不是執行緒安全?如果不是,有什麼方式可以保證Action的執行緒安全?如果是,請說明原因(Struts1和Struts2)?

參考答案:

  Struts1的Action不是執行緒安全的.Struts1在第一次請求某個Action是,會建立這個Action例項.之後再請求該Action例項時,就用之前建立好的這個Action處理,即他是單例模式.在Struts1的方法呼叫模式用到的引數一般都是區域性變數(包括Request,Response等),區域性變數是執行緒安全的,因此不用考慮執行緒安全問題.如果在Action類中使用了例項變數,就會存線上程安全問題.所以我們用Struts1開發是儘量不要使用例項變數.
  Struts2 Action物件為每一個請求產生一個例項,因此沒有執行緒安全問題.不過在Spring + Struts2的應用中,由Spring來管理Struts2的Action,而IOC容器管理的bean預設是單例項(scope=”singleton”),加上Struts2的Action就像一個POJO一樣,定義了很多的類變數,這就有執行緒安全問題了.解決此問題最簡單的辦法則是不是用單例模式(設定scope=”prototype”>,配置如下:

<bean id="testAction" class="com.webapp.action.TestAction" scope="prototype">
    
  • 1

3.18.Struts2中的攔截器和Servlet中的過濾器有什麼區別?

參考答案:

  Struts2中的攔截器和Servlet中的過濾器的區別如下:
  1.攔截器是基於Java反射機制的,而過濾器是基於函式回撥的;
  2.過濾器依賴於Servlet容器,而攔截器不依賴於Servlet容器;
  3.攔截器只能對Action請求其作用,而過濾器則可以對幾乎所有請求起作用;
  4.爛機器可以訪問Action上下文,值棧裡的物件,而過濾器不能;
  5.在Action的生命週期中,攔截器可以多次呼叫,而過濾器只能在容器初始化時被呼叫一次.

3.11.請簡述Struts2中各元件的作用及呼叫順序

參考答案:

  Struts2有6大核心自檢,分別為前端控制器filter,業務控制器Action,值物件ValueStack,攔截器Interceptor,輸出元件Result,Struts2標籤.
  它們的呼叫順序是,請求提交給前端控制器filter,它會根據struts.xml中的配置找到對應的業務控制器Action,然後例項化值物件ValueStack並例項化Action放於ValueStack的棧頂,在呼叫Action 的業務方法,在呼叫過程中會被攔截器元件所攔截.最終根據Action方法的返回值,filter從struts.xml中可以找到對應的Result,於是使用這個Result向頁面輸出內容.
  當然,最常見的輸出實際上是將請求轉發給一個JSP.name在容器解析JSP生成HTML的過程中,Struts2標籤將被解析.此時標籤中的OGNL表示式會發送給ValueStack取值,返回的結果被寫入最終生成的HTML.

3.12.簡述攔截器的作用

參考答案:

  攔截器適合封裝一些共通處理,便於重複利用.例如請求引數給Action屬性,日誌的記錄,許可權檢查,事務處理等.攔截器是通過配置方式呼叫,因此使用方法比較靈活,便於維護和擴充套件.

3.13.Struts2有哪些UI標籤,請簡述其作用

參考答案:

  Struts2中有如下UI標籤:
  1.表單標籤,可以生成form元素.
  2.文字框,密碼框,文字域標籤,這些標籤很相似,都是生成一個框體,然後在框體中顯示出預設的內容,差異僅僅是長相不同.
  3.布林框,可以生成一個checkbox,要求使用者進行確認選擇.這個標籤可以做預設的勾選,但是要求OGNL表示式訪問的值是布林型別的.
  4.單選框標籤,可以生成一組單選框,並根據OGNL取值自動勾上一個單選框.
  5.複選框標籤,可以生成一組複選框,並根據OGNL取值自動勾選上幾個複選框.
  6.下拉列表標籤,可以生成一個下拉列表,包含一組option,並根據OGNL取值自動勾選上一個option.
  注意,上述單選框,複選框,下拉列表標籤,在使用上都有2中初始化選項的方式,一種是靜態的方式,可以直接在標籤上寫出固定的範圍,並根據此範圍初始化選項.也可以在標籤上通過OGNL表示式訪問Action中的一個集合,並根據此集合來初始化選項.

3.14.Struts2中的攔截器有什麼用,與Spring中的AOP有什麼區別和聯絡

參考答案:

  Struts2中的攔截器可以批量擴充套件Action,處理一組Action的通用業務邏輯.
  Struts2中的攔截器實際上就是採用AOP思想實現的,只是它只能處理Action的通用邏輯,無法處理其他元件的通用邏輯.而Spring的AOP實現更為靈活,可以實現任意一批元件的通用業務邏輯.

3.15.Action預設引用哪個攔截器,如果沒有預設引用,會導致什麼問題?

參考答案:

  Action預設引用一個攔截器棧,叫做defaultStack.這個預設引用不能丟掉,因為裡面包含了Struts2框架所必須依賴的一些攔截器,如果丟掉會導致專案報錯.因此我們在開發時,如果自己引用了自定義攔截器,要注意不丟掉預設的攔截器棧.

3.16.Struts2寫Action的時候,需不需要繼承什麼類?

參考答案:

  可以繼承自ActionSupport類,也可以不繼承.

3.17.Struts Action是不是執行緒安全?如果不是,有什麼方式可以保證Action的執行緒安全?如果是,請說明原因(Struts1和Struts2)?

參考答案:

  Struts1的Action不是執行緒安全的.Struts1在第一次請求某個Action是,會建立這個Action例項.之後再請求該Action例項時,就用之前建立好的這個Action處理,即他是單例模式.在Struts1的方法呼叫模式用到的引數一般都是區域性變數(包括Request,Response等),區域性變數是執行緒安全的,因此不用考慮執行緒安全問題.如果在Action類中使用了例項變數,就會存線上程安全問題.所以我們用Struts1開發是儘量不要使用例項變數.
  Struts2 Action物件為每一個請求產生一個例項,因此沒有執行緒安全問題.不過在Spring + Struts2的應用中,由Spring來管理Struts2的Action,而IOC容器管理的bean預設是單例項(scope=”singleton”),加上Struts2的Action就像一個POJO一樣,定義了很多的類變數,這就有執行緒安全問題了.解決此問題最簡單的辦法則是不是用單例模式(設定scope=”prototype”>,配置如下:

<bean id="testAction" class="com.webapp.action.TestAction" scope="prototype">
  
  • 1

3.18.Struts2中的攔截器和Servlet中的過濾器有什麼區別?

參考答案:

  Struts2中的攔截器和Servlet中的過濾器的區別如下:
  1.攔截器是基於Java反射機制的,而過濾器是基於函式回撥的;
  2.過濾器依賴於Servlet容器,而攔截器不依賴於Servlet容器;
  3.攔截器只能對Action請求其作用,而過濾器則可以對幾乎所有請求起作用;
  4.爛機器可以訪問Action上下文,值棧裡的物件,而過濾器不能;
  5.在Action的生命週期中,攔截器可以多次呼叫,而過濾器只能在容器初始化時被呼叫一次.