ACTION - 業(yè)務(wù)代理方式
Action類,Struts組件,是用戶請求和業(yè)務(wù)邏輯之間的橋梁,每個Action充當客戶的一項業(yè)務(wù)代理。在RequestProcessor類預處理請求時,在創(chuàng)建了Action的實例后,就調(diào)用自身的processActionPerform方法,該方法再調(diào)用Action類的execute。
簡介
Action類—Struts組件
在RequestProcessor類預處理請求時,在創(chuàng)建了Action的實例后,就調(diào)用自身的processActionPerform()方法,該方法再調(diào)用Action類的execute()。
Action的execute()方法調(diào)用模型的業(yè)務(wù)方法,完成用戶請求,然后根據(jù)執(zhí)行結(jié)果把請求轉(zhuǎn)發(fā)給其他合適的WEB組件。
緩存
struts應(yīng)用的生命周期中RequestProcessor只保證一個Action實例,所有的客戶請求都共享這個實例.所有請求可以同時執(zhí)行它的execute()方法。RequestProcessor類包含一個HashMap,作為存放所有Action實例的緩存。每個Action實例在緩存中存放的key為Action類名。在RequestProcessor類的processActionCreate - 方法中,首先檢查在HashMap中是否存在Action實例,如果有直接使用,否則創(chuàng)建一個新的。創(chuàng)建Action實例的代碼位于同步代碼塊中,以保證只有一個線程創(chuàng)建Action實例,然后放在HashMap中。供其他線程使用。
線程安全
創(chuàng)建支持多線程的Action。
什么是線程安全的代碼
在多線程環(huán)境下能正確執(zhí)行的代碼就是線程安全的。安全的意思是能正確執(zhí)行,否則后果是程序執(zhí)行錯誤,可能出現(xiàn)各種異常情況。
如何編寫線程安全的代碼
很多相關(guān)的書籍里都詳細的講解如何同步線程對共享資源的使用以及synchronized關(guān)鍵字的各種用法,鎖的概念等。Java1.5中也提供讀寫鎖這類的工具類。這些都需要較高的技巧,而且相對難于調(diào)試。但是,線程同步是不得以的方法,是比較復雜的,而且會帶來性能的損失。等效的代碼中,如不需要同步在編寫的容易度和性能上會更好些。
如下:
常量始終是線程安全的,因為只存在讀操作。
對構(gòu)造器的訪問 - new操作是線程安全的,因為每次都新建一個實例,不會訪問共享的資源。
最重要的是:局部變量是線程安全的。因為每執(zhí)行一個方法,都會在獨立的空間創(chuàng)建局部變量,它不是共享的資源。局部變量包括方法的參數(shù)變量。
Servlet是在多線程環(huán)境下的。即可能有多個請求發(fā)給一個servlet實例,每個請求是一個線程。struts1下的action也類似,同樣在多線程環(huán)境下,你也必須編寫線程安全的Action類(不過這一問題在struts下已經(jīng)解決)。保證線程安全的原則就是僅僅使用局部變量,謹慎使用實例變量(擁有狀態(tài)的實例,尤其是擁有業(yè)務(wù)對象狀態(tài)的實例).如果要用到那些有狀態(tài)的實例,唯一和最好的辦法是在Action類中,僅僅在Action類的execute - 方法中使用局部變量,對于每個調(diào)用execute - 方法的線程,JVM會在每個線程的堆棧中創(chuàng)建局部變量,因此每個線程擁有獨立的局部變量,不會被其他線程共享.當線程執(zhí)行完execute - 方法后,它的局部變量就會被銷毀.如果Action類的實例變量是必須的話,需要采用JAVA同步機制(synchronized)對訪問共享資源的代碼塊進行同步。
Struts1的幾種Action Struts提供了一些現(xiàn)成的Action類,直接使用可以大大節(jié)省時間,如下ForwardAction可以轉(zhuǎn)發(fā)到其他web組件,僅僅提供一個轉(zhuǎn)發(fā)功能,不作處理。IncludeAction包含其他web組件。DiapatchAction通常一個Action只完成一個操作,用這個Action可以完成一組相關(guān)的操作。LookupDispatchAction他是DiapatchAction的子類,也可以定義多個方法,但主要用于一個表單里有多個按鈕,而這些按鈕又有一個共同的名字的場合。SwitchAction用于子模塊之間的切換。
ActionForward類Action類的execute()方法返回一個ActionForward對象,它代表了web資源的邏輯抽象,這里的web資源可以是jsp頁面、Java servlet、或Action。從execute返回ActionForward可以有兩種方法。
動態(tài)創(chuàng)建一個ActionForward實例return new ActionForward(”Failure”,”login.jsp”,true);
調(diào)用ActionMapping實例的findForward方法這個方法先從action級別找,然后在級別找return mapping.findForward - “Failure”;
對話框
VB中通過對話框中可以通過Action屬性來設(shè)置對話框的類型,也可以用相應(yīng)的方法設(shè)置.文件對話框?qū)?yīng)的Action屬性為1,方法為Showopen.屬性為2,表示打開“保存文件”對話框。
