默认堆栈具有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那样。
谢谢。
答案 0 :(得分:0)
在我看来,这不是一个理想的解决方案,但它会做你需要的。
现在,对于下一部分,您将需要使用反射。
例如,你需要这样做:
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类。