2010-10-20 56 views
1

默認堆棧具有parms攔截器,它將參數綁定到正在調用的操作中找到的setters。當你知道參數的名字時,這很好。例如,如果請求參數是「employee.name」,可以綁定到我的操作的屬性,該屬性具有屬性「名稱」的屬性「employee」。爲了讓它起作用,我需要知道請求參數名稱是哪個名稱,並在我的稱爲setEmployee()的對象類型爲Employee的操作中放置一個setter,或者它也可以是Map。Struts 2動態參數綁定

如果我想讓動作將該參數綁定到另一個屬性,我不知道哪一個屬於哪個屬性,該怎麼辦?假設這個動作接收到一個參數,這個參數將被設置請求參數的名字。

<s:action name="showEmployee" executeResult="true"> 
    <s:param name="employeePrefix">xyz.wz.empl</s:param> 
</s:action> 

這將意味着要將該員工的所有參數綁定到xyz.wz.empl。 例如假設請求參數有以下幾點: xyz.wz.empl.name =阿爾弗雷多· xyz.wz.empl.lastName =奧索里奧

我想結合,爲我的行爲的性質,讓我們說一個Map員工,但這不會工作,因爲請求參數是xyz.wz.empl。如何使用發送到操作的參數(employeePrefix)將該動態參數綁定到調用的操作。

我可以要求請求參數

ActionContext.getContext().getParameters() 

並做轉換自己,但我認爲必須有另一種方式來顯式調用從Struts的東西2架構的轉換,在方式融爲一體。 opensymphony.xwork2.interceptor.ParametersInterceptor的確。

謝謝。

回答

0

在我看來這不是一個理想的解決方案,但它會做你所需要的。

  1. 您的Struts 2 Action需要實現SessionAware和ParameterAware接口。
  2. 創建一個名爲'參數'的地圖的私人字段,併爲其創建一個getter/setter。
  3. 現在,當您調用getParameters()時,您將獲得一個名稱/值對的映射。

現在對於下一個部分,您將需要使用反射。

因此,例如,你需要這樣做:

Map myParams = getParameters() 
Employee e = new Employee() 

Class clas = null; 
try { 
    clas = Class.forName("Employee"); 
    Field fieldlist[] = clas.getDeclaredFields(); 
    for (int i = 0; i < fieldlist.length; i++) { 
     Field fld = fieldlist[i]; 
     if(myParams.containsKey(fld.getName())) 
      fld.set(e, myParams.get(fld.getName()) 
    } 

} catch (ClassNotFoundException ex) { 
// handle exception case 
} 

這應該如果它在地圖存在於員工的對象在地圖中的所有參數映射到現場。這當然可以移植到一個單獨的方法中,這個方法屬於類似於一個Util類的東西,在那裏你通過你想要反思的類。