使用javascript中的索引获取spring模型属性列表元素
很抱歉,如果有人在其他地方问过这个问题,但我已经环顾了四周,找到了一些答案,但不是一个完整的例子,我仍然对这个有疑问 因此,我将从Spring控制器向jsp添加一个自动填充列表,并希望在javascript/jquery函数中添加列表上的项目。可能吗 我尝试了下面的代码来测试功能,但没有成功(列表元素在生成的html中根本没有显示)。所以我不确定我是弄乱了javascrit/spring/jsp语法,还是根本不可能 代码如下: 控制器代码:使用javascript中的索引获取spring模型属性列表元素,java,javascript,jquery,spring,spring-mvc,Java,Javascript,Jquery,Spring,Spring Mvc,很抱歉,如果有人在其他地方问过这个问题,但我已经环顾了四周,找到了一些答案,但不是一个完整的例子,我仍然对这个有疑问 因此,我将从Spring控制器向jsp添加一个自动填充列表,并希望在javascript/jquery函数中添加列表上的项目。可能吗 我尝试了下面的代码来测试功能,但没有成功(列表元素在生成的html中根本没有显示)。所以我不确定我是弄乱了javascrit/spring/jsp语法,还是根本不可能 代码如下: 控制器代码: @RequestMapping(value="/cre
@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) ;
}
javascript/jquery代码(与jsp代码在同一页上):
$(文档).ready(函数(){
//启动功能
var i=0;
document.getElementById(“addCriteria”).onclick=function(){
$(“#msgid”).html(“${ruleArray[i].attribute}”);
${ruleArray[i].attribute}=$('#attributeValue').val();
${ruleArray[i].operator}=$('#operatorValue').val();
i++;
}
}
您的JSP EL和Javascript混合不正确。您不能在JSP表达式中使用变量i
,即${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>
var标准=[];
push({attr:${criteria.attribute},oper:${criteria.operator});
对于(变量i=0;i
此解决方案基本上使用JSTL编写Javascript。修改控制器以返回JSON并在页面加载时进行Ajax调用可能是更好的解决方案。您的JSP EL和Javascript混合不当。您不能在JSP表达式中使用
var i
,即${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>
var标准=[];
push({attr:${criteria.attribute},oper:${criteria.operator});
对于(变量i=0;i
此解决方案基本上使用JSTL编写Javascript。修改控制器以返回JSON并在页面加载时进行Ajax调用可能是更好的解决方案。在下面的一行中,您在jsp代码中引用了
i
,但未定义i:
$("#msgid").html("${ruleArray[i].attribute}");
定义
i
的javascript代码在客户端(即浏览器)上执行。在将呈现的html发送到客户端之前,jsp代码在服务器上执行。在以下行中,您在jsp代码中引用i
,但未定义i:
$("#msgid").html("${ruleArray[i].attribute}");
定义
i
的javascript代码在客户端(即浏览器)上执行。在将呈现的html发送到客户端之前,jsp代码在服务器上执行。对于表单中的现有项,请使用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添加带有相应索引的新表单“行”
比如说
var is = $('.count').size()
$('#idform span:last').after('<span class="count" ><input name="items[' + is + '].field"' + is + '.field" /></span>')
var is=$('.count').size()
$('#idform span:last')。对于表单中的现有项,在('之后使用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添加带有相应索引的新表单“行”
比如说
var is = $('.count').size()
$('#idform span:last').after('<span class="count" ><input name="items[' + is + '].field"' + is + '.field" /></span>')
var is=$('.count').size()
$('#idform span:last')。在('之后,即使此线程较旧并且回答正确,也为了其他初学者的利益,并解释实现删除添加行的逻辑
让我用名字、电子邮件、用户名和性别字段的简单代码和用户示例进行解释。
考虑到您正在从控制器发送usersList中的3个空用户,这将创建3个空行。现在您需要添加行并将添加的行动态绑定到modelAttribute
(对于最初的3行)如果您检查/查看页面源,您将看到
- 具有不同id的行(
标记
),如list0.firstName
list1.firstName
- 具有不同的名称的行(
标记
),如列表[0]。名字
列表[1]。名字
无论何时提交表单,服务器都不会考虑id(添加id仅用于帮助客户端验证),但名称属性将被解释为请求参数,并用于构造modelAttribute,因此在插入行时属性名称非常重要
添加行
那么,如何构造/追加新行呢?
如果我从UI提交6个用户,控制器应该从usersList接收6个用户对象。实现相同目标的步骤如下所示
1.右键单击->
查看页面源代码。您将看到这样的行(您可以在第一行看到*[0].
,在第二行看到*[1].
)
男性
女性
男性
女性
复制第一行并构造javascript字符串,并在中用变量名替换“0”