本文將給大家介紹在JBuilder 9 集成開發環境下,如何運用Struts Framework來開發Web 應用程序,我們這里所說的JBuilder9是指JBuilder 9 Developer 與 Enterprise兩個版本。
一、JBuilder 對于 Struts 之支持
JBuilder 提供圖形使用者接口以簡化組件文件 struts-config.xml 之編輯與設定,此外,JBuilder 于 Object Gallery對話框內的 Web 頁次,提供四種精靈以簡化 Struts 開發流程。
Struts Converter Wizard:
可指定 HTML 或一般 JSP 檔案自動產生使用 Struts Tag Libraries 之 JSP 檔案。
ActionForm Wizard:
可導入JSP 檔案產生繼承自 ActionForm 之類,或自定義屬性 ( property ) 產生繼承自ActionForm 之類,類產生后可選擇是否自動完成 struts-config.xml 對應設定。
Action Wizard:
可產生繼承自 Action 之類,設定搭配之 JSP 檔案、有效范圍 ( scope ) 并自動完成struts-config.xml 對應設定。
JSP from ActionForm Wizard:
可由指定之 ActionForm 自動產生使用 Struts Tag Libraries之 JSP 檔案。
除了上述精靈外,JBuilder 可協助開發人員自動設定web.xml 部署描述檔,以便 JSP 使用Struts 自定義 Tag Libraries 。
二、使用Jbuilder開發struts實例
我們在這里舉開發一個簡易的 Web 應用程序的例子來幫助大家了解Struts Framework。此 Web 應用程序允許使用者輸入兩獨立字符串,并將兩字符串連接后顯示于網頁。由于處理邏輯過于簡單,此實例中我們打算直接在扮演 Controller角色的 Action 中完成兩字符串連接動作,因此未使用扮演 Model 角色之 JavaBean 或類來處理字符串連接。
步驟一: 建立 Web 應用程序
首先點擊選擇 JBuilder 集成開發環境主菜單 File | New Project… 建立一個名為StrutsDemo 之項目。接著由菜單File | New… 激活Object Gallery 對話框,并點擊選擇Web 頁次中的 Web Application 精靈準備建立 Web 應用程序。
Web Application 精靈會為此 Web 應用程序準備妥產生WAR 所需之部署描述檔 web.xml,WAR 是 J2EE 規格中用以簡化 Web 程序部署復雜度之標準檔案格式。我們為此 Web 應用程序命名為 demo,往后將會在編譯此項目檔時產生名為 demo.war 檔案以便于部署,在此 Web 應用程序中由于將會用到 Struts 之 Tag Libraries,因此在JSP/Servlet frameworks 中勾選Struts 1.0,同時JBuilder 會自動設定妥 web.xml。
步驟二 : 建立自定義之 ActionForm 類
Struts Framework 中并未限制 MVC 三部份開發順序,由于此時我們并未準備妥可輸入兩字符串之 HTML 或JSP,因此先建立儲存信息之 ActionForm 類,再產生扮演 Controller 角色之 Action 類,最后再由 ActionForm類產生 JSP 檔案,大家可依狀況調整順序以適應實際案例。點擊選擇Object Gallery 對話框 Web 頁次中 ActionFormWizard 可產生自定義之 ActionForm 類,ActionFormWizard 又可分為三步:第一步精靈自動偵測出之前已建妥之 Web 應用程序demo,我們將自定義 ActionForm 名稱由預設 Untitled1ActionForm 修改為 myActionForm,接著按下 Next 按鈕進入第二步。第二步依照需求將未來 JSP 頁面上所需顯示與輸入的字段加入 Field definition 清單方塊中,倘若負責網頁美工專職人員已備妥輸入用JSP 網頁,亦可按下 Add from JSP… 按鈕直接導入,JBuilder 將解析此 JSP 檔案產生Field definition 表格。本例中由于未準備輸入之 JSP 檔案,因此必須自行加入所需之字段。我們為此 Web 應用程序預先準備三個字段,fieldA 與 fieldB 可儲存輸入之字符串,fieldResult 可置放兩字符串連接后結果。設定完成后按下 Next 按鈕進入第三步。
步驟三對話框提示是否將 myActionForm 加入 struts-config.xml 組件檔中?是否需要產生reset 方法? 可依照默認值按下 Finish 按鈕。
此時 ActionForm Wizard 已經自動產生了繼承自ActionForm 之 myActionForm.java 檔案,如果我們不打算實現資料核驗之 validate 方法,我們完全無須撰寫任何程序代碼。
步驟三 : 建立自定義之 Action 類
點擊選擇Object Gallery 對話框 Web 頁次中 Action Wizard可產生自定義之 Action 類,Action Wizard 分為兩步:第一步精靈自動偵測出之前已建立之 Web 應用程序demo 與 struts-config.xml 組件檔,我們將自定義 Action 名稱由預設 Untitled1Action 修改為 myAction,接著按下Next 按鈕進入第二步。
在第二步對話框中,我們可以設定 myAction 的 perform 方法會傳入哪一個 ActionForm,在FormBean Name 組合方塊中,所有記錄于 struts-config.xml 中的 ActionForm 都會列出以供選用,此外我們設定 myAction 之有效范圍( Scope ) 為 Session,并指明/input.jsp 所有輸入動作,將交由 myAction 處理。
按下 Finish 按鈕后即產生 myAction.java 檔案。在myAction.java 中,JBuilder 已經自動產生了 perform 方法與尚未實現之例外程序代碼,我們將 perform 內的程序代碼做以下之修改,已完成字符串連接的動作:
myActionForm myActionForm=(myActionForm)ActionForm ;
String sA = myActionForm.getFieldA ( ) ;
String sB = myActionForm.getFieldB ( ) ;
myActionForm.setFieldResult (sA+sB) ;
return ( actionMapping.findForward ( "input" ) ) ;
由于 perform 方法會傳入參數 ActionFrom 以便獲知 Web瀏覽器內使用者輸入之字符串,在此JBuilder 已將ActionForm 轉型 ( Type Cast ) 為 myActionForm 之程序代碼產生完成,開發人員僅需以 getFieldA 與 getFieldB 方法即可得知使用者輸入之字符串,并將連接后結果以setFieldResult 方法回存fieldResult 屬性。return 將決定負責顯示之 JSP 網頁,利用perform 方法傳入參數actionMapping 之 findForward 方法,可用以指定顯示之JSP 網頁。之前精靈對話框中已預設 /input.jsp 為負責輸入之 JSP 網頁,Struts 中允許輸入與顯示同為一個 JSP 網頁,因此我們需在 struts-config.xml 中定妥名為 input 之Forward 標記,以便 findForward 方法能夠利用此標記得知真正 JSP 網頁名稱 /input.jsp。
步驟四 : 設定 Forward 標記
點擊選擇 JBuilder 左上方之項目窗格 ( Project Pane ) 內之struts-config.xml,此時集成開發環境便可以圖形使用者接口方式編輯 struts-config.xml 內容,左下方結構窗格( Structure Pane ) 會依照 struts-config.xml 結構,分為 DataSources 、Form Beans、Global Forwards 與 Action Mappings四類標記項目。
當點擊選擇 Global Forwards 項目后 JBuilder 右方內容窗格( Content Pane ) 將出現如圖所示之編輯畫面,開發人員可按下 Add 按鈕加入名為 input 之標記,并指明此標記對應路徑為 /input.jsp。
對于已經熟悉 Struts Framework 的開發人員, 若欲直接修改 struts-config.xml 內容,可以點擊選擇內容窗格中的Source 頁次,此時內容窗格如圖所示將以文字編輯器顯示 XML 內容,我們可自由選擇習慣之方式維護 struts-config.xml 內容。
步驟五 : 產生 JSP
接下來我們將利用現有 myActionForm.java 產生/input.jsp,點擊選擇Object Gallery 對話框 Web 頁次中JSP from ActionForm Wizard,將出現以三步產生 JSP 之精靈:
在第一步對話框中,我們可將欲產生的 JSP 檔名由預設之UntitledJsp1.jsp 改為 /input.jsp,并可按下 [ … ] 按鈕以選取 ActionForm。ActionForm 選取對話框有兩種查找模式,我們可以瀏覽 Java Package 樹狀結構直接選取myActionForm。
或是鍵入Java 類前綴名稱,JBuilder 將會自動查找相符之類。例如我們鍵入 myActionForm 的前綴 my,將可見到對話框查找到兩個相符之類。此一便捷選取類別之對話框,可在JBuilder 編輯器中以熱鍵 Ctrl-Alt-H隨時激活使用。
選取 myActionForm 完畢后,按下 Next 按鈕可進入至第二步對話框。JBuilder 將分析myActionForm.java 內容顯示其字段,我們可以組合方塊決定該字段將以何種 Struts Tag 搭配顯示,本例中三個字段皆使用可輸入文字、預設之 text 型態,按下 Next 按鈕即進入第三步。第三步對話框針對 Struts Tag Libraries 特性,提供多種選項,并且詢問是否將全部之Struts Tag Libraries 宣告導入至JSP 檔中。本例我們采用默認值,按下 Finish 按鈕后 JBuilder 即產生 /input.jsp。
步驟六 : 設定執行組件
接著我們可以設定執行組件以測試本程序。點擊選擇JBuilder 集成開發環境主菜單 Project | Project Prosperities… 將出現項目屬性設定之對話框,點擊選擇Run 頁次準備設定執行組件。JBuilder 允許在單一項目中擁有多個執行組件,可執行 Java Application、Java Applet、J2ME MIDlet 及 J2EE 各式 Server 端應用程序。
本例中將建立一個 Server 類型之執行組件。按下對話框右側 New… 按鈕將會出現執行組件屬性設定對話框,以新增一個執行組件。
執行組件屬性設定對話框中,我們可以鍵入一識別用途之名稱于 Name 字段,本例中我們鍵入中文識別名稱 "執行 input.jsp",在 Run 頁次 Type 組合方塊中可選取Server 類型應用程序,由于本例我們采用 JBuilder 內置之 Tomcat 4.0 為 JSP/Servlet Container,因此 Server 下拉盒選取 Tomcat 4.0。倘若我們的 Server 組合方塊中無適當選項可供選取,可于JBuilder 主菜單 Tools | Configure Server… 中進行相關設定。接著我們必須選取此 Web應用程序激活 URI,我們可按下 Launch URI 字段右側 [ … ] 按鈕,即可出現選取 URI 之對話框,我們可直接以鼠標點擊選擇左側 input.jsp,按下 OK 按鈕完成選取,并返回執行組件屬性設定對話框。
此時執行組件屬性設定對話框中主要項目皆已設定完畢,按下 OK 按鈕返回項目屬性設定對話框。項目屬性對話框中將把前述步驟所設定之執行組件列于Runtime Configurations 清單方塊中,按下 OK 按鈕即完成執行組件設定。
步驟七 : 執行 Web 應用程序
接下來可點擊選擇 JBuilder 菜單 Run 或工具列中綠色三角形符號執行此 Web 應用程序。JBuilder 將于集成開發環境內激活 Tomcat 4.0 Server,我們可以通過 JBuilder 內置之 Web 瀏覽器進行測試,或于Microsoft Internet Explorer 網址字段中鍵入:
http://localhost:8080/demo/input.jsp
以進行測試。在 Web 瀏覽器中我們鍵入 AAA 與 BBB 按下 Submit 按鈕,得到預期之運算結果AAABBB。
倘若將第一個字段改以繁體中文鍵入,卻發現產生亂碼,字符串連接結果也無法正確辨認。Struts Framework并無中文兼容性上之問題,但是 Tomcat 4.0 在使用 JSP處理內含中文請求時,并需設定請求編碼。繁體中文環境常用編碼為 Big5 與 MS950,MS950 編碼含括 Big5 編碼,并額外增加 碁、恒、里、妝、嫻、銹、墻 等七字。
例如,在 Microsoft Windows 平臺下,欲使 Tomcat 4.0 正確處理繁體中文,通常在 JSP 起始處加上:
<%@ page contentType="text/html; charset=MS950" %>
<% request.setCharacterEncoding("MS950") ; %>
以設定網頁內容編碼與請求編碼為 MS950 編碼;類似地,對于簡體中文(常用編碼為GB2312),以上的代碼應為:
<%@ page contentType="text/html; charset=GB2312" %>
<% request.setCharacterEncoding("GB2312") ; %>
但是 Struts Framework 中實際上是由 ActionServlet 收到Web 瀏覽器端請求,再轉交特定之 Action 類加以處理,因此直接于 JSP 中設定請求編碼并無效果。
三、處理中文編碼問題(以繁體中文為例)
對于處理 Struts Framework 中文編碼問題有多種方式,在此我們繼承 ActionServlet 類并覆蓋 process 方法,于子類process 方法中設定請求編碼。由此展現ActionServlet 扮演前端 Controller 之特質。
首先,點擊選擇 JBuilder 主菜單 File | New Classes 準備產生一新的類。并繼承自org.apache.struts.action.ActionServlet并將預設的類名稱由Untitled1 改為 myActionServlet。按下 OK 按鈕后即產生程序代碼。點擊選擇 JBuilder 主菜單Wizards | Override Methods… 激活覆蓋方法精靈,覆蓋方法精靈會自動列出父類 ActionServlet 所有可供覆蓋之方法。我們可于 Available methods 清單方塊中選取process (HttpServletRequest request, HttpServletResponse response) 方法,完成后按下 OK 按鈕。
此時我們可修改覆蓋后 process 方法程序代碼如下:
request.setCharacterEncoding ("MS950") ;
super.process (request, response) ;
備注:此處以繁體中文為例,在中國國內一般我們用的是簡體中文,因此可以將上述代碼在簡體中文環境下編寫為:
request.setCharacterEncoding ("GB2312") ;
super.process (request, response) ;
首行程序代碼將 process 傳入之參數 request 設定為 MS950編碼,其余行為同父類。接下來我們將要修改 web.xml部署描述檔,以指定 Servlet 之進入點,首先點擊選擇左上方項目窗格中的 web.xml。
此時,左下方結構窗格將出現 web.xml 內 XML 標記之樹狀結構。我們可以點擊選擇 Servlets 內的 Action 項目。
此時,便可運用右方內容窗格之圖形使用者接口編輯器修改 Servlet 進入點,目前預設之進入點是 Struts Framework 的 ActionServlet。
我們可以按下 Servlet class 項目右方 [ … ] 按鈕選取新的進入點替換預設之ActionServlet,也就是之我們撰寫之strutsdemo.myActionServlet。倘若我們非常熟悉web.xml 結構,同樣地可以直接點擊選擇內容窗格內的 Sources 頁次,直接以文字編輯器修改<servlet-class> 標記的內容。
修改完畢后,內容窗格內應如下圖:
完成后重新編譯此項目并執行之。再次測試后我們將發現繁體中文已經可以正確處理。