【问题标题】:How to call bean method when clicking on a checkbox单击复选框时如何调用bean方法
【发布时间】:2012-05-24 15:02:26
【问题描述】:

当我单击复选框时,从 bean 调用 selectAll Java 方法的适当方法是什么?

<f:facet name="header">
      <h:selectBooleanCheckbox  binding="#{bean.selectAll}" onclick="highlight(this)" class="checkall"/>
</f:facet>

binding 不工作。我只想执行这个Java方法中的代码。

编辑

private HashMap<String, Boolean> selected = new HashMap<>();
public void selectAll() throws Exception {

        String SqlStatement = null;

        if (ds == null) {
            throw new SQLException();
        }

        Connection conn = ds.getConnection();
        if (conn == null) {
            throw new SQLException();
        }

        SqlStatement = "SELECT ID FROM ACTIVESESSIONSLOG";

        PreparedStatement ps = null;
        ResultSet resultSet = null;
        int count = 0;

        try {
            conn.setAutoCommit(false);
            boolean committed = false;
            try {
                ps = conn.prepareStatement(SqlStatement);
                resultSet = ps.executeQuery();
                selected.clear();

                while (resultSet.next()) {

                    selected.put(resultSet.getString("ID"), true);
                }
/*
                for (Map.Entry<String, Boolean> entry : selectedIds.entrySet()) {
                    entry.setValue(true);
                }

*/                conn.commit();
                committed = true;
            } finally {
                if (!committed) {
                    conn.rollback();
                }
            }
        } finally {
            ps.close();
            conn.close();
        }
    }

【问题讨论】:

    标签: java jsf jsf-2


    【解决方案1】:

    使用&lt;f:ajax&gt; 发送ajax 请求。

    <h:selectBooleanCheckbox value="#{bean.selectAll}" onclick="highlight(this)" class="checkall">
        <f:ajax listener="#{bean.onSelectAll}" render="@form" />
    </h:selectBooleanCheckbox>
    

    private boolean selectAll;
    
    public void onSelectAll(AjaxBehaviorEvent event) {
        // If you're using a boolean property on the row object.
        for (Item item : list) {
            item.setSelected(selectAll);
        }
    
        // Or if you're using a Map<Long, Boolean> on item IDs
        for (Entry<Long, Boolean> entry : selected.entrySet()) {
            entry.setValue(selectAll);
        }
    }
    
    public boolean isSelectAll() {
        return selectAll;
    }
    
    public void setSelectAll(boolean selectAll) {
        this.selectAll = selectAll;
    }
    

    理想情况下,该 bean 应由 @ViewScoped 放置在视图范围内,以使其在同一视图上的 ajax 请求中保持活动状态。

    除非您有非常好的理由,否则不要将binding 用于bean 属性。它旨在将整个 UIComponent 绑定到允许动态组件操作的 bean,但通常有更简单且不那么突兀的方法。

    【讨论】:

    • 谢谢!我可以再问你一个问题:当我选中复选框时,代码有效。但是当我取消选中复选框时,如何调用Java方法uncheckAll
    • 只要检查 onSelectAll() 方法中 selectAll 的值,如果它是 truefalse。我用onSelectAll() 方法的示例实现编辑了答案。希望这已经足够自我解释了。
    • 我正在使用稍微不同的方法。我想在我的情况下我必须更改布尔值?如果我可以调用第二个 java 方法来更改 hashmap 值,那就容易多了。
    • 是的,将其更改为selectAll 的值。然而,所有这些数据库交互逻辑都很奇怪。您应该已经掌握了物品清单。项目列表应该已经加载到视图范围托管 bean 的(后)构造函数中。
    • 我使用延迟加载。没有 SQL 语句和 hashmap 就不可能拥有所有 ID。
    猜你喜欢
    • 1970-01-01
    • 2012-09-08
    • 1970-01-01
    • 1970-01-01
    • 2014-01-19
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-04-05
    相关资源
    最近更新 更多