当前位置: 首页 > 知识库问答 >
问题:

如何将SelectManyCheckbox与两个ArrayList一起使用?-原始表面

滑乐逸
2023-03-14

我试图实现 ,但没有成功。

现在我有了以下架构:

Course - have many Disciplines
Discipline - belongs to none, one or many Courses.

course类中,我有两个arraylist :

public class CourseMBean{

    (...)
    // Stores all disciplines
    private static ArrayList<Discipline> allDisciplines;

    // Stores only the disciplines that's already associated with this course.
    private static ArrayList<Discipline> courseDisciplines;

    (get and set for the arraylists)
    (...)
}

我希望在复选框中显示所有学科,并且希望当用户选择一个复选框时,将该复选框的对象学科添加到CourseDrimescies中-当取消选择一个复选框时,从CourseDiciplines中删除该学科。

我的JSF2.0代码如下:

<p:selectManyCheckbox id="disciplines" value="#{courseMBean.allDisciplines}" layout="grid" columns="2">                                          
     <f:selectItems value="#{courseMBean.courseDisciplines}" />
</p:selectManyCheckbox>

这实际上显示了没有任何选中复选框的所有纪律,什么是正确的。但是当我选择一些复选框并提交表单时,我会尝试打印CourseDridgeses中的元素,而这在控制台中并不显示任何内容。

我做错了什么?

共有1个答案

东门文斌
2023-03-14

当我选中一些复选框并提交表单时,我会尝试打印CourseDridges中的元素

由于CourseDridges实际上表示可用项而不是选定项,因此您似乎误解了UISElectManyUISElectItem(s)组件的一些基本概念。

(来自UISelectItem(s)系列)表示可用项。正是那些显示在UI中并且最终用户必须从中选择的项目。

value属性(来自UISelectmany系列,如 )表示(预先)选定的项目。如果在首次显示窗体时该值为空或空,则未预选任何内容。或者如果其中包含一些预选项,则只会预选equal()的可用项。

当最终用户更改UI中的选择并提交表单时,所有选择的项都将在UISelectMany组件的value属性中结束。UISelectItem(s)保持不变。

下面是一个基本的起始示例:

<p:selectManyCheckbox value="#{bean.selectedItems}">
    <f:selectItems value="#{bean.availableItems}" />
</p:selectManyCheckbox>
<p:commandButton value="Submit" action="#{bean.submit}" />
<p:messages autoUpdate="true" />
private List<String> selectedItems; // +getter +setter
private List<String> availableItems; // +getter (no setter necessary!)

@PostConstruct
public void init() {
    availableItems = new ArrayList<String>();
    availableItems.add("one");
    availableItems.add("two");
    availableItems.add("three");
}

public void submit() {
    System.out.println("Selected items: " + selectedItems);
}

(所有其他 组件的工作方式完全相同)

当出现像纪律这样的复杂Javabean对象时,您需要确保有一个转换器,以便JSF能够在它和String之间进行适当的转换,用于生成的HTML输出和HTTP请求参数(HTML和HTTP既不能传递也不能保存Java对象,而只能保存Java中由String表示的字符序列)。

这也许是你的根本问题。您说提交时不会将任何内容打印到控制台。但如果整个submit()方法实际上从未被调用,也可能是好的。你在这件事上不够明确。如果整个action方法确实从未被调用(即调试断点没有命中,或者控制台中从未显示另一个system.out.println()打印静态字符串),那么实际上很可能是一个转换错误。如果您正确地使用了 ,或者注意了关于排队但未显示的faces消息的服务器日志,那么您应该已经注意到了。

在这种情况下,您需要实现一个转换器纪律字符串之间进行转换。

@FacesConverter(forClass=Discipline.class)
public class DisciplineConverter implements Converter {

    @Override
    public Object getAsObject(FacesContext context, UIComponent component, String submittedValue) {
        // Write code here to convert from String to Discipline.
    }

    @Override
    public String getAsString(FacesContext context, UIComponent component, Object modelValue) {
        // Write code here to convert from Discipline to String.
    }

}

DB ID通常用作string表示形式。另请参阅本答案的“作为选定项的复杂对象”一节中的一个相关问题:如何从数据库中填充h:selectonemenu的选项?

 类似资料:
  • 问题内容: 这是课程: 现在,我试图从类中“反射”此方法: 问题答案: 只有一个。 另一种选择是。 其他原语也是如此。

  • 我有一个upsert需求,所以我需要调用postgres存储过程或使用公共表表达式。我还将pgcrypto扩展用于密码,并希望使用postgres函数(例如“crypt”来编码/解码密码)。 但是我找不到让ecto部分或全部使用原始sql的方法,是不是打算让ecto只支持长生不老的dsl,而不允许在dsl不够用的情况下使用原始sql? 我发现我可以通过适配器进行查询(Rocket是应用程序的名称)

  • 我目前正在构建一个Android议程活动,其中包括4个列表视图。基本上,我在AgendaDataReady(数组列表约会)上得到了由Web服务协调员调用的方法。此方法对约会进行排序,这样,将填充 4 个新的 ArrayList。代码如下: 这段代码工作正常,但是我不想再使用android了。R.layout.simple_list_item_1布局。所以我构建了一个自定义布局的ArrayAdapt

  • 注:[2017年1月11日]RestInfoAdapter.java的源代码已经更改和更新(参见下面的第2项) 我一直在尝试通过保留原始输入列表的备份/副本来使我的搜索视图返回到原始列表。但是,它根本不起作用。我的这个问题包括使用自定义类的RecyclerView和ArrayList。 是一个名为<code>RestInfo 我是如何尝试的 适配器类,以便RestInfo可以呈现在卡片视图中(因此

  • 我在Ubuntu 14.04中安装了phpbrew以使用PHP5.4。它工作得很好,但当我尝试使用composer时除外,composer会忽略phpbrew并安装与PHP5.5相关的依赖项。 有没有办法强制composer与phpbrew config兼容?我试图在我的作曲家中添加:php:“5.4”。json,但是它说这个要求在我的php版本中是不可能的。

  • 我是Micronaut框架的新手,我正在尝试使用entitymanager创建我的存储库。我这样创建了我的存储库 我使用这个类实现接口并注入entitymanager 问题是我一直有这个错误: PS:我已经启用了注释处理