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
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.
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
.
Essayez ceci. Travailler parfaitement pour moi
<s:iterator value="configMap" id="daa">
<s:hidden name="%{'configMap[\\'' + key +'\\']'}" value="%{#daa.value}" />
</s:iterator>
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