jeudi 8 décembre 2011

Struts2 : Utilisation des attributs dans la méthode prepare()

Lorsque vous souhaitez initialiser certains attributs de votre action Struts 2 en fonction des données saisies par l'utilisateur, telles que des listes déroulantes par exemple, votre action doit implémenter l'interface Preparable. Ainsi, avant chaque appel d'une méthode de votre action, la méthode prepare() est appelée.

public class MonAction extends ActionSupport implements Preparable {
    ...
        public void prepare() {
              // En fonction des attributs recus, initialiser ici les attributs de votre action qui seront transmis à votre vue
        }
}
D'après la documentation officielle de Struts 2, pour utiliser la méthode prepare(), il faut aussi utiliser l'interceptor prepare correspondant dans votre struts.xml.
De plus, pour que les attributs soient disponibles dans prepare(), l'astuce consiste en fait à ré appeler l'interceptor params avant prepare, comme indiqué ci-dessous :

<!-- Calls the params interceptor twice, allowing you to
      pre-load data for the second time parameters are set -->
 <action name="someAction" class="com.examples.SomeAction">
     <interceptor-ref name="params"/>
     <interceptor-ref name="prepare"/>
     <interceptor-ref name="basicStack"/>
     <result name="success">good_result.ftl</result>
 </action>


Mais si vos vues contiennent des checkbox,  cela n'est pas suffisant. Cela provoque en effet une erreur du genre :
OgnlValueStac W com.opensymphony.xwork2.util.logging.commons.CommonsLogger warn Error setting expression '__checkbox_xxxx' with value '[Ljava.lang.String;@1f7c9ad'
ognl.OgnlException: target is null for setProperty(null, "xxxx", [Ljava.lang.String;@1f7c9ad)

Pour résoudre ce problème, il faut en fait aussi utiliser l'interceptor checkbox en double

<action name="someAction" class="com.examples.SomeAction">
     <interceptor-ref name="checbox"/>
     <interceptor-ref name="params"/>
     <interceptor-ref name="prepare"/>
     <interceptor-ref name="basicStack"/>
     <result name="success">good_result.ftl</result>
 </action>

Aucun commentaire:

Enregistrer un commentaire