2012-04-25 44 views
2

我有兩個Struts2操作。我想在另一個行動中使用公開的行動方法。是否可以通過new運營商調用操作並調用其公共方法? (重用一些常用功能的緣故)在另一個操作中通過構造函數調用Struts動作是否是一種很好的做法?

public class OneAction extends ActionSupport{ 
public void doSomeThing(){ 
    // some code 
} 

public String execute(){ 
    // some code 
} 
} 

public class AnotherAction extends ActionSupport{ 

public String execute(){ 
    /* is it ok?*/ 
    new OneAction().doSomeThing(); 
} 
} 

回答

4

(發抖)我不會。我會將通用功能重構爲一個可以調用的獨立類。但是那個班會是一個POJO,而不是一個行動。

我會小心在動作中嵌入功能。我認爲他們堅決在網絡層陣營。除了驗證參數並將其綁定到對象之外,您應該做的僅僅是將其交給POJO進行處理,並將結果打包以返回。

+2

嗯。對,我應該更好地將這個通用功能轉移到服務層。並在兩個操作中調用服務層。 – 2012-04-25 16:22:51

+0

服務層 - 完全。 POJO接口和實現。即使你有一天決定拋棄Struts,或者從移動平臺調用它們,這些也是可用的。 – duffymo 2012-04-25 16:39:29

+0

但是,我應該在該POJO中有請求對象嗎?這樣我的session/cookies的邏輯也可以在那裏提到。 – 2012-04-26 10:29:59

2

我加上@ duffymo的回答,但這裏有更多的想法。

如果這些功能在各個操作之間是共同的,那麼它屬於基本操作(如果與web相關)或實用程序類(無論是否與web相關)。哪個最有意義取決於上下文。沿着這些上下文線,根據你所談論的實際功能,它可能更有意義,但在其他地方 - 在攔截器,方面,mixin中(如何做到這一點取決於實現語言)等等。不知道細節,很難更具體。

+0

我有scenerio,當用戶登錄時,是時候更改他的密碼。我將重定向到另一個操作。用戶將更改密碼。同樣的邏輯將運行在LoginAction中寫入用戶成功登錄。所以我必須把這個登錄成功邏輯放在一些常見的地方。用於這兩個行動。 – 2012-04-26 10:34:03

+1

不,這兩個操作都應調用AuthenticationService,該AuthenticationService具有驗證和驗證用戶的方法。讓AuthenticationService中的changePassword方法調用其登錄方法。在服務中做到這一切;不要在Actions之間重定向。 – duffymo 2012-04-26 11:28:01

相關問題