程序師世界是廣大編程愛好者互助、分享、學習的平台,程序師世界有你更精彩!
首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫知識
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
 程式師世界 >> 編程語言 >> JAVA編程 >> 關於JAVA >> Struts作業指導手冊

Struts作業指導手冊

編輯:關於JAVA

作者:Junsan Jin

日期:2005-4-4

版本:1.0

信箱:[email protected] ; [email protected]

聲明:本人保留本文的所有權利。

第一部分:簡介

Struts開始於2000年3月,是采用Java Servlet/JavaServer Pages技術,開發Web應用程序的開放源碼的框架。

采用Struts能開發出基於MVC(Model-VIEw-Controller)設計模式的Java Web前端應用。通常MVC設計模式把一個系統劃分為相互協作的三個部分:

1、 Model(模型),模型用於封裝系統的狀態,比如業務數據;

2、 VIEw(視圖),視圖是模型的表示,提供用戶交互界面。當模型狀態發生變化時,視圖應該得到通知,以便更新模型的變化;

3、 Controller(控制器),接受來自視圖的請求,修改模型的狀態。

Struts應用有3個主要部件:一個是使用Servlet實現的中心控制器(Controller Servlet,由Struts提供的org.apache.action. ActionServlet類實現)及負責具體業務邏輯處理的Action(org.apache.action.Action的子類);一個是用於顯示的JSP頁面(vIEwer);另一個是用於封裝系統狀態的業務邏輯元件(Model)。Struts 的中心控制器接受所有來自客戶端的請求,並根據系統的配置(struts-config.XML)路由HTTP請求到其它Action對象(開發者實現的org.apache.struts.action.Action的子類)。在這些Action對象中會完成所有的業務操作,比如插入一條訂單、修改一條記錄等。處理完畢,由Struts的Controller Servlet根據配置轉向到適當的JSP頁面,將處理結果顯示給用戶。從這裡可以看出,在Struts中Controller Servlet擔任了重要的角色,它控制所有的程序流轉,使MVC三個相對獨立的部分協調工作,從而使系統的功能更加完善。

第二部分:系統環境及安裝版本1、系統環境

操作系統:Windows xp SP1

Web服務器:TOMCAT 5.0.14

2、Struts版本

本文使用jakarta-struts-20031118版本(隸屬1.1版本系列),下載地址:

http://jakarta.apache.org/builds/jakarta-struts/release/

我們得到安裝包jakarta-struts-20031118.zip。

第三部分:安裝配置Struts1、安裝Struts

解壓縮jakarta-struts-20031118.zip包到E:\mylib\jakarta-struts中。其中包含有lib和webaPPS兩個子目錄。lib子目錄中是使用Struts需要的Jar文件、標簽庫定義文件(.tld),以及對一個Struts Web應用的web.xml和struts-config.XML配置文件的DTD定義(.dtd)。webaPPS子目錄中包含了幾個Struts的示例應用,都已打包為.war格式,這裡主要介紹其中三個:

1. struts-example.war,一個采用Struts框架的簡單的示例程序Controller;

2. struts-documentation.war,Struts文檔的war包;

3. struts-blank.war,一個空白的Struts的應用,可以方便地修改,並且配置自己的應用。

我們如果要建立新的應用,就使用第三個作為基本框架就行了。

2、運行struts-example.war

把struts-example.war拷入Tomcat下的webaPPS目錄。然後啟動Tomcat,Tomcat在啟動時就會自動解壓war包了(如果沒有自動解壓,察看你的tomcat服務器是否配制成了直接運行war文檔的模式),在浏覽器中輸入http://localhost:8080/struts-example,如果能看到如下圖所示頁面,就說明已經運行成功。

在上圖中你可以點擊“Register with the MailReader Demonstration Application”注冊一個MailReader用戶,或直接點擊“Log on to the MailReader Demonstration Application”,輸入用戶名和密碼(示例程序已經預置了一個用戶user/pass,配置在struts-example下的WEB-INF\database.XML文件中)登入。

3、對例程的分析(1)web.XML分析

在上圖所示的頁面中,點擊“Log on to the MailReader Demonstration Application”鏈接,進入/logon.JSP頁面,輸入預定義的用戶名為user、密碼為pass,然後提交就進入了下圖所示的用戶主頁面。

注意,這裡的URL的後綴是.do。那麼它有什麼意義?服務器又是怎樣處理這樣的請求呢?看看{TOMCAT}\WEB-INF\web.xml文件,就會非常清楚。在web.XML中,可以找到如下配置片斷:

action

*.do

從上面配置代碼中可以知道,以.do結尾的請求URL是由一個名為action的Servlet處理,實際上可以為應用取另一個後綴,只要修改這裡就行了。

再看下面的一段配置摘要:

action

org.apache.struts.action.ActionServlet

application

org.apache.struts.webapp.example.ApplicationResources

config

/WEB-INF/struts-config.XML

……

2

由上可見,action對應的類是org.apache.struts.action.ActionServlet。這是一個Struts提供的處於中心控制地位的Servlet,即Controller Servlet,正是用它監聽所有的來自於用戶的以.do為後綴的請求。在上面的配置中,為ActionServlet配置了一個名為config的初始化參數,值為 /WEB-INF/struts-config.xml。struts-config.xml是一個基於Struts應用的最重要的配置文件,其中包含了所有的Action請求(指以.do結尾的請求)、相應的Action處理類、Form Bean,以及頁面的轉向等信息的配置。struts-config.xml在應用啟動時讀入,然後根據這些配置進行響應。下面以示例程序中的LogonAction的配置為例,對struts-config.XML進行分析。

(2)Struts-config.XML分析

下面是struts-config.XML中對LogonAction進行配置的部分代碼:

path="/logon"

type="org.apache.struts.webapp.example.LogonAction"

name="logonForm"

scope="request"

input="/logon.JSP">

從上面可以看出,MailReader應用中對應/logon.do的請求是由org.apache.struts.webapp.example. LogonAction類進行處理的,name屬性指定的是這個請求對應的表單所對應的模型組件。

logonForm也是在struts-config.XML中配置的,下面是其配置的部分代碼:

type="org.apache.struts.validator.DynaValidatorForm">

LogonForm類是一個普通的JavaBean,其中定義了幾個屬性及屬性的讀寫方法,而且這些屬性的名字要和頁面表單中的輸入域對應。比如LogonForm中定義了兩個屬性,代碼如下:

private String username = null;

private String passWord = null;

這兩個屬性分別對應於logon.JSP表單中的兩個輸入域,代碼如下:

這裡要注意一點,LogonForm中的屬性名一定要和logon.JSP中的表單域名完全對應起來。Struts就是由此從浏覽器端抓取提交的數據,並填充到LogonForm對象中,再傳送給LogonAction類進行處理的。Struts實現的表單驗證和重填技術也是這樣實現的。在上面的頁面代碼中我們使用了Struts的Html定制標簽庫,這些標簽都定義在Struts的標簽庫中,有意研究的可以看一下,不過建議大家最好少用,因為這些標簽支持的Javascript事件很少,而且失去了自動回填的支持,所以,還是自己做擴展標簽比較好。還可以直接使用類似的Html代碼,去Struts的標簽庫中找吧。

(3)Action分析

上面我們已經對Struts前端應用框架的整體結構、數據流轉有了一定的認識。也知道了Struts是怎樣從配置文件中獲取配置信息的,即先啟動,然後等待請求,再從前台抓取數據,根據配置信息調用(或生成)Action類進行處理,最後根據處理的結果轉向到對應的頁面響應用戶。那麼,現在就讓我們看看LogonAction是怎樣進行業務處理,並將處理結果顯示給用戶的。主要代碼如下:

package org.apache.struts.webapp.example;

import org.apache.struts.action.Action;

......

public final class LogonAction extends Action {

public ActionForward perform(ActionMapping mapping,

ActionForm form,

HttpServletRequest request,

HttpServletResponse response)

throws IOException, ServletException {

......

ActionErrors errors = new ActionErrors();

String username = ((LogonForm) form).getUsername();

String password = ((LogonForm) form).getPassWord();

......

// 進行用戶驗證

// 如果不存在此用戶,或密碼錯誤,則將錯誤添加到errors中

if (!errors.empty()) {

saveErrors(request, errors);

return (new ActionForward(mapping.getInput()));

}

HttpSession session = request.getSession();

session.setAttribute(Constants.USER_KEY, user);

//刪除過期的form bean

......

if (mapping.getAttribute() != null) {

if ("request".equals(mapping.getScope()))

request.removeAttribute(mapping.getAttribute());

else

session.removeAttribute(mapping.getAttribute());

}

//定位到成功頁面

return (mapping.findForward("success"));

}

}

}

LogonAction類繼承於org.apache.struts.action.Action,Action類是所有的Action的基類。其中定義的perform()方法完成對請求處理,並根據處理結果轉向到不同的頁面,然後顯示給用戶。Action類並不是Servlet,它不直接監聽來自客戶端的請求。上面所提到的中心控制器ActionServlet是一個Servlet,客戶端發出的Action請求,由ActionServlet接收,根據struts-config.XML中的配置,傳入對應的mapping、form、request、response對象,並調用對應的Action類的perform()方法進行處理(在第一次調用時,實例化一個Action,隨後的請求將直接調用已存在的Action類進行處理,所以Action類是共享的,編程中須注意處理並發問題)。下面對上述的LogonAction的perform()方法進行簡單的分析。

1. 首先從傳入的form對象中獲取username和passWord。我們可能會奇怪這兩個屬性是在什麼時候置入的?這是ActionServlet在調用LogonAction的perform()方法之前根據struts-config.XML中的配置及對應的LogonForm中的屬性從前端請求抓取數據,置入LogonForm對象的。然後進行用戶驗證。本例沒有使用數據庫進行存儲,用戶信息是存儲在database.xml文件中的。如果username/passWord在database.XML文件不存在或密碼錯誤,則生成一個ActionError對象,將錯誤信息存儲到該對象中,並把這個對象添加到ActionErrors中,其它發生的錯誤也類似處理。在隨後的程序中,首先校檢是否有錯誤發生,如果有錯誤發生,就把錯誤對象存儲到request中,使用的方法為saveErrors(request, errors)。該方法是在基類org.apache.struts.action.Action中實現的,它完成的功能很簡單,將errors對象通過setAttribute()方法存儲到request中即可。實現如下:

protected void saveErrors(HttpServletRequest request,ActionErrors errors) {

//刪除掉不需要的錯誤信息

if ((errors == null) || errors.empty()) {

request.removeAttribute(ERROR_KEY);

return;

}

//保存我們需要的錯誤對象

request.setAttribute(ERROR_KEY, errors);

}

如果發生錯誤,將重定向到輸入頁面,同時自動完成輸入域的重填,代碼如下:

return (new ActionForward(mapping.getInput()));

如果在登陸頁面輸入user/abc將提示上面的錯誤,那麼原來輸入的username域就會自動填充進來了,在一個有大量輸入域的表單會大大方便用戶。

2.在上面的程序執行通過後,就說明這是一個合法登陸。我們要做的就是把當前用戶保存到session中,同時清除已經無效的Form Bean,最後轉向到success頁面,代碼為:

return (mapping.findForward("success"));

一個ActionMapping對象對應於struts-config.XML中的一個的配置。如果你很細心的話,可能已經發現了,在struts-config.xml中舉例的/logon Action的配置中,並沒有Forward配置,但在它的開始部分卻有一個全局的Forward配置。配置代碼如下:

這個Forward配置將對所有的Action都有效。但如果中已經有和這些全局Forward配置同名的項,那麼它將覆蓋全局配置。所以你登錄成功後,將轉向到/mainMenu.JSP頁面。當然,如果你想定義只對一個action起作用的forward,那麼就把他們放到中去吧。

第四部分:空模板的使用

在struts的webapps目錄下包含有struts-blank.war包,這個是struts的一個空白框架。我們可以直接使用WinRAR等工具將struts-blank.war包解開,或者是放到tomcat 5.0.14的webaPPS下,啟動tomcat,讓tomcat將包解開,然後刪掉struts-blank.war就可以了。

該目錄下有三個文件夾和一個JSp文件,下面的工作就簡單了。META-INF我們可以不予理會,在不涉及到高級組件技術或者要打成ear或是jar包發布的話,這個文件夾是多余的,因為在打war包時,打包器會搞定一切的;而page文件夾下可以放置所有的JSP文件,按照項目需要組織目錄就行了;而WEB-INF下放什麼,不用說也知道了,但是為了以後項目維護的方便,你需要組織好類包的結構,Struts的配置文件還是struts-conf.XML,而項目產生的Java文件最好放到src文件夾下,這樣的話就可以使用ant來編譯了,也就是說,你的開發工具只需要一個文本編輯器就可以了,編譯工作可以交給ant了,它會幫你完成一切的。使用ant編譯後在classes下存有編譯好的類文件,當然,它也同時生成了組件包,你可以選擇部署一個;至於index.JSP文件則完全可以被項目的主頁面代替。

OK,Struts的配置就這麼簡單,上面講的已經足夠一個項目的使用了。當然,Struts還有更多高級的應用,這些可以去看struts的幫助文檔,就是那個struts-documentation.war,部署到tomcat上就可以浏覽了。

備注:本文檔為初稿,如果有什麼補充或發現什麼錯誤,請及時聯系,以便補充或更正。

  1. 上一頁:
  2. 下一頁:
Copyright © 程式師世界 All Rights Reserved