2009-04-12 8 views
0

Je souhaite remplir une propriété de carte sur une action Struts2 à partir d'une JSP. Quel est le format des noms de données que je devrais utiliser? Initialement, je suis intéressé à remplir une carte < String, String> mais dans l'avenir, je serais intéressant de remplir une carte String, DomainClass> où la DomainClass a ses propres propriétés.Noms de champs pour les entrées de carte Struts2 dans un JSP

Répondre

3

J'ai une action, avec une propriété comme suit -

private Map<String,String> assetProps; 
... 
public Map<String, String> getAssetProps() { 
    return assetProps; 
} 

public void setAssetProps(Map<String, String> assetProps) { 
    this.assetProps = assetProps; 
} 

Pour définir des valeurs sur la carte, il y a essentiellement deux étapes. Tout d'abord, OGNL ne peut pas instancier la carte, donc c'est à vous de décider. Dans mon action, j'implémentent l'interface préparable, mais instancier avant d'exécuter la méthode «public entrée de chaîne() comme suit: -

public class EditAction extends ActionSupport implements Preparable { 
... 
    public void prepare() { 
     // just satisfying Preparable interface so we can have prepareInput() 

    } 

    public void prepareInput() throws Exception { 
     assetProps = new HashMap<String,String>(); 
    } 

Maintenant, l'objet est non nul, je peux utiliser une syntaxe similaire à la suivant les JSP -

<s:iterator value="asset.properties" var="prop"> 
    <sjx:textfield name="%{'assetProps[\\'' +#prop.propName +'\\']'}" 
      value="%{#prop.propValue}" 
      label="%{#prop.propName}" size="25"/> 
    </s:iterator> 

l'itérateur tire un ensemble d'objets de la pile et une itération sur elle. La partie importante est la section "name =", notez les guillemets doubles à échappement double. Ainsi, lorsque la page s'affiche, le nom de l'élément d'entrée devient (par exemple) - assetProps ['Screen Size']. Lorsque la page est soumise, à l'intérieur de la méthode "public void execute()", assetProps est entièrement rempli.

+0

Merci pour l'explication, cela m'a aidé à résoudre une situation similaire. D'un côté, vous n'avez pas vraiment besoin de l'interface Preparable pour cela, vous pouvez juste initialiser la carte quand elle est déclarée. – shakerlxxv

2

Voici un autre extrait de code qui fait quelque chose de similaire, au cas où cela aiderait quelqu'un.

<s:iterator value="storageIds" var="sids"> 
    <s:hidden name="%{'storageIds[\\'' + key +'\\']'}" value="%{#sids.value}"/> 
</s:iterator> 

Mon action a un nom Map<String,String>storageIds

Lorsque itérer une carte, détermination clé et la valeur des propriétés Map.Entry.

0

Essayez ceci. Travailler parfaitement pour moi

<s:iterator value="configMap" id="daa"> 
    <s:hidden name="%{'configMap[\\'' + key +'\\']'}" value="%{#daa.value}" /> 
</s:iterator> 
Questions connexes