2011-06-01 63 views
0

我要做到以下幾點:如何查找配置Struts動作

final Action myAction = getActionDefinedInStrutsConfig(param); 
myAction.execute(params); 

有沒有一種方法來查找行動的ActionServlet已初始化?

我可以創造一個新的,像這樣:

final Action myAction = new ActionImpl(); 
myAction.execute(params); 

但這樣一來,新的動作不正確初始化,附加的servlet沒有設置和getServlet()返回null。


一點澄清,爲什麼我需要這樣的:

的問題是,我現在有2個登錄頁面。一個用於普通用戶,另一個用於管理員。他們應該是完全獨立的系統,但事實是他們目前沒有。我需要創建一個「代理」登錄頁面,根據請求決定要重定向哪個登錄頁面。如果我重定向到URL但是會繪製UI。我需要調用用戶或管理員登錄操作來處理我的代理頁面請求。同時移動服務中的邏輯,同時是正確的方法,目前不是一種選擇。

+0

你要什麼做的正是出於什麼目的到底是什麼? – 2011-06-01 11:07:25

+0

從我的動作中調用另一個動作。因爲我想在不繪製UI的情況下調用它的邏輯。 – Simeon 2011-06-01 11:08:21

+0

您可以將您的動作轉發到'struts-config.xml'中的另一個動作。 – 2011-06-01 11:10:39

回答

2

好吧,因爲我明白你的意思在這裏是我的建議:

  • 用你的行動validatory目的,即從ActionForm檢索數據和有效性檢查。所有信息完成後,將信息發送至服務。
  • 該服務(不必是Web服務,而是簡單的POJO)將具有應用程序的業務邏輯,以及相關的異常和返回類型。一旦您使用其方法致電相關服務,檢索結果,最後,
  • 填寫您的必要ActionForm或執行mapping.findForward()

這樣,如果您需要另一個Struts Action使用的另一個業務邏輯,而是調用第二個操作使用的服務。這是代碼重用和良好的面向對象操作的有效方法。

希望這會有所幫助。


的破解的方法是這樣:

final Action myAction = new ActionImpl(); 
myAction.setServlet(getServlet()); 
/* ONLY if your form enctype is "multipart/request-data". */ 
myAction.setMultipartRequestHandler(getMultipartRequestHandler()); 

//Finally 
myAction.execute(params); 
+0

這是標準的做法。然而,在傳統系統中,我想在控制器級別執行此操作。不是商業服務水平(邏輯是),你建議的方式是正確的。如果你願意,我可以解釋爲什麼我需要在控制器級別上使用它,但我不想浪費你的時間。 – Simeon 2011-06-01 11:37:03

+0

繼續Simeon,我們不知道你的系統是如何設置的,我不會建議改變控制器級別的東西..... – 2011-06-01 11:43:00

+0

問題是我目前有2個登錄頁面。一個用於普通用戶,另一個用於管理員。他們應該是完全獨立的系統,但事實是他們目前沒有。我需要創建一個「代理」登錄頁面,根據請求決定要重定向哪個登錄頁面。如果我重定向到URL但是會繪製UI。我需要調用用戶或管理員登錄操作來處理我的代理頁面請求。同時移動服務中的邏輯,同時是正確的方法,目前不是一種選擇。 – Simeon 2011-06-01 11:53:14

0

您可以在前鋒定義操作:

<action parameter="command" path="/firstAction" 
     input="firstAction.tiles" name="someForm" scope="session" validate="true" type="com.mycompany.FirstAction"> 
     <forward name="toSecond" path="/secondAction.do?command=someMethod" redirect="true"/> 
    </action> 

    <action parameter="command" path="/secondAction" input="secondAction.tiles" name="someForm" 
     scope="session" validate="true" type="com.mycompany.SecondAction"> 
     <forward name="backToFirst" path="/firstAction.do?command=myMethod" redirect="true" /> 
    </action> 

現在你可以使用mapping.findForward("toSecond"),在你的第一個動作和mapping.findForward("backToFirst")另一方。

+0

這對我不起作用,因爲我不想繪製我要轉發的操作的UI。有沒有一種方法可以在不繪製你轉發的動作的UI的情況下進行轉發? – Simeon 2011-06-01 11:32:39

+0

如果我理解正確,你正在尋找重用代碼,對吧?您不能在第二個操作中處理請求並將其轉發到第一個操作?你也可以使用'doStuff(Request req)'從一個類繼承這兩個動作。 – iruediger 2011-06-01 11:54:02