我有一个应用程序,它是单页Backbone.js应用程序和Struts2服务器生成的Web应用程序之间的混合。我知道这不是标准做法,但改变架构并不是我的能力。
应用程序在客户端中维护了一些Javascript模型并对它们进行了操作(这里究竟是什么无关紧要)。为了更改这些模型的属性,必须通过XHR调用基于Struts2的操作,并使用$.ajax
将模型POST到表单操作,并使用jquery将JSON转换为application/x-www-form-urlencoded
。这将返回表示表单的HTML片段,然后由用户填写该片段,然后使用该表单将其转换回模型
$('form').serializeArray()
和自定义转换步骤。到目前为止,这一直工作正常,但现在我们有可能包含数组的模型,例如像这样:
{
"name": "Jannik",
"contact_methods": [
{
"type": "mobile",
"phone_number": "+491...."
}, {
"type": "email",
"email": "jannik.jochem@..."
}
]
}
JQuery会将其转换为形成键值对,如下所示:
name=Jannik
contact_methods[0][type]=mobile
contact_methods[0][phone_number]=+491....
contact_methods[1][type]=email
contact_methods[1][email]=jannik.jochem@...
我现在希望能够使用Struts'来迭代contact_methods
中的条目。 taglib或JSP中可用的任何其他东西,但我无法弄清楚如何执行此操作。如果这是不可能的,那么改变JSON对象转换为键/值对的方式也是可以接受的。但请注意,嵌套对象可能具有不同的字段组合,因此仅将各个字段映射到数组参数将无法工作,因为数组索引会混乱。
有没有办法在Struts中实现这个目标?
编辑这里是代码(请注意,这是一个构造示例,因为由于机密性问题我无法在此处发布实际代码):
JSONTestAction
:
public class JSONTestAction extends ActionSupport {
}
jsontest.jsp
:
<%@page contentType="text/html" pageEncoding="UTF-8"%>
<%@ taglib prefix="s" uri="/struts-tags"%>
<b>Parameters:</b><br>
<pre>
<s:property value="#parameters"/>
</pre>
<b>Contact methods:</b><br>
<ol>
<s:iterator value="#parameters['contact_methods']">
<li><pre><s:property/></pre></li>
</s:iterator>
</ol>
Backbone视图片段:
var model = {
"name": "Jannik",
"contact_methods": [
{
"type": "mobile",
"phone_number": "+491...."
}, {
"type": "email",
"email": "jannik.jochem@..."
}
]
};
$.ajax({
url: contextRoot + '/properties_jsontest.action',
type: 'POST',
data: model,
success: function (data) {
var form = $('<form id="element-form" role="form"></form>');
form.appendTo(view.$el);
form.html(data);
}
});
结果如下:
Parameters:
{contact_methods[1][type]=[Ljava.lang.String;@5e2d7ab9, contact_methods[0][type]=[Ljava.lang.String;@7bd437fc, name=[Ljava.lang.String;@29a7c0e7, contact_methods[1][email]=[Ljava.lang.String;@4469930e, contact_methods[0][phone_number]=[Ljava.lang.String;@6f359f38}
Contact methods:
我想在JSP中迭代contact_methods
。