撩課-Java每天5道面試題第18天
摘要:
121.描述Struts2的工作原理
客戶端傳送請求--》
請求經過一系列過濾器->
FilterDispatcher通過
ActionMapper來決定這個Reques
t需要呼叫哪個Action ->
FilterDispatcher把請求的處理交給ActionPr...
121.描述Struts2的工作原理
客戶端傳送請求--》 請求經過一系列過濾器-> FilterDispatcher通過 ActionMapper來決定這個Reques t需要呼叫哪個Action -> FilterDispatcher把請求的處理交給ActionProxy-> 通過ConfigurationManager詢問 Struts配置檔案(Struts.xml) 找到需要呼叫的Action類-> ActionProxy建立一個ActionInvocation的例項 -> 呼叫Action->執行完畢, 返回結果
122.result的type屬性中有哪幾種結果型別?
一共10種: dispatcher struts預設的結果型別, 把控制權轉發給應用程式裡的 某個資源不能把控制權 轉發給一個外部資源, 若需要把控制權重定向到 一個外部資源, 應該使用 redirect結果型別 redirect 把響應重定向到另一個資源(包括一個外部資源) redirectAction 把響應重定向到另一個 Action freemarker、 velocity、 chain、 httpheader、 xslt、 plainText、 stream
123.攔截器的生命週期與工作過程?
1)每個攔截器都是實現了I nterceptor介面的 Java 類; 2)init(): 該方法將在攔截器被建立後立即被呼叫, 它在攔截器的生命週期內只被呼叫一次. 可以在該方法中對相關資源 進行必要的初始化; 3)intercept(ActionInvocation invocation): 每攔截一個動作請求, 該方法就會被呼叫一次; 4)destroy: 該方法將在攔截器被銷燬之前被呼叫, 它在攔截器的生命週期內也只被呼叫一次; 5)struts2中有內建了18個攔截器。
124.struts2如何完成檔案的上傳?
1、JSP頁面: 1)JSP頁面的上傳檔案的元件: <s: file name=”upload” />, 如果需要一次上傳多個檔案, 就必須使用多個 file 標籤, 但它們的名字必須是相同的, 即:name=“xxx”的值必須一樣; 2)必須把表單的enctype屬性設定為: multipart/form-data; 3)表單的方法必須為post, 因為post提交的資料在訊息體中, 而無大小限制。 2、對應的action: 1)在 Action 中新新增 3 個 和檔案上傳相關的屬性; 2)如果是上傳單個檔案, uploadImage屬性的型別就是 java.io.File, 它代表被上傳的檔案, 第二個和第三個屬性的型別是 String, 它們分別代表上傳文 件的檔名和檔案型別, 定義方式是分別是: jsp頁面file元件的名稱+ContentType, jsp頁面file元件的名稱+FileName 3)如果上上傳多個檔案, 可以使用陣列或 List
125.值棧ValueStack的原理與生命週期?
1)ValueStack貫穿整個 Action 的生命週期, 儲存在request域中, 所以ValueStack和request的生命週期一樣。 當Struts2接受一個請求時, 會迅速建立ActionContext, ValueStack,action。 然後把action存放進ValueStack, 所以action的例項變數可以被OGNL訪問。 請求來的時候, action、ValueStack的生命開始, 請求結束,action、ValueStack的生命結束; 2)action是多例的,和Servlet不一樣, Servelt是單例的; 3)每個action的都有一個對應的值棧, 值棧存放的資料型別是該action的例項, 以及該action中的例項變數, Action物件預設儲存在棧頂; 4)ValueStack本質上就是一個ArrayList; 5)關於ContextMap, Struts 會把下面這些對映壓入 ContextMap 中: parameters: 該 Map 中包含當前請求的請求引數 request: 該 Map 中包含當前 request 物件中的 所有屬性session :該 Map 中包含當前 session 物件中的所有屬性 application :該 Map 中包含當前 application 物件中的所有屬性 attr:該 Map 按如下順序來檢索某個屬性: request, session, application 6)使用OGNL訪問值棧的內容時, 不需要#號, 而訪問request、session、application、attr時, 需要加#號; 7)注意: Struts2中, OGNL表示式需要配合Struts標籤才可以使用。 如:<s:property value="name"/> 8)在struts2配置檔案中引用ognl表示式 , 引用值棧的值 ,此時使用的"$",而不是#或者%;