• <ruby id="5koa6"></ruby>
    <ruby id="5koa6"><option id="5koa6"><thead id="5koa6"></thead></option></ruby>

    <progress id="5koa6"></progress>

  • <strong id="5koa6"></strong>
    • 軟件測試技術
    • 軟件測試博客
    • 軟件測試視頻
    • 開源軟件測試技術
    • 軟件測試論壇
    • 軟件測試沙龍
    • 軟件測試資料下載
    • 軟件測試雜志
    • 軟件測試人才招聘
      暫時沒有公告

    字號: | 推薦給好友 上一篇 | 下一篇

    用Struts框架開發Java應用

    發布: 2007-6-08 17:41 | 作者: 網絡轉載 | 來源: 網絡 | 查看: 86次 | 進入軟件測試論壇討論

    領測軟件測試網
    Struts開始于2000年3月,是采用Java Servlet/JavaServer Pages技術,開發Web應用程序的開放源碼的框架。當前最新的正式版本是1.0.2,本文內容就是針對這個版本的。采用Struts能開發出基于MVC(Model-View-Controller)設計模式的Java Web前端應用。通常MVC設計模式把一個系統劃分為相互協作的三個部分:

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

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

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

    但是,在基于JSP/Servlet的Web應用中要使用MVC模式,需要解決這樣一個問題,就是HTTP的底層是TCP/IP協議,而TCP/IP是一種無狀態連接的協議,如果我們的模型發生了變化,就無從通知視圖。而Struts采用了在“JSP規范v0.92”中就提出的MVC Model 2,這是對MVC在Web上應用的修訂版,它可以解決這個問題,見圖1。



    圖1 MVC Model2(FromMalcolm Davis)




    圖2 Sturts工作機理(From Malcolm Davis)


    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可見Struts是MVC Model 2的一個典型應用。

    安裝


    你可以從http://jakarta.apache.org/builds/jakarta-struts/release/下載Struts最新的二進制版本和源碼。首先進入v1.0.2下載頁面,下載jakarta-struts-1.0.2.zip(3.4MB),然后將jakarta-struts-1.0.2.zip解壓。其中包含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的應用,可以方便地修改,并且配置自己的應用。

    下面運行struts-example這個示例程序。因為Struts是一個Web應用,所以要運行這個示例需要一個兼容Servlet 2.2、JSP 1.1以上規范的Web容器。本文以Tomcat 3.3a(對Tomcat 4.0也適用)為例進行介紹。首先保證Tomcat可以正常運行。而運行struts example不需要其它特殊配置的,只要把struts-example.war拷入Tomcat下的webapps目錄,Tomcat在啟動時就會自動解壓了。然后啟動Tomcat,在瀏覽器中輸入http://localhost:8080/struts-example,如果能看到如圖3頁面,就說明已經運行成功。

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

    分析


    web.xml

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



    圖3 struts example主頁面




    圖4 用戶主頁面


    大家可能已經注意到了,這里的URL的后綴是.do。那么它有什么意義?服務器又是怎樣處理這樣的請求呢?下面我們看看{TOMCAT}\WEB-INF\web.xml文件,就會非常清楚。在web.xml中,你可以找到如下配置片斷:

    
    <!-- Action Servlet Mapping -->
    <servlet-mapping>
    <servlet-name>action</servlet-name>
    <url-pattern>*.do</url-pattern>
    </servlet-mapping>
    


    從上面配置代碼中可以知道,以.do結尾的請求URL是由一個名為action的Servlet處理,實際上可以為應用取另一個后綴,只要修改 就行了。但下面所有的討論都以.do為例。我們再看一下這個Servlet的配置:

    
    <!-- Action Servlet Configuration -->
    <servlet>
    <servlet-name>action</servlet-name>
    <servlet-class>org.apache.struts.action.ActionServlet</servlet-class>
    <init-param>
    <param-name>application</param-name>
    <param-value>
    org.apache.struts.webapp.example.ApplicationResources
    </param-value>
    </init-param>
    <init-param>
    <param-name>config</param-name>
    <param-value>/WEB-INF/struts-config.xml</param-value>
    </init-param>
    ……
    <load-on-startup>2</load-on-startup>
    </servlet>
    


    由此可見,action對應的類是org.apache.struts.action.ActionServlet。這是一個Struts提供的處于中心控制地位的Servlet,即圖2中的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進行分析。

    struts-config.xml

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

    
    <action 
     path="/logon"
     type="org.apache.struts.webapp.example.LogonAction"
     name="logonForm"
     scope="request"
     input="/logon.jsp">
    </action>
    


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

    logonForm也是在struts-config.xml中配置的,配置代碼為:

    
    <form-bean  name="logonForm" type="org.apache.struts.webapp. example.LogonForm"/>.
    


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

    
    private String username = null;
    private String password = null;
    


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

    
    <html:form action="/logon" focus="username">
    <html:text property="username" />
    <html:password property="password" redisplay="false"/>
    </html:form>
    

     

    注意,LogonForm中的屬性名一定要和logon.jsp中的表單域名完全對應起來。Struts就是由此從瀏覽器端抓取提交的數據,并填充到LogonForm對象中,再傳送給LogonAction類進行處理的。Struts實現的表單驗證和重填技術也是這樣實現的。注意,在上面的頁面代碼中我們使用了Struts的HTML定制標簽庫,也可以直接使用類似 <input type="text" name="username" /> 的HTML代碼,但這樣就失去了自動回填的支持。

    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()));
    


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



    圖5 登陸失敗頁面


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

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


    一個ActionMapping對象對應于struts-config.xml中的一個 <action/> 的配置。細心的讀者可能已經發現了,在struts-config.xml中舉例的/logon Action的配置中,并沒有Forward配置,但在它的開始部分卻有一個全局的Forward配置。配置代碼如下:

    
    <global-forwards>
    <forward   name="logoff"  path="/logoff.do"/>
    <forward   name="logon"   path="/logon.jsp"/>
    <forward   name="success" path="/mainMenu.jsp"/>
    </global-forwards>
    


    這個Forward配置將對所有的Action都有效。但如果 中已經有和這些全局Forward配置同名的項,那么它將覆蓋全局配置。所以你登錄成功后,將轉向到/mainMenu.jsp頁面。

    延伸閱讀

    文章來源于領測軟件測試網 http://www.kjueaiud.com/

    TAG: java struts 開發 框架 應用


    關于領測軟件測試網 | 領測軟件測試網合作伙伴 | 廣告服務 | 投稿指南 | 聯系我們 | 網站地圖 | 友情鏈接
    版權所有(C) 2003-2010 TestAge(領測軟件測試網)|領測國際科技(北京)有限公司|軟件測試工程師培訓網 All Rights Reserved
    北京市海淀區中關村南大街9號北京理工科技大廈1402室 京ICP備2023014753號-2
    技術支持和業務聯系:info@testage.com.cn 電話:010-51297073

    軟件測試 | 領測國際ISTQBISTQB官網TMMiTMMi認證國際軟件測試工程師認證領測軟件測試網

    老湿亚洲永久精品ww47香蕉图片_日韩欧美中文字幕北美法律_国产AV永久无码天堂影院_久久婷婷综合色丁香五月

  • <ruby id="5koa6"></ruby>
    <ruby id="5koa6"><option id="5koa6"><thead id="5koa6"></thead></option></ruby>

    <progress id="5koa6"></progress>

  • <strong id="5koa6"></strong>