2

我正在努力从我的 Struts2 Action 类中获取 JSON 响应,我想我遗漏了一些东西。我在我的项目中有以下设置。

在我的模块级操作定义中,配置如下:

<package name="customer" namespace="/" extends="struts-default,json-default">
   <action name="getCustomer" method="getCustomerBusiness" class="CustomerAction">
      <result type="json"/>
   </action>
</package>

在我的 Struts.xml 我有

 <result-types>
    <result-type name="json" class="org.apache.struts2.json.JSONResult"/>
 </result-types>

 <interceptors>
    <interceptor name="json" class="org.apache.struts2.json.JSONInterceptor"/>
 </interceptors>

在我的行动课上:

  public class CustomerAction extends ActionSupport implements ServletRequestAware,
        ServletResponseAware, ModelDriven {
    private List<CustomerBean> cpbeanList;

    public List<CustomerBean> getCpbeanList() {
        return cpbeanList;
    }

    public void setCpbeanList(List<CustomerBean> cpbeanList) {
        this.cpbeanList = cpbeanList;
    }

    public String getCustomerBusiness() {
        cpbeanList = new ArrayList<CustomerPortfolioBean>();
        // jsonData = new LinkedHashMap<String, Object>();
        CustomerBean cb1 = new CustomerPortfolioBean();
        cb1.setBusinessNm("IBM");
        cb1.setBusinessAddr("475 Anton Blvd");
        cb1.setBusinessPh("00000000");
        cb1.setBusinessCity("Costamesa");
        cb1.setBusinessStateCd("CA");
        c1.setBusinessZip("92704");

        similarly cb2, cb3, cb4.

        cpbeanList.add(cb1);
        cpbeanList.add(cb2);
        cpbeanList.add(cb3);
        cpbeanList.add(cb4);
        return SUCCESS;
    }

}

JSON请求http://localhost:8080/customer/getCustomer返回我空数组{}在萤火虫中......我能看到。

我也在尝试将输出作为 JQuery 中的数据表输入。因此没有行。

非常感谢任何人的帮助。

4

2 回答 2

2

您的动作的超类 implements ModelDriven,因此您的子类也是如此。它将被序列化为 JSON 的模型。如果模型为空,则没有要序列化的内容,因此您什么也得不到。

您的子类应该覆盖getModel()并返回您想要序列化为 JSON 的数据。

于 2011-11-08T02:45:35.773 回答
1

自从

  • ModelDriven拦截器将模型推送到ValueStack 的顶部
  • Json Result序列化整个动作

并且知道

  • Json Result有一个root参数,可以配置为将 Json 序列化限制为单个元素,而不是整个操作的属性
  • 参数root接受OGNL

我们可以假设它可以被指示倒退
限制更少(从模型驱动的角度来看),而不是像往常一样限制更多。

你可以尝试做类似的事情

<result type="json">
    <param name="root">
        [1]
    </param>
</result>

甚至更好(因为不能保证这[1]是行动)

<result type="json">
    <param name="root">
        #action
    </param>
</result>

发现是否真的可以序列化整个动作,同时将模型保持在 ValueStack 之上。

于 2016-01-28T11:07:32.253 回答