加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 编程开发 > Java > 正文

playframework – POJO,JPA绑定和复选框

发布时间:2020-12-15 02:30:37 所属栏目:Java 来源:网络整理
导读:Play使用“未解决的参数被安全忽略.类型不匹配也被安全地忽略.”将参数绑定到POJO时.它大部分时间都很好用. 但这会导致复选框出现问题,因为未在参数列表中发送未选中的复选框. CRUD模块通过在复选框后面插入一个隐藏的输入字段来解决这个问题.这是有效的,因
Play使用“未解决的参数被安全忽略.类型不匹配也被安全地忽略.”将参数绑定到POJO时.它大部分时间都很好用.

但这会导致复选框出现问题,因为未在参数列表中发送未选中的复选框.

CRUD模块通过在复选框后面插入一个隐藏的输入字段来解决这个问题.这是有效的,因为Play只读取要绑定的两个相同参数中的第一个.

来自CRUD模块的源,显示一个复选框:

<input id="object_isInvoiceable" type="checkbox" name="object.isInvoiceable" />
<input type="hidden" name="object.isInvoiceable" value="false" />

另一种方法是不将复选框作为对象的成员传递,而是作为单独的参数传递.然后可以在Controller中捕获它并在那里设置object.member,如下所示:

<input id="object_isInvoiceable" type="checkbox" name="isInvoiceableExtraParamFromHell" />

并在控制器中:

public static void save(Event object,Boolean isInvoiceableExtraParamFromHell) {
    if(isInvoiceableExtraParamFromHell == null) {
        object.isInvoiceable = false;
    }
    else {
        object.isInvoiceable = true;
    }

    ... validation etc ...

    object.save();

    ... render etc ...
}

我不喜欢替代方案1,因为我如何确保在所有浏览器中正确发送参数的顺序.

我不喜欢替代2,因为如果我更改对象,我必须管理单独的参数并修改我的控制器方法.

有没有更好的方法来做到这一点?我是Play Framework的新手,所以我可能错过了一些注释或其他东西.

编辑:

我之前有点不清楚.问题不在于创建新对象时,我可以将其设置为默认为FALSE,如Codemwnci建议的那样.问题是绑定到现有的JPA对象时.

来自playframework tutorial:

You can automatically bind a JPA object using the HTTP to Java binding.

You can provide the user.id field yourself in the HTTP parameters. When Play finds the id field,it loads the matching instance from the database before editing it. The other parameters provided by the HTTP request are then applied. So you can save it directly.

在这种情况下,它不会将成员值设置为任何默认值.

例如,我已经有一个存储在数据库中的JPA对象,其isInvoiceable设置为TRUE.我将此对象渲染到模板.如果我现在取消选中该复选框,则不会发送参数,因此isInvoiceable仍然为true.

解决方法

对于新对象,您可以执行以下操作

如果您绑定POJO,那么只需在POJO中默认值就足够了.

例如

public class Event extends Model {

    public Boolean isInvoiceable = Boolean.FALSE;
    ...
    ...
}

对于现有对象,您可以对CRUD使用的主题进行略微修改,方法是对其执行JQuery onclick操作,以便复选框的值始终设置隐藏值,并且将此隐藏值映射到POJO.

所以,例如

<input id="object_isInvoiceable_checkbox" type="checkbox" name="ignoredformfield" />
<input id="object_isInvoiceable_formfield" type="hidden" name="object.isInvoiceable" value="false" />

<script>$("#object_isInvoiceable_checkbox").click(function(
    $("object_isInvoiceable_formfield").value("$("#object_isInvoiceable_checkbox").is(":checked")");
));</script>

注意:我没有检查过javascript代码,但是你明白了.

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读