如何从含Radio组件的ZK Listbox中获取数据并通过POJO持久化?
没问题,我来一步步帮你搞定这个需求,从定义数据模型到最终把数据存进数据库,咱们一步一步来:
1. 先定义存储每行数据的POJO类
首先得有个POJO来对应每行的Label值和Radio选中状态,用枚举来规范可选的Radio选项会更严谨,避免出现非法值:
public class RowData { // 单元格的Label文本 private String cellLabel; // 选中的Radio选项,用枚举限定可选值 private SelectedOption selectedOption; // 构造器,初始化Label并设置默认选中状态 public RowData(String cellLabel) { this.cellLabel = cellLabel; this.selectedOption = SelectedOption.NONE; // 默认未选中 } // 枚举定义三个Radio选项+未选中状态 public enum SelectedOption { OPTION1, OPTION2, OPTION3, NONE } // getter和setter方法 public String getCellLabel() { return cellLabel; } public void setCellLabel(String cellLabel) { this.cellLabel = cellLabel; } public SelectedOption getSelectedOption() { return selectedOption; } public void setSelectedOption(SelectedOption selectedOption) { this.selectedOption = selectedOption; } }
2. 配置Listbox和自定义ListitemRenderer
接下来在ZUL里定义Listbox,然后通过Renderer渲染每行内容,重点是给Radio绑定选中事件,让选中状态直接同步到对应的POJO里:
ZUL页面部分
<listbox id="dataListbox" model="${vm.rowDataList}" width="100%"> <listhead> <listheader label="标签列"/> <listheader label="选项列"/> </listhead> </listbox> <button label="保存到数据库" onClick="@command('saveData')"/>
自定义ListitemRenderer实现
public class CustomRowRenderer implements ListitemRenderer<RowData> { @Override public void render(Listitem item, RowData rowData, int index) throws Exception { // 渲染第一列的Label Listcell labelCell = new Listcell(rowData.getCellLabel()); labelCell.setParent(item); // 渲染第二列的三个Radio Listcell radioCell = new Listcell(); radioCell.setParent(item); // 同一行的Radio用同一个group,但不同行的group要唯一(避免跨行选中干扰) String radioGroup = "rowRadio_" + index; // 第一个Radio Radio radio1 = new Radio("选项1"); radio1.setGroup(radioGroup); radio1.setChecked(rowData.getSelectedOption() == RowData.SelectedOption.OPTION1); // 绑定选中事件,同步到POJO radio1.addEventListener(Events.ON_CHECK, event -> { Radio source = (Radio) event.getTarget(); if (source.isChecked()) { rowData.setSelectedOption(RowData.SelectedOption.OPTION1); } }); radio1.setParent(radioCell); // 第二个Radio Radio radio2 = new Radio("选项2"); radio2.setGroup(radioGroup); radio2.setChecked(rowData.getSelectedOption() == RowData.SelectedOption.OPTION2); radio2.addEventListener(Events.ON_CHECK, event -> { Radio source = (Radio) event.getTarget(); if (source.isChecked()) { rowData.setSelectedOption(RowData.SelectedOption.OPTION2); } }); radio2.setParent(radioCell); // 第三个Radio Radio radio3 = new Radio("选项3"); radio3.setGroup(radioGroup); radio3.setChecked(rowData.getSelectedOption() == RowData.SelectedOption.OPTION3); radio3.addEventListener(Events.ON_CHECK, event -> { Radio source = (Radio) event.getTarget(); if (source.isChecked()) { rowData.setSelectedOption(RowData.SelectedOption.OPTION3); } }); radio3.setParent(radioCell); // 把POJO绑定到Listitem,方便后续其他操作获取 item.setAttribute("rowData", rowData); } }
在ViewModel/Controller中初始化Listbox
@Wire private Listbox dataListbox; // 存储所有行数据的列表,作为Listbox的数据源 private List<RowData> rowDataList = new ArrayList<>(); @Init public void init() { // 初始化测试数据,实际可从数据库/接口加载 rowDataList.add(new RowData("第一行标签")); rowDataList.add(new RowData("第二行标签")); rowDataList.add(new RowData("第三行标签")); // 设置Renderer和Model dataListbox.setItemRenderer(new CustomRowRenderer()); dataListbox.setModel(new ListModelList<>(rowDataList)); }
3. 收集数据并保存到数据库
当点击保存按钮时,直接遍历rowDataList就能拿到每行的Label和Radio选中状态,再用你熟悉的数据库方式(JDBC/MyBatis/Hibernate等)保存:
保存方法示例(JDBC版)
@Command public void saveData() { String insertSql = "INSERT INTO your_table (cell_label, selected_option) VALUES (?, ?)"; try (Connection conn = DriverManager.getConnection("jdbc:mysql://localhost:3306/your_db", "user", "password"); PreparedStatement pstmt = conn.prepareStatement(insertSql)) { for (RowData row : rowDataList) { pstmt.setString(1, row.getCellLabel()); // 把枚举转成字符串存入数据库 pstmt.setString(2, row.getSelectedOption().name()); pstmt.addBatch(); } // 批量执行插入 pstmt.executeBatch(); Messagebox.show("数据保存成功!"); } catch (SQLException e) { e.printStackTrace(); Messagebox.show("保存失败:" + e.getMessage()); } }
关键注意事项
- Radio组唯一性:同一行的Radio用同一个group,不同行的group要加索引区分,不然会出现跨行只能选一个的问题。
- 数据同步:Radio的选中事件直接修改绑定的POJO属性,不需要额外去DOM里查找值,逻辑更清晰。
- 初始状态回显:渲染时根据POJO的
selectedOption设置Radio的初始选中状态,编辑已有数据时能正确显示之前的选择。
内容的提问来源于stack exchange,提问作者Arturo Amalfi
相关产品推荐
相关产品推荐

