Struts 2动态参数绑定

时间:2010-10-20 15:11:00

标签: java model-view-controller binding struts2

默认堆栈具有parms拦截器,该拦截器将参数绑定到正在调用的操作中找到的setter。当你知道参数的名称时,这很好。例如,如果请求参数是“employee.name”,可以绑定到我的操作的属性,该属性具有属性“employee”,其属性为“name”。为了使它工作,我需要知道请求参数名称将在哪个名称,并在我的操作中将setter放在对象类型Employee的setEmployee()中,或者它也可以是Map。

如果我想让动作将该参数绑定到另一个我不知道哪个属性的属性,该怎么办?假设该操作接收将设置请求参数的名称作为参数。

<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员工,但这不起作用,因为request参数是xyz.wz.empl。如何使用发送到操作的参数(employeePrefix)将该动态参数绑定到调用的操作。

我可以要求提供请求参数

ActionContext.getContext().getParameters()

并自己进行转换,但我认为必须有另一种方法来显式调用Struts 2框架中的某些东西进行转换,就像com.opensymphony.xwork2.interceptor.ParametersInterceptor那样。

谢谢。

1 个答案:

答案 0 :(得分:0)

在我看来,这不是一个理想的解决方案,但它会做你需要的。

  1. 您的Struts 2 Action需要实现SessionAware和ParameterAware接口。
  2. 创建一个私有字段,这是一个名为'parameters'的地图,并为其创建一个getter / setter。
  3. 现在,当您调用getParameters()时,您将拥有一个名称/值对的映射。
  4. 现在,对于下一部分,您将需要使用反射。

    例如,你需要这样做:

    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类。