得到使用从JavaScript的索引的弹簧模型属性列表元素(getting a spring mod

2019-08-02 16:05发布

很抱歉,如果这已被要求在其他地方,但我都看了看周围,发现了一些答案,但没有一个完整的例子,我仍然在这一个疑问。

所以,我从我的春节控制器添加Autopopulating列表,我的jsp,我想我的JavaScript / jQuery函数里面的名单上添加项目。 可能吗?

我想下面的代码来测试功能,但它没有工作(列表中的元素没有在生成的html都显示出来)。 所以林不能确定,如果林搞乱与javascrit /春/ JSP语法,或者如果它仅仅是不可能的。

下面是代码:

控制器代码:

@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) ;

}

表单代码:

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() {}
      }

标准代码:

public class Criteria{

   String attribute;

    String operator;
       //... constructor + getters and setters
}

的JavaScript / jQuery代码(在同一页作为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++;            

      }
   }

Answer 1:

在您的形式使用JSTL现有的项目,如

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

这将使表单如

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

那么你只需用JavaScript新形式的“行”与coresponding指数增加

例如

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

我认为,如果你正在使用弹簧3 +你不需要使用AutopopulatingList,任何集合应该够了。



Answer 2:

你的JSP混合EL和Javascript不当。 你不能使用var i一个JSP expresssion内,即。 ${ruleArray[i].operator} 。 我会建议使用JSTL通过列表迭代和脚本中创建您的属性。

在这一点上你的脚本可以设置只使用一个字符串字面量0的表达式中。 我假设你需要比这更强大的功能,就可以更好地描述它。

$(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});           

     }
 }

使用JSTL的解决方案看起来是这样的:

<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>

该解决方案基本上使用JSTL编写JavaScript。 它可能是一个更好的解决办法来修改你的控制器返回JSON,只是做在页面加载一个Ajax调用。



Answer 3:

在下面的行你引用i在你的JSP代码,但没有定义我:

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

它定义了JavaScript代码i是在客户端(即浏览器)上执行。 该JSP代码在服务器上执行,之前呈现的HTML被发送到客户端。



文章来源: getting a spring model attribute list element using an index from javascript