- Struts 2 教程
- Struts2 - 首頁
- Struts2 - 基本 MVC 架構
- Struts2 - 概述
- Struts2 - 環境搭建
- Struts2 - 架構
- Struts2 - 示例
- Struts2 - 配置
- Struts2 - Action
- Struts2 - 攔截器
- Struts2 - 結果型別
- Struts2 - 值棧/OGNL
- Struts2 - 檔案上傳
- Struts2 - 資料庫訪問
- Struts2 - 傳送郵件
- Struts2 - 驗證
- Struts2 - 國際化
- Struts2 - 型別轉換
- Struts2 - 主題/模板
- Struts2 - 異常處理
- Struts2 - 註解
- Struts 2 標籤
- Struts2 - 控制標籤
- Struts2 - 資料標籤
- Struts2 - 表單標籤
- Struts2 - Ajax 標籤
- Struts 2 整合
- Struts2 - Spring
- Struts2 - Tiles
- Struts2 - Hibernate
- Struts 2 有用資源
- Struts2 - 問答
- Struts2 - 快速指南
- Struts2 - 有用資源
- Struts2 - 討論
Struts2 - 面試問題
親愛的讀者,這些Struts2 面試問題是專門為了讓您熟悉在Struts2 程式設計面試中可能遇到的問題型別而設計的。根據我的經驗,優秀的面試官在面試過程中很少計劃提出特定的問題,通常會從主題的一些基本概念開始提問,然後根據進一步的討論以及您的回答繼續提問。
Struts2 是一個流行且成熟的基於 MVC 設計模式的 Web 應用程式框架。Struts2 不僅僅是 Struts 1 的下一個版本,而是對 Struts 架構進行了徹底的重寫。
以下是一些可能促使您考慮使用 Struts2 的優秀特性:
POJO 表單和 POJO Action − Struts2 摒棄了作為 Struts 框架不可或缺部分的 ActionForm。使用 Struts2,您可以使用任何 POJO 來接收表單輸入。同樣,您現在可以將任何 POJO 視為 Action 類。
標籤支援 − Struts2 改進了表單標籤,新的標籤允許開發人員編寫更少的程式碼。
AJAX 支援 − Struts2 認識到 Web2.0 技術的興起,並在產品中集成了 AJAX 支援,建立了與標準 Struts2 標籤功能非常相似的 AJAX 標籤。
易於整合 − 與其他框架(如 Spring、Tiles 和 SiteMesh)的整合現在變得更加容易,Struts2 提供了各種整合選項。
模板支援 − 支援使用模板生成檢視。
外掛支援 − 可以透過使用外掛增強和擴充套件核心 Struts2 行為。Struts2 提供了許多外掛。
Struts2 中的模型-檢視-控制器模式透過以下五個核心元件實現:
Action
攔截器
值棧 / OGNL
結果 / 結果型別
檢視技術
以下是 Struts2 應用程式中請求的生命週期:
使用者向伺服器傳送請求,請求某些資源(例如頁面)。
FilterDispatcher 檢視請求,然後確定相應的 Action。
應用配置的攔截器功能,例如驗證、檔案上傳等。
執行選定的 Action 以執行請求的操作。
再次應用配置的攔截器,如果需要進行任何後處理。
最後,檢視準備結果並將結果返回給使用者。
struts.xml 檔案包含您在開發 Action 時將修改的配置資訊。此檔案可用於覆蓋應用程式的預設設定,例如 struts.devMode = false 和在屬性檔案中定義的其他設定。此檔案可以建立在 WEB-INF/classes 資料夾下。
constant 標籤連同 name 和 value 屬性將用於覆蓋 default.properties 中定義的任何屬性,例如我們剛剛設定的 struts.devMode 屬性。設定 struts.devMode 屬性允許我們在日誌檔案中檢視更多除錯訊息。
我們定義的 action 標籤對應於我們要訪問的每個 URL,並且我們定義一個包含 execute() 方法的類,每當我們訪問相應的 URL 時都會訪問該方法。
結果確定在執行 Action 後返回給瀏覽器的內容。Action 返回的字串應該是結果的名稱。結果配置為每個 Action,如上所示,或者作為“全域性”結果,可用於包中的每個 Action。結果具有可選的 name 和 type 屬性。預設名稱值為“success”。
struts-config.xml 配置檔案是 Web 客戶端中檢視和模型元件之間的橋樑。
在這裡,您將 ActionForm 子類對映到名稱。您在 struts-config.xml 檔案的其餘部分甚至在 JSP 頁面上使用此名稱作為 ActionForm 的別名。
此部分將 Web 應用程式上的頁面對映到名稱。您可以使用此名稱引用實際頁面。這避免在網頁上硬編碼 URL。
在這裡,您宣告表單處理程式,它們也被稱為 Action 對映。
此部分告訴 Struts 在哪裡可以找到您的屬性檔案,其中包含提示和錯誤訊息。
此配置檔案提供了一種機制來更改框架的預設行為。實際上,struts.properties 配置檔案中包含的所有屬性也可以在 web.xml 中使用 init-param 進行配置,也可以使用 struts.xml 配置檔案中的 constant 標籤進行配置。但是,如果您希望將事物分開並使其更具 Struts 特性,則可以在 WEB-INF/classes 資料夾下建立此檔案。在此檔案中配置的值將覆蓋 default.properties 中配置的預設值,default.properties 包含在 struts2-core-x.y.z.jar 發行版中。
從概念上講,攔截器與 servlet 過濾器或 JDK 的 Proxy 類相同。攔截器允許在 Action 和框架之外實現橫切功能。您可以使用攔截器實現以下功能:
在呼叫 Action 之前提供預處理邏輯。
在呼叫 Action 之後提供後處理邏輯。
捕獲異常,以便可以執行備用處理。
建立自定義攔截器很容易;需要擴充套件的介面是 Interceptor 介面。
實際的 Action 將透過攔截器的 invocation.invoke() 呼叫來執行。因此,您可以根據您的需要執行一些預處理和一些後處理。
框架本身透過對 ActionInvocation 物件的 invoke() 進行第一次呼叫來啟動該過程。每次呼叫 invoke() 時,ActionInvocation 都會查詢其狀態並執行接下來出現的攔截器。當所有配置的攔截器都被呼叫後,invoke() 方法將導致 Action 本身被執行。
Action 類管理應用程式的狀態,而結果型別管理檢視。
預設結果型別是 dispatcher,用於分派到 JSP 頁面。
dispatcher 結果型別是預設型別,如果未指定其他結果型別,則使用此型別。它用於轉發到伺服器上的 servlet、JSP、HTML 頁面等。它使用 RequestDispatcher.forward() 方法。
redirect 結果型別呼叫標準的 response.sendRedirect() 方法,導致瀏覽器向給定位置建立新的請求。我們可以在 <result...> 元素的主體中或作為 <param name = "location"> 元素提供位置。
值棧是一組多個物件,按以下順序儲存物件:
臨時物件 − 在頁面執行期間建立各種臨時物件。例如,在 JSP 標籤中迴圈遍歷的集合的當前迭代值。
模型物件 − 如果您在 Struts 應用程式中使用模型物件,則當前模型物件將放置在值棧上 Action 之前。
Action 物件 − 這將是正在執行的當前 Action 物件。
命名物件 − 這些物件包括 #application、#session、#request、#attr 和 #parameters,並引用相應的 servlet 範圍。
物件圖導航語言 (OGNL) 是一種強大的表示式語言,用於引用和操作值棧上的資料。OGNL 還幫助進行資料傳輸和型別轉換。
ActionContext 對映包含以下內容:
application − 應用程式範圍的變數。
session − 會話範圍的變數。
root / value stack − 所有 Action 變數都儲存在這裡。
request − 請求範圍的變數。
parameters − 請求引數。
atributes − 儲存在頁面、請求、會話和應用程式範圍中的屬性。
在 Struts 中,可以透過一個預定義的攔截器來上傳檔案,這個攔截器叫做 FileUpload 攔截器,它由 org.apache.struts2.interceptor.FileUploadInterceptor 類提供,並且包含在 defaultStack 中。
以下 Struts2 配置屬性控制著檔案上傳過程:
struts.multipart.maxSize − 作為檔案上傳接受的檔案的最大尺寸(以位元組為單位)。預設為 250M。
struts.multipart.parser − 用於上傳 multipart 表單的庫。預設為 jakarta。
struts.multipart.saveDir − 儲存臨時檔案的位置。預設為 javax.servlet.context.tempdir。
FileUpload 攔截器使用了一些預設的錯誤訊息鍵:
struts.messages.error.uploading − 檔案無法上傳時發生的通用錯誤。
struts.messages.error.file.too.large − 當上傳的檔案大於 maximumSize 指定的大小限制時發生。
struts.messages.error.content.type.not.allowed − 當上傳的檔案不匹配指定的預期內容型別時發生。
您可以在 WebContent/WEB-INF/classes/messages.properties 資原始檔中覆蓋這些訊息的文字。
在 Struts 的核心,我們有驗證框架,它幫助應用程式在執行 action 方法之前執行規則以執行驗證。Action 類應擴充套件 ActionSupport 類,以便執行 validate 方法。
當用戶按下提交按鈕時,Struts 2 將自動執行 validate 方法,如果該方法中列出的任何 if 語句為真,Struts 2 將呼叫其 addFieldError 方法。如果添加了任何錯誤,則 Struts 2 不會繼續呼叫 execute 方法。相反,Struts 2 框架將返回 input 作為呼叫 action 的結果。
因此,當驗證失敗且 Struts 2 返回 input 時,Struts 2 框架將重新顯示檢視檔案。由於我們使用了 Struts 2 表單標籤,Struts 2 將自動在表單欄位上方新增錯誤訊息。
這些錯誤訊息是我們在 addFieldError 方法呼叫中指定的。addFieldError 方法有兩個引數。第一個是錯誤適用的表單欄位名稱,第二個是在該表單欄位上方顯示的錯誤訊息。
執行驗證的第二種方法是在 action 類旁邊放置一個 xml 檔案。Struts2 基於 XML 的驗證提供了更多驗證選項,例如電子郵件驗證、整數範圍驗證、表單驗證欄位、表示式驗證、正則表示式驗證、必填驗證、必填字串驗證、字串長度驗證等。
xml 檔案需要命名為“[action-class]”-validation.xml。
以下是 Struts2 中提供的各種欄位級和非欄位級驗證的列表:
日期驗證器
雙精度驗證器
電子郵件驗證器
表示式驗證器
整數驗證器
正則表示式驗證器
必填驗證器
必填字串驗證器
字串長度驗證器
URL 驗證器
國際化(i18n)是規劃和實施產品和服務的過程,以便它們可以輕鬆地適應特定的本地語言和文化,這個過程稱為本地化。國際化過程有時也稱為翻譯或本地化啟用。
Struts2 透過資源包、攔截器和標籤庫在以下位置提供本地化,即國際化(i18n)支援:
UI 標籤。
訊息和錯誤。
在 action 類中。
資原始檔的簡單命名格式如下:
bundlename_language_country.properties
這裡 bundlename 可以是 ActionClass、Interface、SuperClass、Model、Package、全域性資源屬性。下一部分 language_country 表示國家/地區語言環境,例如西班牙語(西班牙)語言環境由 es_ES 表示,英語(美國)語言環境由 en_US 等表示。這裡您可以跳過國家/地區部分,它是可選的。
當您按其鍵引用訊息元素時,Struts 框架將按以下順序搜尋相應的資源包:
ActionClass.properties
Interface.properties
SuperClass.properties
model.properties
package.properties
struts.properties
global.properties
StrutsTypeConverter 類告訴 Struts 如何透過覆蓋 convertFromString() 和 convertToString() 兩個方法將環境轉換為字串並反之亦然。
Struts 2 帶有三個內建主題:
simple 主題 − 一個最小的主題,沒有“花裡胡哨”。例如,textfield 標籤呈現 HTML <input/> 標籤,沒有標籤、驗證、錯誤報告或任何其他格式或功能。
xhtml 主題 − 這是 Struts 2 使用的預設主題,它提供 simple 主題提供的所有基本功能,並添加了一些功能,例如 HTML 的標準兩列表格佈局、每個 HTML 的標籤、驗證和錯誤報告等。
css_xhtml 主題 − 此主題提供 simple 主題提供的所有基本功能,並添加了一些功能,例如標準的兩列基於 CSS 的佈局,使用 <div> 作為 HTML Struts 標籤,每個 HTML Struts 標籤的標籤,根據 CSS 樣式表放置。
Struts 透過使用“exception”攔截器使異常處理變得容易。“exception”攔截器包含在 default stack 中,因此您無需執行任何額外操作來配置它。它開箱即用,隨時可以使用。
@Results 註解是結果的集合。在 @Results 註解下,我們可以有多個 @Result 註解。
@Results({
@Result(name = "success", value = "/success.jsp"),
@Result(name = "error", value = "/error.jsp")
})
public class Employee extends ActionSupport{
...
}
@result 註解的名稱與 execute 方法的結果相對應。它們還包含一個位置,指示應根據 execute() 返回的值提供哪個檢視。
@Result(name = "success", value = "/success.jsp")
public class Employee extends ActionSupport{
...
}
這用於修飾 execute() 方法。Action 方法還接收一個值,該值是呼叫 action 的 URL。
public class Employee extends ActionSupport{
private String name;
private int age;
@Action(value = "/empinfo")
public String execute() {
return SUCCESS;
}
}
@After 註解標記一個 action 方法,該方法需要在主 action 方法和結果執行後呼叫。返回值被忽略。
public class Employee extends ActionSupport{
@After
public void isValid() throws ValidationException {
// validate model object, throw exception if failed
}
public String execute() {
// perform secure action
return SUCCESS;
}
}
@Before 註解標記一個 action 方法,該方法需要在主 action 方法和結果執行前呼叫。返回值被忽略。
public class Employee extends ActionSupport{
@Before
public void isAuthorized() throws AuthenticationException {
// authorize request, throw exception if failed
}
public String execute() {
// perform secure action
return SUCCESS;
}
}
@BeforeResult 註解標記一個 action 方法,該方法需要在結果之前執行。返回值被忽略。
public class Employee extends ActionSupport{
@BeforeResult
public void isValid() throws ValidationException {
// validate model object, throw exception if failed
}
public String execute() {
// perform action
return SUCCESS;
}
}
此驗證註解檢查欄位是否存在任何轉換錯誤,如果存在則應用它們。
public class Employee extends ActionSupport{
@ConversionErrorFieldValidator(message = "Default message",
key = "i18n.key", shortCircuit = true)
public String getName() {
return name;
}
}
此驗證註解檢查日期欄位的值是否在指定範圍內。
public class Employee extends ActionSupport{
@DateRangeFieldValidator(message = "Default message",
key = "i18n.key", shortCircuit = true,
min = "2005/01/01", max = "2005/12/31")
public String getDOB() {
return dob;
}
}
此驗證註解檢查雙精度欄位的值是否在指定範圍內。如果既沒有設定 min 也沒有設定 max,則不會執行任何操作。
public class Employee extends ActionSupport{
@DoubleRangeFieldValidator(message = "Default message",
key = "i18n.key", shortCircuit = true,
minInclusive = "0.123", maxInclusive = "99.987")
public String getIncome() {
return income;
}
}
此驗證註解檢查欄位是否為有效的電子郵件地址,如果它包含非空字串。
public class Employee extends ActionSupport{
@EmailValidator(message = "Default message",
key = "i18n.key", shortCircuit = true)
public String getEmail() {
return email;
}
}
此非欄位級驗證器驗證提供的正則表示式。
@ExpressionValidator(message = "Default message", key = "i18n.key", shortCircuit = true, expression = "an OGNL expression" )
此驗證註解檢查數字欄位的值是否在指定範圍內。如果既沒有設定 min 也沒有設定 max,則不會執行任何操作。
public class Employee extends ActionSupport{
@IntRangeFieldValidator(message = "Default message",
key = "i18n.key", shortCircuit = true,
min = "0", max = "42")
public String getAge() {
return age;
}
}
此註解使用正則表示式驗證字串欄位。
@RegexFieldValidator( key = "regex.field", expression = "yourregexp")
此驗證註解檢查欄位是否非空。該註解必須應用於方法級別。
public class Employee extends ActionSupport{
@RequiredFieldValidator(message = "Default message",
key = "i18n.key", shortCircuit = true)
public String getAge() {
return age;
}
}
此驗證註解檢查字串欄位是否不為空(即非空且長度 > 0)。
public class Employee extends ActionSupport{
@RequiredStringValidator(message = "Default message",
key = "i18n.key", shortCircuit = true, trim = true)
public String getName() {
return name;
}
}
此驗證器檢查字串欄位的長度是否正確。它假設欄位是字串。如果既沒有設定 minLength 也沒有設定 maxLength,則不會執行任何操作。
public class Employee extends ActionSupport{
@StringLengthFieldValidator(message = "Default message",
key = "i18n.key", shortCircuit = true,
trim = true, minLength = "5", maxLength = "12")
public String getName() {
return name;
}
}
此驗證器檢查欄位是否為有效的 URL。
public class Employee extends ActionSupport{
@UrlValidator(message = "Default message",
key = "i18n.key", shortCircuit = true)
public String getURL() {
return url;
}
}
如果要使用幾種相同型別的註解,則這些註解必須巢狀在 @Validations() 註解中。
public class Employee extends ActionSupport{
@Validations(
requiredFields =
{@RequiredFieldValidator(type = ValidatorType.SIMPLE,
fieldName = "customfield",
message = "You must enter a value for field.")},
requiredStrings =
{@RequiredStringValidator(type = ValidatorType.SIMPLE,
fieldName = "stringisrequired",
message = "You must enter a value for string.")}
)
public String getName() {
return name;
}
}
此註解可用於自定義驗證器。使用 ValidationParameter 註解提供其他引數。
@CustomValidator(type ="customValidatorName", fieldName = "myField")
這是型別級別型別轉換的標記註解。Conversion 註解必須應用於型別級別。
@Conversion()
public class ConversionAction implements Action {
}
此註解設定型別轉換的 CreateIfNull。CreateIfNull 註解必須應用於欄位或方法級別。
@CreateIfNull( value = true ) private List<User> users;
此註解設定型別轉換的 Element。Element 註解必須應用於欄位或方法級別。
@Element( value = com.acme.User ) private List<User> userList;
此註解設定型別轉換的 Key。Key 註解必須應用於欄位或方法級別。
@Key( value = java.lang.Long.class ) private Map<Long, User> userMap;
此註解設定型別轉換的 KeyProperty。KeyProperty 註解必須應用於欄位或方法級別。
@KeyProperty( value = "userName" ) protected List<User> users = null;
此註解用於類和應用程式範圍的轉換規則。TypeConversion 註解可以應用於屬性和方法級別。
@TypeConversion(rule = ConversionRule.COLLECTION,
converter = "java.util.String")
public void setUsers( List users ) {
this.users = users;
}
接下來是什麼?
此外,您可以回顧一下您之前完成的與該主題相關的作業,並確保您能夠自信地談論它們。如果您是應屆畢業生,面試官不會期望您回答非常複雜的問題,而是您必須使自己的基礎概念非常牢固。
其次,如果您無法回答一些問題,這實際上並不重要,但重要的是,無論您回答了什麼,都必須自信地回答。因此,在面試期間要保持自信。我們在 tutorialspoint 祝您面試順利,並祝您未來的工作一切順利。乾杯 :-)