代码之家  ›  专栏  ›  技术社区  ›  Alfredo Osorio

Struts 2动态参数绑定

  •  1
  • Alfredo Osorio  · 技术社区  · 15 年前

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

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

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

    这意味着将雇员的所有参数绑定到xyz.wz.empl的操作。 例如,假设请求参数具有以下内容: xyz.wz.empl.lastName=奥索里奥

    我可以问一下请求参数

    ActionContext.getContext().getParameters()
    

    我自己做转换,但我认为必须有另一种方法,像com.opensymphony.xwork2.interceptor.ParametersInterceptor那样,显式地调用从Struts 2框架到转换的东西。

    谢谢您。

    1 回复  |  直到 15 年前
        1
  •  0
  •   bsimic    14 年前

    在我看来,这不是一个理想的解决办法,但它能满足你的需要。

    1. 您的Struts 2操作需要实现sessionware和parameterware接口。
    2. 现在,当您调用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
    }
    

    如果employee对象的字段存在于映射中,则应将该映射中的所有参数映射到该字段。当然,这可以移植到一个单独的方法,该方法属于一个类似Util类的类,在这个类中传递您想要反映的类。

    推荐文章