Obtenir un élément de liste d'attributs de modèles de printemps en utilisant un index de javascript

Désolé si cela a été demandé ailleurs, mais j'ai regardé tout autour, j'ai trouvé des réponses, mais pas un exemple complet et je doute encore de cela.

Donc, j'ajoute une liste Autopopulating de mon contrôleur Spring à mon jsp et je voudrais ajouter des éléments sur la liste dans ma fonction javascript / jquery. C'est possible?

J'ai essayé le code ci-dessous pour tester la fonctionnalité, mais cela ne fonctionnait pas (les éléments de la liste ne se présentaient pas du tout dans le html généré). Donc, je suis incertain si je gagne avec la syntaxe javascrit / spring / jsp ou si ce n'est tout simplement pas possible.

Voici le code:

Code de contrôleur:

@RequestMapping(value="/create_custobject.html",method = RequestMethod.GET) public ModelAndView showCreateCustObjectPage() { Map<String, Object> model = new HashMap<String, Object>(); CreateObjectForm form = new CreateObjectForm(); model.put("createObjectform", form); return new ModelAndView("create_custobject", model) ; } 

Code de formulaire:

 public class CreateObjectForm { private AutoPopulatingList<Criteria> ruleArray = new AutoPopulatingList<Criteria>(Criteria.class); public AutoPopulatingList<Criteria> getRuleArray() { return ruleArray; } public void setRuleArray(AutoPopulatingList<Criteria> ruleArray) { this.ruleArray = ruleArray; } public CreateObjectForm() {} } 

Code de critère:

 public class Criteria{ String attribute; String operator; //... constructor + getters and setters } 

Javascript / jquery code (sur la même page que jsp):

 <script type="text/javascript"> $(document).ready(function(){ //startup functionality var i = 0; document.getElementById("addCriteria").onclick = function() { $("#msgid").html("${ruleArray[i].attribute}"); ${ruleArray[i].attribute} = $('#attributeValue').val(); ${ruleArray[i].operator} = $('#operatorValue').val(); i++; } } 

Pour les éléments existants dans votre formulaire, utilisez jstl comme

 <c:forEach items="${form.items}" var="item" varStatus="status" > <span class="count" > <form:input path="items[${status.index}].field" /> 

Cela donnera une forme comme celle-ci

 <form id = "idform" > <span class="count" > <input name="items[0].field" id="items0.field" /> </span> </form> 

Alors vous simplement ajouter avec javascript nouvelle forme "lignes" avec des index correspondants

par exemple

  var is = $('.count').size() $('#idform span:last').after('<span class="count" ><input name="items[' + is + '].field"' + is + '.field" /></span>') 

Je pense que si vous utilisez Spring 3 + vous n'avez pas besoin d'utiliser AutopopulatingList, toute collection devrait être suffisante.

Votre mélange JSP EL et Javascript incorrectement. Vous ne pouvez pas utiliser le var i dans un Express Express JSP, c.-à-d. ${ruleArray[i].operator} . Je recommanderais d'utiliser JSTL pour itérer dans la liste et créer vos attributs dans le script.

À ce stade, votre script pourrait être configuré pour simplement utiliser un littéral de chaîne 0 dans l'expression. Je suppose que vous avez besoin de fonctionnalités plus robustes que cela, pouvez-vous décrire mieux.

 $(document).ready(function(){ document.getElementById("addCriteria").onclick = function() { $("#msgid").html("${ruleArray[0].attribute}"); //I assume you wanted to set the element to the value pulled from JSP EL $('#attributeValue').val(${ruleArray[0].attribute}); $('#operatorValue').val(${ruleArray[0].operator}); } } 

En utilisant JSTL, une solution ressemblerait à:

 <script> var criteria = []; <c:forEach var="criteria" items=${ruleArray}> criteria.push({attr:${criteria.attribute}, oper: ${criteria.operator}); </c:forEach> for(var i = 0; i < criteria.length; i++){ alert(criteria[i].attribute); } </script> 

Cette solution utilise essentiellement JSTL pour écrire Javascript. C'est peut-être une meilleure solution pour modifier votre contrôleur pour retourner JSON et simplement faire un appel Ajax sur le chargement de la page.

Dans la ligne suivante, vous faites référence à i dans votre code jsp, mais je ne suis pas défini:

 $("#msgid").html("${ruleArray[i].attribute}"); 

Le code javascript qui définit i est exécuté sur le client (c'est-à-dire le navigateur). Le code jsp est exécuté sur le serveur, avant que le html rendu soit envoyé au client.