如何用struts返回一个json数组?

时间:2016-02-29 22:30:41

标签: javascript json ajax regex struts2

这是我的struts动作

@Action("/trylogin")
@ParentPackage("json-default")
@Result(type = "json", params = { "includeProperties", "msg, productsList" })
public class Login extends ActionSupport {

    private static final long serialVersionUID = 1L;
    private String utilisateur;
    private String motdepasse;
    private String msg;
    private ArrayList<Article> productsList = new ArrayList<Article>();

    @Autowired
    private Dao dao;

    public String execute() {

        if (dao.validCredentials(utilisateur, motdepasse)) {
            System.out.println("USER FOUND");
            productsList = dao.fetchProducts();
            msg = "success";
        } else {
            System.out.println("ERREUR");
            msg = "error";
        }
        return ActionSupport.SUCCESS;
    }

public ArrayList<Article> getProductsList() {
    return productsList;
}

public String getMsg() {
    return msg;
}

这是我的ajax帖子:

$.post({
    url: "trylogin",                        
    data: {                                 
        utilisateur: name,
        motdepasse: password
    }       
}).done(function(data) {                
    console.log(data.productsList.length);
}).fail(function( jqXHR, textStatus ) {     
    console.log("Fail");
})

我想获取我的productsList。在我的Action中,列表已正确加载。但是,一旦我console.log(data.productsList)它就是空的。

如何从我的struts动作中获取productsList到我的javascript?

我的productsList是一个具有各种属性的对象列表,如name / id / color ...

2 个答案:

答案 0 :(得分:1)

您需要在允许的属性的白名单中列出Article的每个属性。

我们说文章有idnamecolor属性,配置如下:

@Result(type = "json", params = { "includeProperties", 
                                  "msg, 
                                   productsList\\[\\d+\\]\\.id,
                                   productsList\\[\\d+\\]\\.name,
                                   productsList\\[\\d+\\]\\.color"})

这就是为什么我更喜欢使用root object代替includeProperties,即使在您的情况下您需要找到一种方法来处理msg(可能可能是基于List的结果组成客户端。但是)。

答案 1 :(得分:1)

参数includeProperties是正则表达式列表。当你使用参数productsList时,json序列化程序只能找到这个属性,但是当进一步解析它的元素时,它们都不包括在内。如果将此参数与结果一起使用,则只有与表达式匹配的属性才会包含在json输出中。

您需要在json结果中配置includeProperties。例如

@Result(type="json", params = {"includeProperties", "msg,
  productsList\\[\\d+\\]\\.id,productsList\\[\\d+\\]\\.name,productsList\\[\\d+\\]\\.color"}) 

请注意,特殊字符是双重转义。