$ .getJson动作调用不是映射对象字段

时间:2014-12-25 13:08:05

标签: jquery jsp struts2 ognl struts2-jquery

我有一个名为example.jsp的jsp视图文件,当点击一个按钮时,调用了jquery方法:

$(document).ready(function() {
   $("#a_button").click(function() {
       var json_model== {
                   field1 : $("#a_textarea1").val(),
                   field2 : $("#a_textarea2").val(),
                   field3 : $("#a_textarea3").val(),
        };
       $.getJSON('AnAction', {
           model : json_model
       }, function(jsonResponse) {
           alert('jsonResponse here');
       });
   });
});

这是我的行动课:

public class ActionClass implements Action {

private Model model;

@Override
public String execute() throws Exception {return null;}

public String actionMethod() {
    System.out.println("Its Here");
    System.out.println(model.getField1()+" "+model.getField2()+" "+model.getField3()+" ");
    return SUCCESS;
}


public Model getModel() {
    return model;
}

public void setModel(Model model) {
    this.model = model;
}

}

这里是Model class:

public class Model {

private String field1;
private String field2;
private String field3;

public Model(String field1,String field2, String field3) {
    super();
    this.field1 = field1;
    this.field2 = field2;
    this.field3 = field3;
}

public String getField1() {
    return field1;
}
public void setField1(String field1) {
    this.field1 = field1;
}
public String getField2() {
    return field2;
}
public void setResult(String field2) {
    this.field2 = field2;
}
public String getField3() {
    return field3;
}
public void setField3(String field3) {
    this.field3 = field3;
}

}

我的struts.xml:

<action name="AnAction" class="controller.ActionClass" method="actionMethod">
     <result type="json">/example.jsp</result>
 </action>

当我点击按钮时,我的动作调用工作正常,我在服务器端控制台上看到其在这里文本。但是动作调用不会映射模型对象。我的意思是&#39;模型&#39;调用操作时为null。但是,当我将field1,field2和field3移动到ActionClass时,如下所示。但是我当然只想要Action Class中的模型对象。我怎样才能做到这一点。感谢您的所有建议。

//THIS IS WORKED VERSION OF ACTION CLASS
public class ActionClass implements Action {

private String field1;
private String field2;
private String field3;

@Override
public String execute() throws Exception {return null;}

public String actionMethod() {
    System.out.println("Its Here");
    System.out.println(field1+" "+field2+" "+field3+" ");
    return SUCCESS;
}


public String getField1() {
    return field1;
}
public void setField1(String field1) {
    this.field1 = field1;
}
public String getField2() {
    return field2;
}
public void setResult(String field2) {
    this.field2 = field2;
}
public String getField3() {
    return field3;
}
public void setField3(String field3) {
    this.field3 = field3;
}

}


//AND MY JQUERY METHOD WHICH IS COMPATIBLE WITH ABOVE
$(document).ready(function() {
   $("#a_button").click(function() {

       $.getJSON('AnAction', {
           field1 : $("#a_textarea1").val(),
               field2 : $("#a_textarea2").val(),
               field3 : $("#a_textarea3").val()
       }, function(jsonResponse) {
           alert('jsonResponse here');
       });
   });
});

2 个答案:

答案 0 :(得分:1)

您可以使用前缀为model.

的参数名称
var json_model = {
   "model.field1" : $("#a_textarea1").val(),
   "model.field2" : $("#a_textarea2").val(),
   "model.field3" : $("#a_textarea3").val(),
};
$.getJSON('AnAction', json_model, function(jsonResponse) {
       alert('jsonResponse here');
   });

该模型还需要一个默认构造函数

public Model() {}

所以你可以将它实例化为动作

private Model model = new Model();

在这些更改之后,params拦截器将能够在OGNL的帮助下填充model对象。并且因为您的模型属性只是字符串,所以它们将被设置而不会对参数进行任何可能的类型转换。

答案 1 :(得分:0)

感谢罗曼C.随着他的回应做了一些改变,它起作用了! 我与Roman C的反应的区别仅在于:

1)我没有在动作类中实例化模型对象。 2)我将所有'私人'访问修饰符更改为'公共'(否则,OGNL有问题)