天天看點

Struts 問題彙總|學習筆記

開發者學堂課程【Java 面試疑難點串講 3:開發工具及架構:Struts 問題彙總】學習筆記,與課程緊密聯系,讓使用者快速學習知識。

課程位址:

https://developer.aliyun.com/learning/course/26/detail/566

Struts 問題彙總

所有的開源架構裡面必然包含有各個公司自己的一些程式代碼,或者是與一些其它的開發架構整合的程式代碼,對于這些代碼,如果要是有時間,可以直接通過官網下載下傳源代碼目錄,這個目錄一般情況下都比較小 (10M 左右),如果沒有源代碼,那麼最簡單的做法就是直接利用 Maven 進行下載下傳。

1、如果要想去研究源代碼,或者說是去看某一個程式的具體實作,隻是簡單的依靠一個開發包根本誰也看不了,你除非下載下傳的是源代碼程式包,裡面的很多的程式類的關系大部分都不需要你來處理,你所要處理的隻是你需要開發的部分。

例如:你開發的攔截器、Action、轉換器等等,在 Struts 裡面對于這些操作提供有一系列的支援,例如:自動進行參數的指派就屬于攔截器的範疇。

在整個課程裡面針對于開發架構,尤其是MVC 開發架構已經給出了反射的分析過程,也就是說你隻需要掌握 DispatcherServlet  程式類,那麼所有的 MVC 基本核心原理就明确了:線程處理、請求參數自動指派(攔截器)、自動轉換。所有的開發架構的本質就是反射處理操作。

2、Struts 攔截器,在攔截器裡面可以設定屬性,還需要在 struts.xml 之中進行配置,而且在進行 Struts 配置檔案編寫的時候往往還需要使用一個繼承關系(繼承一些公共的配置項);

3、Struts2.x 的上傳使用的是 FileUpload 處理操作,而這個處理在 Java WEB 開發實戰經典之中講解過了,其核心的特點是可以接收原始的檔案名稱以及操作類型,對于接收操作來講,官方文檔已經給出了其接收的類型,這個是由官方定義好的,如果有一天你自己開發的架構可以盛行,那麼這些規則由你自己來定義,如果你學習過反射機制,深入了解了 DispatcherServlet 設計,那麼就可以了解為什麼它有這樣的要求了。

4、Struts2.x 之中最大的敗筆在于:這些大量的 setter、getter 以及對象的執行個體化處理機制,而這個問題之是以會要求編寫主要也是在 DispatcherServlct 程式類之中已經給了明确的說明,依然是基于反射的處理操作;

5、Struts2.x 裡面的轉換處理操作本身是有 bug 存在的,也就是說如果你現在預設情況下接收的資料類型是 int,但是你傳遞了 String,那麼這個時候肯定無法正常接收,因為會産生 ​

NumberFormatException

​異常,

而這個原因在講解 DispatcherServlet 的時候也已經分析過了,因為它的原理是根據所有的參數名稱以及對應的屬性名稱 (setter、getter);

6、Struts 2.x 裡面預設支援有 EL,但是在 S truts 2.x 最初的時代(WebWork) 是沒有EL的,是以它提供了一種與 EL 類似的解決方案:OGNL( 很麻煩,一般不建議再使用了,需要追溯到 2005 年左右);

7、對于數組的接收處理操作其實本質上就是利用了​

request.getParameterValues(),

​這個處理操作在進行接收的時候可以将接收到的資料以數組的形式出現或者以 L ist 集合的形式出現,因為有參數名稱,而且參數名稱和屬性名稱又是一樣的,那麼就可以根據參數名稱擷取屬性類型,如果發現屬性類型是一個數組,則根據數組的形式來進行接收處理,依然采用了反射機制,DispatcherServlet 也已經有了明确的說明;

8、國際化的本質在于 ResourceBundle (Java 基礎的時候講解過的概念),它需要是一個資源名稱,例如: Messages.properties、Message_zh_CN.properties,這裡面 Message 就屬于資源名稱,而後面那些國際化标記是通過 Local 實作的指派(Java 基礎也有重點講解)。裡面設定的占位符在 java 基礎的時候也強調過了,是通過 MessageFormat 類完成處理的,它是按照“{0}”、“{1}”這樣的順序進行設定;

 對于 Struts 而言你所需要掌握的部分就是在于 Java 基礎、MVC 設計思想、反射應用的結合體上。在 DispatcherServlet 設計之中已經把所有的核心本質的思想都講解清楚了。