【问题标题】:How can I present values of <h:selectManyCheckbox> in an input field?如何在输入字段中显示 <h:selectManyCheckbox> 的值?
【发布时间】:2013-03-13 21:22:09
【问题描述】:

我正在创建一个使用 jsf、html、java 和 JavaDB 的网站。我的一个页面将列出许多代表客户可以选择的菜单的图像。在页面底部有一个selectManyCheckbox 与图像对应的选项。当客户选择了菜单组合时,“订购”按钮将引导客户到下一页。在此页面上列出了有关客户的其他信息(从数据库中检索),例如:Customer numberContact name 等。除此之外,所选菜单应列在表中,并且列出的行数应与所选菜单的数量相同。我的主要问题是我想使用从selectManyCheckbox 收集的数据作为我在所选菜单字段中的输入,其余部分是从数据库中收集的(我已经完成并且它有效)。如何将值作为单独的值获取?我只能在输出文本中使用它们,而不是作为输入字段中的值。

Java 代码:

        @Named
        @RequestScoped
        public class OrderBean implements java.io.Serializable {
        private Set<String> menus = new TreeSet<String>();

        public Set<String> getMenus() { 
           return menues;
        }

        public void setMenus(Set<String> newValue){
           menus = newValue;
        }

        public SelectItem[] getMenuesItems(){
           return menuesItems;
        }

        private static SelectItem[] menuesItems = {
           new SelectItem("Menu 1"),
           new SelectItem("Menu 2"),
           new SelectItem("Menu 3")
        };
   }

JSF、HTML:

      <div class="clear"></div>
      <div id="frame">
        <div id="frameCheckBox"><h:commandButton value="#{mld.Order}" action="Order"/>
             <h:selectManyCheckbox value="#{orderBean.menus}">
                  <f:selectItems value="#{orderBean.menusItems}"/>
             </h:selectManyCheckbox>
        </div>
       </div>

【问题讨论】:

  • 你到底想达到什么目的?您已经在服务器端设置了 menues 中的选定值,那么您想用它做什么?
  • 我认为这里可能存在英语语言交流问题...您的意思是项目列表吗?还是用户真的购买了几个菜单(可能是为他们的餐厅...菜单是项目列表,通常带有价格和描述/照片)
  • 送货地址和日期由客户输入,但所选菜单的信息应从上一页收集并插入。然后将该信息作为注册给客户的订单发送并存储在数据库中。问题是我无法从 selectManyCheckbox 获取信息作为单个变量,在将其发送到数据库之前将其绘制到“总订单列表”中。我只能将它们作为输出(一次全部),但不能作为新字段的输入。也许我做的完全错误而且很麻烦。
  • 我的想法更像是一个数组。如果此人选择了三个选项中的两个,则行数为 2,然后我可以使用 .get(index) 来收集所选的 menu1 .get(1) 和 menu2 .get(2)。在发送订单之前为客户显示的表格中。但我真的很陌生,不知道如何实现这个功能。
  • 每个选定菜单应该是单独的行的原因是客户应该能够添加想要该菜单的人数(与多人开会的订单)并用于计算总价、运费和增值税。

标签: jsf facelets


【解决方案1】:

Set&lt;String&gt; 替换为List&lt;String&gt;String[],以便您可以在&lt;ui:repeat&gt; 的帮助下生成所需的输入组件,如下所示:

<ui:repeat value="#{orderBean.menus}" varStatus="loop">
    <h:inputText value="#{orderBean.menus[loop.index]}" />
</ui:repeat>

&lt;h:dataTable&gt; 一样,在即将到来的JSF 2.2 之前它不支持Set。另请注意,您确实需要通过列表/数组索引而不是通过&lt;ui:repeat var&gt; 引用输入值,原因很简单,String 是不可变的并且没有 setter 方法。

最后但并非最不重要的一点是,在处理表单提交期间,此构造将失败,因为您的 bean 是请求范围的,因此在将表单呈现给最终用户后直接被丢弃。将其放在更广泛的范围内,例如视图、对话或会话范围。否则 JSF 将无法在初始列表/数组中设置提交的值。

【讨论】:

  • 谢谢!我刚刚开始使用 JSF,方法及其方式还没有触手可及:P
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2023-03-06
  • 2020-07-05
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多