如何提供嵌套的JSON模型作为Struts2模板的输入?

时间:2015-03-19 09:36:32

标签: jquery json jsp struts2 url-encoding

我有一个应用程序,它是单页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

0 个答案:

没有答案