2010-10-20 6 views
1

La pile par défaut est dotée de l'intercepteur de paramètres qui lie les paramètres aux paramètres trouvés dans l'action appelée. Cela fonctionne bien lorsque vous connaissez le nom du paramètre. Par exemple si un paramètre de requête est "employee.name" qui pourrait être lié à une propriété de mon action qui a une propriété "employee" avec une propriété "name". Afin de le faire fonctionner, j'ai besoin de savoir quel nom le nom du paramètre de demande serait et mettre un setter dans mon action appelée setEmployee() d'un type d'objet employé ou il pourrait être aussi une carte. Et si je veux que l'action lie ce paramètre à une autre propriété que je ne connais pas. Disons que l'action reçoit en paramètre le nom sur lequel sera défini le paramètre de requête.Liaison de paramètre dynamique Struts 2

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

Cela signifierait à l'action pour lier tous les paramètres de l'employé à xyz.wz.empl. Par exemple, disons que le paramètre de requête a les éléments suivants: xyz.wz.empl.name = Alfredo xyz.wz.empl.lastName = Osorio

Je voudrais lier cela à une propriété de mon action, nous allons dites un employé de Map, mais cela ne fonctionnera pas car le paramètre de requête est xyz.wz.empl. Comment puis-je lier ce paramètre dynamique à l'action invoquée en utilisant le paramètre qui a été envoyé à l'action (employeePrefix).

Je pourrais demander la demande paramètres

ActionContext.getContext().getParameters() 

et faire moi-même la conversion, mais je pense qu'il doit y avoir une autre façon d'appeler explicitement quelque chose Struts 2 cadre à la conversion, de la manière que com. opensymphony.xwork2.interceptor.ParametersInterceptor le fait.

Merci.

Répondre

0

Ce n'est pas une solution idéale à mon avis mais il fera ce dont vous avez besoin.

  1. Votre action Struts 2 devra implémenter les interfaces SessionAware et ParameterAware.
  2. Créer un champ privé qui est une carte appelée «paramètres» et créer un getter/setter pour cela. Maintenant, lorsque vous appelez getParameters(), vous aurez une carte de vos paires nom/valeur.

Maintenant, pour cette partie suivante, vous aurez besoin d'utiliser la réflexion.

Ainsi, par exemple, vous devez faire ceci:

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 
} 

Cela devrait cartographier tous les paramètres de cette carte à un champ dans l'objet employé si elle existe dans la carte. Cela peut bien sûr être transféré à une méthode séparée qui appartiendrait à quelque chose comme une classe Util où vous passez dans la classe sur laquelle vous voulez réfléchir.