通过ajax发布表单并在play框架java中获取表单对象

Post form via ajax and get a form object in play framework java

提问人:codegasmer 提问时间:8/17/2015 最后编辑:Ignacio Aracodegasmer 更新时间:4/24/2018 访问量:2464

问:

我正在使用 play 框架 2.3.8 java 并使用 ajax 提交表单,但我无法从该请求中获取 Form 对象。我的问题解释如下。 我有一个模型

@Entity
public class Permission {
    @Id
    @Column(name = "id", nullable = false)
    @GeneratedValue(strategy = GenerationType.AUTO)
    private Long id;

    private String per1= "off";

    private String per2= "off";

    // getter setters
}

我的表格

<form id="form-permission">
    <!--Setting "on" and "of" value from js-->
    <input type="checkbox" id="per1" name="per1">
    <input type="checkbox" id="per2" name="per2">
    <input type="submit" >
</form>

$('#form-permission').on('submit',function(){
    var uid=// id to update

    myJsRoutes.controllers.MyController.updatePer(uid).ajax({

    data : $("#form-permission").serialize(),
        success : function(data) {
            console.log(data);
    });
    return false;
});

在没有ajax的情况下提交表单时,播放将请求数据的绑定绑定到模型对象,我们可以得到Form object

Form<Permission> permissionFormData = Form.form(Permission.class).bindFromRequest();

我们可以通过以下方式获取对象,因为对于带有 ajax 和没有 ajax 的 post 表单的请求是相同的 在ajax的情况下,我正在做同样的事情,但是当我尝试从中获取实体成员时,给了我一个无值异常permissionFormData.get()

Logger.info("---Permission one is "+permissionFormData.get().getPer1());

我在这里做错了什么?在使用 ajax 时,是否有任何其他方法可以从表单中获取对象。我想要这里的对象而不是 JSON,因为最后我用 JSON 持久化了对象,我必须迭代它的所有键值并创建一个对象。

编辑:当我尝试简单的ajax时,它给了我同样的异常

$("#form-permission").on('submit', function() {
    var $this = $(this);
    var uid=//some uid
    $.ajax({
        url: '/account/permission?id='+uid,
        data: $this.serialize(),
        type: 'POST'
    });
    return false;
});

我目前使用的方法是从 ajax 请求传递 json,在我的控制器中,我确实从实体对象转换 JSON,但我只想知道为什么 AJAX 请求的行为与普通表单提交不同,即为什么当两个请求属于同一类型时,我无法从请求中获取实体。Json.fromJson()

提前致谢。

java jquery ajax forms playframework

评论

0赞 adis 8/18/2015
您是否看到所有正确的值都使用 Ajax 发布?您可以使用 Web 开发人员工具进行检查,例如在 Chrome 中...
0赞 codegasmer 8/18/2015
@adis是的,我检查了变量,我可以看到它从 chrome inspect 元素中的请求传递per1
0赞 Gyan 8/26/2015
从开发工具的“网络”面板?对于Firefox来说,它是Net面板。它将显示您的差异,如果您的 AJAX 和 html 提交之间存在差异。你说你得到了 per1 变量值。还有其他区别吗?任何标题?您应该展开发布到控制器的请求,然后比较这两个请求。

答:

0赞 Igbalajobi Jamiu 8/20/2015 #1

第 1 步:将所有私有属性重命名为 public,并删除 getter 和 setter 方法。 例如

private String per1= "off"; to public String per1= "off";

第2步。确保您的文件是请求routeGET

第 3 步。尝试使用基本的 Jquery ajax 来测试运行。

$("#form-permission").on('submit', function() {
   var $this = $(this);
   $.ajax({
     url: '/url/to/controller',
     data: $this.serialize(),
     type: 'GET'
   });
   return false;
});

您始终可以在方便时从 GET 更改为 POST,请确保将 JQuery 和 html 表单方法更改为 POST 值,并且您的 Playframework 将文件路由到 POST。

希望这有效!

评论

0赞 codegasmer 8/25/2015
我正在按照您的建议使用您的代码尝试 POST 方法,但它给了我相同的无值异常
0赞 Gyan 8/26/2015
为什么指定的访问权限应该从私有更改为公共并删除 getter/setter 有什么特殊原因吗?
0赞 Igbalajobi Jamiu 8/26/2015
@Gyanapriya有数百种方法可以解决问题。
0赞 Igbalajobi Jamiu 8/26/2015
@codegasmer您的控制器代码,请您粘贴此代码行。
0赞 Gyan 8/27/2015
@IgbalajobiJamiu -- 是的,当然。我试图理解删除 getter 和 setter 并使用公共成员的作用。
0赞 Gyan 8/26/2015 #2

好吧,您正在寻找的另一种方法,您希望在服务器端使用对象而不是 Json——
您始终可以反序列化它。 像 gsonfasterxml json 这样的工具就在那里,你应该研究一些东西。这样,在创建要保留的实体时无需额外工作。
HTH。

评论

0赞 codegasmer 8/26/2015
好吧,我目前使用的方法是从 ajax 请求传递一个 json,在我的控制器中,我确实从实体对象转换了 json,但我只想知道为什么 AJAX 请求的行为与普通表单提交不同,即为什么我无法从请求中获取实体Json.fromJson()