【问题标题】:How to set submitted values of <h:inputText> inside <ui:repeat> into map, set or list如何将 <ui:repeat> 中 <h:inputText> 的提交值设置为映射、集合或列表
【发布时间】:2013-08-13 07:50:01
【问题描述】:

我想知道是否可以将 &lt;ui:repeat&gt; 中的值推送到地图、集合或列表中?

我想将&lt;h:inputtext&gt; 的值传递给一个集合。

代码:

<ui:repeat var="_par" value="#{cmsFilterParameterHandler.normaleSuchParameter()}">

      <p:outputLabel value="#{_par.bezeichnung}" />
      <p:spacer width="5px" />
      <p:inputText id="me" value="#{??? push me to a set ???}"/>
      <br /><br />

</ui:repeat>

【问题讨论】:

    标签: jsf input-field uirepeat


    【解决方案1】:

    对于Set,这是不可能的,因为它不允许通过索引或键引用项目。但是,只需在输入值中指定列表索引和映射键,就可以使用 List 和 Map。


    List:

    private List<String> list; // +getter (no setter necessary)
    
    @PostConstruct
    public void init() { 
        list = createAndFillItSomehow();
    }
    
    <ui:repeat value="#{bean.list}" varStatus="loop">
        <h:inputText value="#{bean.list[loop.index]}" />
    </ui:repeat>
    

    使用Map(仅当您的环境为supports EL 2.2 or JBoss EL):

    private Map<String, String> map; // +getter (no setter necessary)
    
    @PostConstruct
    public void init() { 
        map = createAndFillItSomehow();
    }
    
    <ui:repeat value="#{bean.map.entrySet().toArray()}" var="entry">
        <h:inputText value="#{bean.map[entry.key]}" />
    </ui:repeat>
    

    应该注意的是,规范的方法是使用完全值得的 javabeans 的List。让我们假设一个名为Par 的Javabean 类具有id 和value 属性,它精确映射到DB 中的par 表,列id 和value:

    private List<Par> pars; // +getter (no setter necessary)
    
    @PostConstruct
    public void init() { 
        pars = createAndFillItSomehow();
    }
    
    <ui:repeat value="#{bean.pars}" var="par">
        <h:inputText value="#{par.value}" />
    </ui:repeat>
    

    无论哪种方式,在使用&lt;p:inputText&gt; 时效果都很好,它与 PrimeFaces 没有任何关系,它在这个问题的上下文中只是一个基于 jQuery 的 JSF UI 组件库。只需将h: 替换为p: 即可打开它。

    【讨论】:

    • 是否可以将值写入inputText 以及如何将该值写入支持的List(在第一种情况下)?我认为如果没有明确的“干净”getter 和 setter(clean = 没有附加参数),这是行不通的,不是吗?
    • 我完全不知道您所说的“将值写入inputText”是什么意思。你的意思是,你想保留/预填充一些默认值?只需相应地在createAndFillItSomehow() 中完成工作。创建new ArrayList&lt;&gt;()。在其中设置所需的项目,可以是 null 用于空输入,或 "foo" 用于预填充“foo”的输入。
    • 或者,您的意思是更新模型值? JSF 作为一个 MVC 框架已经自动地做到了。在命令链接/按钮的操作方法中,只需按通常的方式访问list 或map。提交的值已经在那里更新。从逻辑上思考,否则这个答案将毫无意义。
    • 是的,我想更新模型值 - 抱歉不准确。所以我用一个列表尝试了你的解决方案(它看起来比我下面的要好得多——这是一种解决方法,因为我无法按照你的方式去做),并在渲染输入字段期间得到了 IllegalArgumentException。所以我想我错过了另一点......
    • 为什么不详细介绍一下异常和堆栈跟踪?它们本身就是完整的答案。如果您无法解释异常,则不应将它们视为装饰而忽略它们,而应与我们分享。我们可以通俗地为您翻译。你知道,一旦一个问题被理解,解决方案就变得非常明显了。
    【解决方案2】:

    我不确定我是否正确理解了您的要求。 我想如下:您需要某个后端中的字符串列表和ui:repeat 标记来使用输入字段遍历这些字符串以编辑它们。也许有一些语法问题,但我的想法应该很清楚:

    public class Backend {
        private List<String> myStrings;
    
        public MyStringWrapper getMyStringWrapper(int index) {
            return new MyStringWrapper(index);
        }
    
        public class MyStringWrapper {
            private final int index;
            public MyStringWrapper(int index) { this.index = index; }
            public String getContent() { return myStrings.get(index); }
            public void setContent(String newContent) { myStrings.add(index, newContent); }
        }
    }
    

    在前端你使用如下:

    <ui:repeat var="_index" value="#{backend.getIndexSequence()}">
      <p:inputText value="#{backend.getMyStringWrapper(_index).content}"/>
    </ui:repeat>
    

    当然,您必须提供一个 getIndexSequence 方法,该方法会生成从 0 到字符串大小的整数列表。

    【讨论】:

    • 好吧,面对我使用 JSF 1.2 的事实(正如在上面的讨论中发现的 - 抱歉我没有提到它),它仍然是一种笨拙的方法吗?我需要没有额外参数的 getter 和 setter 方法。那么对于 JSF 1.x,如何改进呢?谢谢
    【解决方案3】:

    你的意思是这样吗?

    <p:inputText id="me" value="#{_par.input}"/>
    

    在 BackBean 中:

    public class Par implements Serializable {
    
    private String inputText;
    private String bezeichnung;
    
    public Par()
    {
    }
    
    public void setInput(String input)
    {
    this.inputText = input;
    }
    
    public String getInput()
    {
    return this.inputText
    }
    
    public void setBezeichnung(String bezeichnung)
    {
    this.bezeichnung = bezeichnung;
    }
    
    public String getBezeichnung()
    {
    return this.bezeichnung
    }
    
    }
    

    【讨论】:

    • 你好,问题是,如果变量_par中的项不止一项怎么办?因此,我需要一个集合或列表之类的东西。您所描述的仅存储单个字符串值。 (还是我误会了你?)
    • 好的,现在看看我的例子,如果 _par 是一个对象。这将工作
    • 好的,这确实是一个选择。但是为此,我必须将字段 inputText 持久化到我的数据库中。它不适用于瞬态对象。在这种情况下,_par 只是一个字符串值列表(如地图的键), inputText 应该是文档搜索的非持久值。任何想法。如果没有,我必须想出一个解决方法。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-11-29
    • 1970-01-01
    • 1970-01-01
    • 2020-07-22
    • 1970-01-01
    • 2021-12-09
    相关资源
    最近更新 更多