官术网_书友最值得收藏!

第一部分 知識(shí)準(zhǔn)備篇

對(duì)任何事物的研究,總是需要由表及里、由淺入深地進(jìn)行。作為本書研究對(duì)象的Struts2,是一個(gè)Web開發(fā)框架。因而在本書的開篇,我們?cè)噲D向讀者闡述一些Web開發(fā)的基本概念以及開發(fā)框架的學(xué)習(xí)方法。這些內(nèi)容不僅是全書的精神綱領(lǐng),也是我們進(jìn)行后續(xù)討論的基礎(chǔ)核心。從這一部分的篇名“知識(shí)準(zhǔn)備篇”可以看出,本篇的主要目的是為之后我們深入研究框架的實(shí)現(xiàn)機(jī)理打好堅(jiān)實(shí)的理論基礎(chǔ)。

“工欲善其事,必先利其器”。在本書的第1章,我們將首先為讀者介紹搭建Struts2開發(fā)環(huán)境的步驟。一個(gè)好的開發(fā)環(huán)境,是進(jìn)行框架研究的必要條件。尤其是當(dāng)我們需要對(duì)一個(gè)開源框架進(jìn)行源代碼級(jí)別的分析時(shí),好的開發(fā)環(huán)境就猶如一把利劍,能夠?yàn)槲覀儝咔逅械恼系K。除了介紹環(huán)境搭建和源碼調(diào)試的具體方法之外,我們?cè)诘?章中還將給出獲取Struts2相關(guān)資料的途徑和方法,并對(duì)Struts2項(xiàng)目的結(jié)構(gòu)做初步的介紹。

面對(duì)紛繁復(fù)雜的框架,有的讀者或許已經(jīng)迷失其中,有的讀者或許已經(jīng)精通使用這些框架的方法并總結(jié)出一些行之有效的最佳實(shí)踐。本書的第2章,我們?cè)噲D帶領(lǐng)讀者去探尋日常開發(fā)中最為本質(zhì)的問題:什么是面向?qū)ο蟮母拍睿渴裁词强蚣埽课覀優(yōu)槭裁匆肟蚣苓M(jìn)行編程?在解決這些根本問題的過程中,我們也會(huì)同時(shí)給出一系列Web開發(fā)模式和Web開發(fā)過程中的最佳實(shí)踐,并以此為基礎(chǔ)總結(jié)出Web開發(fā)中可能遇到的主要問題。在第2章的最后,我們還試圖總結(jié)出正確學(xué)習(xí)開源框架的方法,這些方法不僅能夠幫助那些迷茫于框架之中的程序員找到正確的方向,同時(shí)對(duì)那些有一定經(jīng)驗(yàn)的程序員也有相當(dāng)?shù)慕梃b作用。

在了解了框架存在的意義之后,本書的第3章將正式揭開Struts2的神秘面紗,并從宏觀上講述Struts2作為一個(gè)表示層框架是如何解決Web開發(fā)中的種種問題的。第3章的內(nèi)容將涵蓋Struts2的方方面面,從Struts2的歷史發(fā)展、Struts2的外部環(huán)境、Struts2的宏觀運(yùn)行主線、Struts2的微觀構(gòu)成等不同的角度,為讀者介紹Struts2的概況。

本篇中所有內(nèi)容的側(cè)重點(diǎn),都將圍繞著“方法論”這三個(gè)字展開。因?yàn)楸緯闹髦疾粌H僅是研究Struts2這個(gè)框架本身,更是想通過對(duì)Struts2的研究,總結(jié)出一套完整的并且行之有效的Web開發(fā)的經(jīng)驗(yàn)和方法。所謂“授人以魚不如授人以漁”,希望讀者在閱讀本書的過程中,始終能夠站在一個(gè)比Struts2本身更加高的高度來看待整個(gè)Web開發(fā),這樣才能在不斷發(fā)展的歷史洪流中立于不敗之地。

第1章 厲兵秣馬—-開發(fā)環(huán)境準(zhǔn)備

1.1 準(zhǔn)備源代碼閱讀環(huán)境

在開發(fā)與分析任何一個(gè)開源框架之前,都需要安裝與配置基本的開發(fā)環(huán)境和源代碼的閱讀環(huán)境。這一系列內(nèi)容將包括:安裝與配置JDK、安裝開發(fā)調(diào)試IDE、安裝與配置Web服務(wù)器、搭建開發(fā)調(diào)試環(huán)境等。

1.1.1 安裝與配置JDK

Struts2的運(yùn)行環(huán)境要求Java 5以上的版本,所以JDK的版本必須為1.5或者1.5以上。打開http://www.oracle.com/technetwork/java/javase/downloads/index.html頁面,我們可以下載到最新的JDK安裝程序,下載頁面如圖1-1所示。本書所有的示例代碼都運(yùn)行在JDK 1.6之上,大家可以下載這個(gè)版本的JDK運(yùn)行本書中的所有代碼示例。

圖1-1 JDK下載首頁

安裝完JDK后,需要正確配置Java運(yùn)行時(shí)必需的環(huán)境變量值,它們是:JAVA_HOME、CLASSPATH和PATH。無論是什么操作系統(tǒng),都能夠支持多個(gè)JDK版本的共存,讀者可以根據(jù)應(yīng)用程序的實(shí)際需求對(duì)不同的JDK版本進(jìn)行管理。

正確管理JDK版本的方式,是在JVM運(yùn)行時(shí)指定JDK版本對(duì)應(yīng)的環(huán)境變量。為了方便起見,我們往往為操作系統(tǒng)本身指定一個(gè)系統(tǒng)級(jí)別的環(huán)境變量。例如,Windows平臺(tái)上的系統(tǒng)環(huán)境變量可以在“系統(tǒng)屬性”的“高級(jí)”選項(xiàng)卡中找到,并在其中配置JAVA_HOME、PATH和CLASSPATH值。圖1-2是Windows XP操作系統(tǒng)中為系統(tǒng)添加CLASSPATH環(huán)境變量的例子。

圖1-2 Windows XP上配置CLASSPATH

多JRE共存時(shí)的版本管理

Java語言對(duì)于運(yùn)行環(huán)境的管理比較寬松,在一個(gè)操作系統(tǒng)中可以同時(shí)運(yùn)行多個(gè)Java程序的進(jìn)程,每個(gè)Java進(jìn)程所依賴的JRE版本也可以各不相同。當(dāng)某一個(gè)Java進(jìn)程啟動(dòng)時(shí),操作系統(tǒng)會(huì)依次按照J(rèn)ava啟動(dòng)進(jìn)程的當(dāng)前目錄、當(dāng)前目錄的父目錄、PATH值中所指定的目錄進(jìn)行JRE尋址,找到第一個(gè)返回的JRE版本并運(yùn)行。因此,一個(gè)簡(jiǎn)單而有效的指定JRE尋址的方式是在啟動(dòng)Java進(jìn)程的腳本中通過指定當(dāng)前運(yùn)行程序的PATH值來定制特定版本的JRE的執(zhí)行環(huán)境,從而達(dá)到對(duì)不同版本的JRE進(jìn)行管理的目的。

JRE管理和CLASSPATH的加載順序問題是Java開發(fā)中最為基本的問題,它牽涉的是Java程序所依賴的最為基本的底層環(huán)境的配置。尤其是當(dāng)一個(gè)應(yīng)用程序運(yùn)行在一個(gè)高級(jí)的商業(yè)應(yīng)用服務(wù)器如Websphere或Weblogic之上時(shí),我們應(yīng)該密切關(guān)注程序的JRE運(yùn)行參數(shù)和版本以及CLASSPATH的加載順序(先加載優(yōu)先原則),因?yàn)檫@些商業(yè)應(yīng)用服務(wù)器往往有自定義的JRE管理機(jī)制和CLASSPATH的加載方式,而這兩大內(nèi)容,也將直接決定Web應(yīng)用的運(yùn)行特征。因此,在商用服務(wù)器中,我們往往通過自行修改服務(wù)器的啟動(dòng)腳本來設(shè)定服務(wù)器運(yùn)行所依賴的JAR版本和Library加載方式(在某些服務(wù)器中,可以通過控制臺(tái)進(jìn)行配置)。

安裝并配置完成后,我們可以在命令行窗口中輸入java -version命令來檢測(cè)一下當(dāng)前的JDK運(yùn)行版本。如果配置完全正確,當(dāng)前客戶端的JRE運(yùn)行版本會(huì)顯示出來,如圖1-3所示。

圖1-3 JDK安裝成功

1.1.2 安裝Eclipse與源碼調(diào)試

在成功安裝和配置JDK后,我們還需要安裝進(jìn)行Java開發(fā)調(diào)試的IDE。目前比較常用的Java開發(fā)IDE主要有Eclipse和NetBeans等,讀者可以任意選擇自己習(xí)慣的IDE作為開發(fā)工具。在本書中,我們以Eclipse為例,著重介紹在Eclipse中開發(fā)與調(diào)試源碼的方法。讀者也可以舉一反三,在其他IDE中做相應(yīng)的嘗試。

Eclipse是一個(gè)界面友好的開源IDE,并支持成千上萬種不同的插件,為我們進(jìn)行代碼分析和源碼調(diào)試提供了極大的便利。我們可以在Eclipse的官方網(wǎng)站(http://www. eclipse.org/)找到Eclipse的各個(gè)版本并下載安裝。

本書不會(huì)對(duì)Eclipse的使用細(xì)節(jié)進(jìn)行詳細(xì)介紹,不過為了幫助讀者更好地進(jìn)行開源框架的研究,尤其是對(duì)開源框架源碼的解讀,我們?cè)诒菊轮袑㈥懤m(xù)給出一些結(jié)合Eclipse進(jìn)行源碼閱讀的方法和最佳實(shí)踐。相信這些方法對(duì)各個(gè)層次的讀者都會(huì)有一定的啟示。

在本節(jié)中,我們將首先列出一些Eclipse IDE中常用的快捷鍵(參見圖1-4、圖1-5和圖1-6),這些快捷鍵在進(jìn)行源碼分析時(shí)非常有用。

圖1-4 在Eclipse中使用Ctrl+Shift+T

圖1-5 在Eclipse中使用Ctrl+T

圖1-6 在Eclipse中使用Ctrl+ Shift + G

Ctrl+Shift+T—根據(jù)類名查找相應(yīng)的類

Ctrl+T—選中某個(gè)類或方法,使用此快捷鍵能夠查看類或方法的組織結(jié)構(gòu)

Ctrl+Shift+G—選中某個(gè)類或方法,使用此快捷鍵能夠查找所有調(diào)用類或者方法的出處

快捷鍵是日常開發(fā)調(diào)試中最為仰仗的一個(gè)技巧。Eclipse中的快捷鍵可謂博大精深,我們?cè)谶@里不再一一列舉。讀者可以在實(shí)際開發(fā)中不斷摸索并牢記這些快捷鍵,因?yàn)樗鼈円彩侨粘i_發(fā)中必不可少的一部分。讀者也可參照Eclipse中的這些快捷鍵,在其他的IDE中找到相應(yīng)的快捷鍵設(shè)置。

1.1.3 安裝與配置Web服務(wù)器

本書所涉及的絕大多數(shù)內(nèi)容都屬于Web開發(fā)的相關(guān)范疇,因而在JDK和Eclipse安裝完成之后,我們需要緊接著安裝Web服務(wù)器用以提供Web程序的運(yùn)行環(huán)境。

在眾多的Web應(yīng)用服務(wù)器中,Apache開源社區(qū)的Tomcat是最常用的Web服務(wù)器之一,讀者可以在http://tomcat.apache.org找到各個(gè)版本的Tomcat服務(wù)器,本書以Tomcat 6.028為例,請(qǐng)大家下載適合自己的版本并安裝。

安裝完成后,可以在Tomcat安裝目錄下的bin目錄中找到運(yùn)行Tomcat的命令,運(yùn)行成功的示意圖如圖1-7所示。

另外一款非常流行的輕量級(jí)的Web應(yīng)用服務(wù)器是Jetty。相對(duì)于Tomcat來說,Jetty具有無須安裝(其API以一組JAR包的形式發(fā)布)、速度更快等特點(diǎn),成為當(dāng)前眾多程序員進(jìn)行Web開發(fā)調(diào)試的首選。在1.1.4節(jié)中,我們將結(jié)合Eclipse IDE為大家講解使用Jetty進(jìn)行Web開發(fā)和調(diào)試的過程。

圖1-7 Tomcat安裝成功

1.1.4 在Eclipse中使用Jetty搭建Web開發(fā)環(huán)境

在Eclipse IDE中建立了一個(gè)Web項(xiàng)目后,我們可以通過引入Jetty搭建起一個(gè)不依賴任何插件的Web開發(fā)調(diào)試環(huán)境。使用Jetty搭建Web開發(fā)環(huán)境的基本步驟如下。

1.1.4.1 構(gòu)建項(xiàng)目的基本目錄結(jié)構(gòu)

搭建Web開發(fā)調(diào)試環(huán)境的第一個(gè)步驟是建立一個(gè)Web項(xiàng)目的基本目錄結(jié)構(gòu),如圖1-8所示。

圖1-8 Web項(xiàng)目的基本目錄結(jié)構(gòu)

這里簡(jiǎn)單解釋一下這些基本目錄結(jié)構(gòu)的作用:

src(source folder)—存放所有的Java源代碼

conf(source folder)—存放所有的配置文件

test(source folder)—存放所有的Java測(cè)試代碼和調(diào)試代碼

web—Web項(xiàng)目的根目錄,其子目錄WEB-INF以及classes和lib是構(gòu)成Web項(xiàng)目所必需的基本結(jié)構(gòu)

lib—存放JAR包,但是這里存放的JAR文件僅在開發(fā)調(diào)試時(shí)使用

讀者可以根據(jù)項(xiàng)目的實(shí)際情況,創(chuàng)建適合于項(xiàng)目自身需求的目錄結(jié)構(gòu),并導(dǎo)入到Eclipse中使之成為Eclipse項(xiàng)目,之后我們的開發(fā)調(diào)試都將圍繞著Web項(xiàng)目的目錄結(jié)構(gòu)展開。

目前,使用Maven作為開發(fā)環(huán)境進(jìn)行構(gòu)建的開發(fā)人員越來越多。Maven是一個(gè)非常優(yōu)秀的項(xiàng)目構(gòu)建和項(xiàng)目管理的工具。我們?cè)谶@里并未介紹Maven的主要原因在于Maven的使用需要額外的開發(fā)環(huán)境搭建,甚至可能需要編寫符合項(xiàng)目自身?xiàng)l件的POM文件,而這些內(nèi)容并非本書介紹的重點(diǎn)。因而,對(duì)其有興趣的讀者可以自行使用Maven進(jìn)行項(xiàng)目構(gòu)建,而使用Maven進(jìn)行項(xiàng)目構(gòu)建和JAR文件依賴關(guān)系的管理,也是我們向讀者推薦的做法。

1.1.4.2 引入Jetty服務(wù)器

搭建Web開發(fā)環(huán)境的第二步,是引入Jetty服務(wù)器作為我們的Web容器。引入Jetty的方法非常簡(jiǎn)單,只需要將Jetty服務(wù)器相關(guān)的JAR文件加入到項(xiàng)目的CLASSPATH中即可。整個(gè)過程如圖1-9所示。

圖1-9 將構(gòu)成Jetty服務(wù)器必要的JAR包加到CLASSPATH中

這個(gè)步驟完成之后,我們就可以將Jetty作為我們的Web容器提供者。在這里,我們可以看到Jetty服務(wù)器相對(duì)于其他Web服務(wù)器的一個(gè)重要區(qū)別在于它不需要額外安裝,引入Jetty的過程只不過是將幾個(gè)JAR文件加入到CLASSPATH中而已。這樣一來,也就不存在平臺(tái)依賴性和兼容性問題了。

1.1.4.3 啟動(dòng)Jetty進(jìn)行開發(fā)調(diào)試

啟動(dòng)Jetty服務(wù)器進(jìn)行基本的Web開發(fā)調(diào)試的步驟非常簡(jiǎn)單,只需要在項(xiàng)目中編寫一個(gè)JettyStarter的Java類,并將這個(gè)類作為一個(gè)基本的Application執(zhí)行即可。JettyStarter的源碼如代碼清單1-1所示。

代碼清單1-1 JettyStarter.java

          package runtime;
          import org.mortbay.jetty.Connector;
          import org.mortbay.jetty.Server;
          import org.mortbay.jetty.nio.SelectChannelConnector;
          import org.mortbay.jetty.webapp.WebAppContext;
          /**
          * Jetty Server 啟動(dòng)類
          *
          * @author
          */
          public class JettyStarter {
              /**
                * @param args
                * @throws Exception
                */
              public static void main(String[] args) throws Exception {
                  long begin = System.currentTimeMillis();
                  Connector connector = new SelectChannelConnector();
                  connector.setPort(Integer.getInteger("jetty.port", 80).intValue());
                  WebAppContext webapp = new WebAppContext("web", "/struts_example");
                  Server server = new Server();
                  server.setConnectors(new Connector[] { connector });
                  server.setHandler(webapp);
                  server.start();
              System.out.println("Jetty Server started, use " + (System.currentTimeMillis()
                  - begin) + " ms");
              }
          }

有了JettyStarter這個(gè)類之后,我們可以直接將這個(gè)類以Application方式來運(yùn)行。此時(shí),Jetty服務(wù)器就會(huì)啟動(dòng)(如圖1-10所示),從而成為一個(gè)Web容器的提供者。當(dāng)然,我們也可以使用調(diào)試模式(Debug)執(zhí)行這個(gè)類,從而使得整個(gè)Jetty服務(wù)器處于調(diào)試模式。

圖1-10 JettyStarter啟動(dòng)界面

啟動(dòng)成功后,我們會(huì)在控制臺(tái)看到成功啟動(dòng)的日志:

          [main] INFO org.mortbay.log - Logging to
        org.slf4j.impl.SimpleLogger via
        org.mortbay.log.Slf4jLog
          [main] INFO org.mortbay.log - jetty-6.1.7
          [main] INFO org.mortbay.log - Started
        SelectChannelConnector@127.0.0.1:8080
        Jetty Server started, use 1547 ms

此時(shí),Jetty服務(wù)器被引入作為Web應(yīng)用的開發(fā)調(diào)試服務(wù)器,Web開發(fā)調(diào)試環(huán)境也就成功搭建起來。我們可以通過瀏覽器對(duì)Web應(yīng)用進(jìn)行訪問,而其中的IP地址、端口、Web應(yīng)用的入口名稱,都可以在JettyStarter這個(gè)Java類中進(jìn)行API級(jí)別的相應(yīng)設(shè)置。

如果JettyStarter運(yùn)行在調(diào)試模式下,我們就可以在Web項(xiàng)目中加入熟悉的調(diào)試元素,例如加入斷點(diǎn)(Breakpoint)、加入監(jiān)視(Watch)、單步運(yùn)行(Step by),從而對(duì)整個(gè)項(xiàng)目的運(yùn)行狀態(tài)進(jìn)行調(diào)試和監(jiān)控。

相比許多其他的開發(fā)環(huán)境搭建方式,本書所介紹的Web開發(fā)環(huán)境至少擁有以下的好處:

開發(fā)環(huán)境的建立并不依賴于任何IDE或者相關(guān)的插件,只需要運(yùn)行某個(gè)Java類就可以進(jìn)行調(diào)試

開發(fā)環(huán)境的建立不依賴于任何外部Web服務(wù)器的安裝,無論將項(xiàng)目遷移到什么樣的IDE或者操作系統(tǒng),只要是有Java運(yùn)行環(huán)境的地方,都可以直接運(yùn)行

在項(xiàng)目中內(nèi)置開發(fā)環(huán)境的做法,降低了程序員的學(xué)習(xí)成本

1.2 獲取Struts2

1.2.1 Struts2的相關(guān)資源下載

在Struts的官方網(wǎng)站(http://struts.apache.org)可以找到所有Struts項(xiàng)目相關(guān)的信息。由于歷史原因,Struts項(xiàng)目分為兩個(gè)截然不同并互不兼容的版本Struts1.X和Struts2. X(我們通常把Struts1.X的版本稱為Struts,而Struts2.X的版本稱為Struts2)。讀者在獲取相關(guān)信息時(shí),需要正確區(qū)分不同版本的Struts項(xiàng)目,本書講述的所有內(nèi)容都是圍繞著Struts2.X進(jìn)行的。有關(guān)Struts項(xiàng)目的發(fā)展歷史和它們之間的不同,在其他章節(jié)中將會(huì)做出更加詳細(xì)的介紹。Struts的官方網(wǎng)站如圖1-11所示。

圖1-11 Sturts2的主頁

在左側(cè)的“Documentation”分類中,我們能夠找到Struts2的最新版本Struts 2.2.1 (GA)的鏈接,點(diǎn)擊該鏈接后就進(jìn)入到了Struts2相應(yīng)版本的主頁,其中可以找到Struts2的下載鏈接(一個(gè)很大的藍(lán)色Download Now按鈕),如圖1-12所示。

圖1-12 Struts 2.2.1主頁

點(diǎn)擊“Download Now”按鈕,將會(huì)看到Struts2的下載頁面,其中包含各種不同類型的Struts2的下載包,如圖1-13所示。

圖1-13 Struts2的下載頁面

在這里點(diǎn)擊下載struts-2.2.1-all.zip,就能獲得Struts2項(xiàng)目所有的相關(guān)資源。在其中,我們可以看到Struts2的分發(fā)包、Struts2的文檔(Reference)、Struts2的源碼、Struts2的示例項(xiàng)目等。接下來,我們就來看看Struts2項(xiàng)目基本的目錄組織結(jié)構(gòu)。

1.2.2 Struts2項(xiàng)目的目錄組織結(jié)構(gòu)

打開struts-2.2.1-all.zip并將其解壓到任意目錄后,我們可以在其中找到Struts2的所有相關(guān)資源,如圖1-14所示。

Struts2項(xiàng)目的目錄結(jié)構(gòu)中主要包含了4個(gè)目錄:apps、docs、lib和src,這些目錄中所存放的基本內(nèi)容分別介紹如下。

apps—存放了所有Struts2的示例項(xiàng)目

位于apps目錄下的所有war都是可以部署到Web服務(wù)器中直接運(yùn)行的Web應(yīng)用。這些Struts2的示例項(xiàng)目對(duì)學(xué)習(xí)Struts2有相當(dāng)大的指導(dǎo)作用。當(dāng)我們對(duì)Struts2的特性使用有疑問時(shí),可以通過直接研究這些項(xiàng)目的源碼獲得足夠的支持。

圖1-14 Struts2分發(fā)包的目錄結(jié)構(gòu)

docs—存放了所有Struts2與XWork的文檔

docs目錄中存放的Struts2與XWork的相關(guān)文檔基本上是以Wiki Page的形式出現(xiàn)的。這主要是由于Struts2來源于Webwork2,因而其文檔的表現(xiàn)形式也是一脈相承的。Wiki Page形式的文檔的好處在于可以將需要表述的框架特性劃分為若干個(gè)專題,針對(duì)每個(gè)專題,有相應(yīng)的理論知識(shí)講解和示例代碼的印證。

lib—存放了所有Struts2相關(guān)的JAR文件以及Struts2運(yùn)行時(shí)所依賴的JAR文件

lib目錄是一個(gè)完整的依賴資源集合。Struts2項(xiàng)目運(yùn)行所需要的JAR文件都位于這個(gè)目錄下。我們可以看到,Struts2的許多特性都是以插件的形式提供的,因而在lib目錄下除了Struts2項(xiàng)目的基本依賴之外,絕大多數(shù)都是插件資源。

src—存放了所有Struts2的源碼,以Maven所指定的項(xiàng)目結(jié)構(gòu)目錄存放

Struts2本身是根據(jù)Maven所指定的項(xiàng)目目錄結(jié)構(gòu)進(jìn)行編寫的,所以src目錄的組織結(jié)構(gòu)也與Maven所規(guī)定的目錄結(jié)構(gòu)相同。這種組織結(jié)構(gòu)的好處在于我們可以在src目錄中找到所有Struts2相關(guān)資源的單個(gè)源碼文件。源碼的另外一種組織形式我們將在下一節(jié)中著重介紹,讀者可以就兩種不同的形式進(jìn)行比較。

1.3 Struts2源碼的初步研究

1.3.1 源碼的組織形式

如果仔細(xì)瀏覽Struts2分發(fā)包中的src目錄,我們會(huì)發(fā)現(xiàn)在Struts2的分發(fā)包中提供的源碼是以目錄形式存放的。這種源碼組織形式允許讀者訪問單個(gè)源碼文件,并可以在資源管理器中清晰地看到源碼的目錄組織結(jié)構(gòu)。除了這種基于目錄形式的源碼組織方式以外,還有另外一種組織源碼的方式,就是將所有的源碼打包成一個(gè)JAR文件或者ZIP文件。這種單個(gè)文件形式的源碼在結(jié)合IDE進(jìn)行管理時(shí)更加簡(jiǎn)單,故而受到廣大程序員的歡迎。

雖然Struts2的分發(fā)包中沒有提供這種形式的源碼,我們依然可以在網(wǎng)絡(luò)上查找得到,例如在http://search.maven.org/中,我們可以查詢到Struts2各個(gè)版本的分發(fā)包和對(duì)應(yīng)的源碼文件。打開上述鏈接后,我們可以根據(jù)實(shí)際要求進(jìn)行源碼查詢,如圖1-15所示。

圖1-15 Struts2源代碼查詢

點(diǎn)擊查詢后,我們就能在查詢結(jié)果中看到以JAR文件形式進(jìn)行管理的資源文件,如圖1-16所示。

圖1-16 以JAR文件形式管理的Struts Core的各項(xiàng)資源列表

其中不僅包含Struts2的JAR文件(struts2-core-2.2.3.jar),還包含對(duì)應(yīng)的源碼文件(struts2-core-2.2.3-sources.jar),大家可以直接點(diǎn)擊鏈接進(jìn)行下載。

提示 細(xì)心的讀者或許可以發(fā)現(xiàn),上面提供的含有Struts2源碼的網(wǎng)站,實(shí)際上是一個(gè)代碼資源庫的一部分(Maven2提供的一個(gè)網(wǎng)絡(luò)代碼庫,用于在Maven2的項(xiàng)目建立時(shí),作為一個(gè)基本依賴)。實(shí)際上在這個(gè)站點(diǎn)中,我們還可以找到許多其他開源框架的各種形式的源代碼,本書中所依賴的絕大多數(shù)的源代碼都是從此處獲取的。

1.3.2 調(diào)試Struts2源碼

在Struts2的分發(fā)包中,我們可以獲取Struts2的絕大多數(shù)信息,包括Struts2的Library文件、Struts2運(yùn)行時(shí)依賴的Library文件和Struts2的源碼等。接下來,我們將重點(diǎn)介紹一下如何在Eclipse IDE中調(diào)試Struts2的源碼。讀者也可以順著思路,在其他的IDE中獲得相應(yīng)的支持。

什么是調(diào)試Struts2源碼呢?我們?cè)谌粘i_發(fā)中,經(jīng)常聽到的是調(diào)試某一段應(yīng)用程序。將應(yīng)用程序運(yùn)行于調(diào)試(Debug)模式下,我們就可以采用IDE提供的一些特性進(jìn)行程序調(diào)試:設(shè)置斷點(diǎn)(Breakpoint)、加入監(jiān)視(Watch)、單步運(yùn)行(Step by)等等。通過對(duì)程序的調(diào)試,能夠迅速了解程序運(yùn)行的狀態(tài),從而幫助我們快速定位問題并解決問題。我們?cè)谶@里所說的調(diào)試Struts2的源碼,實(shí)際上是在向讀者推薦一種閱讀源碼的方式。

傳統(tǒng)的閱讀開源框架源碼的方式,是以逐個(gè)package或者逐個(gè)module的方式對(duì)框架的源碼進(jìn)行閱讀。不過我們?cè)谶@里明確表示反對(duì)這種閱讀源碼的方式。因?yàn)槿魏我粋€(gè)程序只有處于運(yùn)行狀態(tài)時(shí),才能突顯出其內(nèi)在的價(jià)值。我們鼓勵(lì)讀者從程序運(yùn)行角度來看問題,而不是死板地對(duì)著源代碼本身。對(duì)于一個(gè)程序員來說,只有抓住一個(gè)程序或者框架的運(yùn)行時(shí)狀態(tài),才能夠?qū)λ鼈冇懈由羁痰睦斫狻?/span>一個(gè)靜態(tài)的程序是死的,只有處于運(yùn)行狀態(tài)的程序,我們才能看到其真正的生命力。接下來,我們就來看看在Eclipse中對(duì)一個(gè)開源框架進(jìn)行源碼調(diào)試的步驟和方法。

首先在Eclipse中創(chuàng)建一個(gè)新的項(xiàng)目,加入運(yùn)行Struts2所需要的JAR文件,并將它們加到項(xiàng)目的CLASSPATH中,成功后的界面如圖1-17所示。

圖1-17 Eclipse中新建項(xiàng)目截圖

接下來,我們來為加入到CLASSPATH中的這些JAR文件附上其所對(duì)應(yīng)的源代碼。以“struts2-core-2.2.1.jar”為例,右鍵單擊“struts2-core-2.2.1.jar”,選擇Properties(Alt+ Enter)選項(xiàng)卡,彈出JAR文件的屬性選項(xiàng)框,如圖1-18所示。

圖1-18 為JAR文件附上源碼包

選擇選項(xiàng)卡左側(cè)的“Java Source Attachment”選項(xiàng),點(diǎn)擊輸入框右側(cè)的按鈕,指定相應(yīng)的源代碼所在的目錄或者源代碼所在的JAR文件(ZIP文件),點(diǎn)擊OK按鈕,Library文件就被附上了相應(yīng)的源代碼(此時(shí),我們會(huì)發(fā)現(xiàn)JAR文件形式的源碼組織形式在管理上的方便性,我們甚至可以把源碼文件存放到Workspace的某個(gè)Repository目錄后被所有的Library文件引用)。

在Library文件被附上源代碼之后,展開Library文件,并雙擊其中的class文件,就能看到class文件所對(duì)應(yīng)的源碼,如圖1-19所示。

圖1-19 在Eclipse中查看源碼

Library文件被附上其對(duì)應(yīng)的源碼后,我們就可以使用Eclipse IDE中的功能和快捷鍵對(duì)源碼進(jìn)行查看和分析了。

除了基本的源碼查看功能,Eclipse IDE還能夠?qū)φ谶\(yùn)行的程序進(jìn)行源碼級(jí)別的調(diào)試。例如,當(dāng)一個(gè)程序運(yùn)行在調(diào)試(Debug)模式時(shí),我們可以直接打開Struts2的源碼,使用斷點(diǎn)功能,進(jìn)入單步調(diào)試模式,并查看當(dāng)前Struts2中類的運(yùn)行狀態(tài),如圖1-20所示。

圖1-20 在Eclipse中調(diào)試源碼

為L(zhǎng)ibrary附上源碼,是Eclipse IDE在源碼級(jí)別調(diào)試上的一個(gè)亮點(diǎn)。這為廣大程序員進(jìn)行框架級(jí)別的源碼調(diào)試帶來了極大的便利。在進(jìn)行框架研究時(shí),我們實(shí)際上根本無須將龐大的框架源程序作為一個(gè)項(xiàng)目下載到本地并花大力氣把項(xiàng)目搭建起來。通過為L(zhǎng)ibrary附上源碼的方式,我們可以輕易地查看框架的源碼、獲得框架中的實(shí)現(xiàn)類之間的邏輯結(jié)構(gòu)和層次關(guān)系。

調(diào)試源碼是除了日志輸出以外,最有效甚至是唯一的了解程序內(nèi)部運(yùn)行時(shí)狀態(tài)的方式。因而,調(diào)試源碼也是本書最為推薦的一種源碼級(jí)別學(xué)習(xí)方法,讀者不僅可以將這種學(xué)習(xí)方法運(yùn)用在Struts2上面,也可將其用于其他的開源框架上。

1.4 小結(jié)

本章中,我們首先向讀者介紹了開發(fā)Struts2應(yīng)用程序所必需的開發(fā)環(huán)境的搭建過程。這一過程包含:安裝與配置JDK、安裝與配置Eclipse、安裝與配置Web服務(wù)器。除此之外,著重介紹了在Eclipse中搭建Web開發(fā)環(huán)境并進(jìn)行源碼級(jí)別調(diào)試的詳細(xì)過程。

讀者應(yīng)該明確的是:學(xué)習(xí)一個(gè)框架,尤其是分析框架的內(nèi)部實(shí)現(xiàn)機(jī)理,最為有效的途徑就是對(duì)框架進(jìn)行源碼級(jí)別的調(diào)試并在調(diào)試的過程中深入探究框架內(nèi)部元素在程序運(yùn)行過程中的執(zhí)行順序和執(zhí)行狀態(tài)。這也是本書花許多筆墨向讀者介紹開發(fā)環(huán)境搭建過程的初衷。希望廣大讀者能夠融會(huì)貫通并舉一反三,根據(jù)實(shí)際情況搭建起自己順手的開發(fā)環(huán)境。

閱讀完本章后,大家是否已經(jīng)能夠熟練掌握開發(fā)環(huán)境的搭建了呢?

如何在Eclipse中使用Jetty搭建Web開發(fā)環(huán)境?

Struts2的分發(fā)包中包含哪些主要內(nèi)容?

開源項(xiàng)目的源代碼有哪些組織形式?

如何獲取一個(gè)開源框架的源碼?

如何在項(xiàng)目中進(jìn)行框架的源碼調(diào)試?

主站蜘蛛池模板: 临清市| 陆丰市| 青川县| 思茅市| 磐石市| 罗平县| 遂昌县| 岫岩| 永仁县| 都昌县| 江北区| 西乌| 霍山县| 淳安县| 宜川县| 澄城县| 福海县| 凯里市| 乐山市| 常德市| 惠州市| 凭祥市| 兴山县| 韶关市| 长宁区| 灵寿县| 应城市| 青冈县| 且末县| 翁源县| 祁连县| 浏阳市| 缙云县| 黑水县| 浦东新区| 布拖县| 左权县| 临武县| 无极县| 济阳县| 浪卡子县|