如何在JSF中使用转换器和ajax更新字段

问题描述:

如果值当前为空或空,我基本上会显示两个输入字段。如果不是,我显示一个outputText。这两个值是存储在Long对象中的货币值,我使用转换器正确显示数据(由于我使用PrimeFaces 5.3,因此无法使用PrimeFaces的inputNumber)。我的问题如下:如何在JSF中使用转换器和ajax更新字段

<c:set var="edtVal1" value="#{bean.val1 ne null and bean.val1 ne 0}" scope="request" /> 
<c:set var="edtVal2" value="#{bean.val2 ne null and bean.val2 ne 0}" scope="request" /> 

<p:panelGrid> 
    <p:row> 
     <p:column colspan="2"> 
      <p:messages id="mainMessages" globalOnly="false" autoUpdate="true" showDetail="true" /> 
     </p:column> 
    </p:row> 
    <!-- [...] --> 

    <p:row> 
     <p:column styleClass="col-quarter col-label2"> 
      <h:outputText value="value 1" /> 
     </p:column> 
     <p:column styleClass="col-quarter col-value2" rendered="#{edtVal1}"> 
      <h:outputText id="val1Output" value="#{bean.val1}" converter="myConverter" /> 
     </p:column> 
     <p:column styleClass="col-quarter" rendered="#{not edtVal1}"> 
      <p:inputText id="val1Input" value="#{bean.val1}" converter="myConverter"> 
       <p:ajax update="mainMessages val1Input" event="change" /> 
      </p:inputText> 
     </p:column> 
    </p:row> 
    <p:row> 
     <p:column styleClass="col-quarter col-label2"> 
      <h:outputText value="value 2" /> 
     </p:column> 
     <p:column styleClass="col-quarter col-value2" rendered="#{edtVal2}"> 
      <h:outputText id="val1Output" value="#{bean.val2}" converter="myConverter" /> 
     </p:column> 
     <p:column styleClass="col-quarter" rendered="#{not edtVal2}"> 
      <p:inputText id="val1Input" value="#{bean.val2}" converter="myConverter"> 
       <p:ajax update="mainMessages val1Input" event="change" /> 
      </p:inputText> 
     </p:column> 
    </p:row> 
</p:panelGrid> 

当我这样说时,转换器引发的消息被显示,但没有任何字段被更新。然而,如果使用相同的布尔变量两个输入/输出选项(改变了1RST数据行中都使用edtVal2rendered属性中使用的变量),如下所示:

<p:row> 
    <p:column styleClass="col-quarter col-label2"> 
     <h:outputText value="value 1" /> 
    </p:column> 
    <p:column styleClass="col-quarter col-value2" rendered="#{edtVal1}"> 
     <h:outputText id="val1Output" value="#{bean.val1}" converter="myConverter" /> 
    </p:column> 
    <p:column styleClass="col-quarter" rendered="#{not edtVal1}"> 
     <p:inputText id="val1Input" value="#{bean.val1}" converter="myConverter"> 
      <p:ajax update="mainMessages val1Input" event="change" /> 
     </p:inputText> 
    </p:column> 
</p:row> 

成功的第一个字段的更新和第二次仍然不起作用。

使用转换器来显示格式化的数据是我已经完成的一种解决方法,它的工作方式与预期的一样,我使用的是与以前相同的转换器。但这一次,我不明白为什么它不起作用。

该转换器是重现问题的重要,但任何自定义转换器似乎做这项工作。

+0

你应该认真改进你的标题...阅读[问],它包含如何写一个好标题的建议。并阅读[mcve]和http://www.stackoverflow.com/tags/jsf/info – Kukeltje

+0

我同意这个问题很长,但它是最小的:我的问题有一个模糊的原因,我试图解决它2小时。我认为这个问题不值得赞成,特别是我尽量准确地提出问题。 – Sirmyself

+0

但是,仍然应该添加一些文本来解释第一个和第二个“panelgrid”之间的差异。现在是人们愿意帮助找到差异,它不是[mcve] ;-) – Kukeltje

任何其他解决方案仍然欢迎这个职位,但我设法找到一个有效的解决方案:

当我改变了rendered属性常量字符串,这个问题是不存在的。所以我认为这个问题来自于误解<c:set>

我的解决方案是使用一个bean作为控制器。我将变量从xhtml文件更改为控制器中的属性,现在一切正常。所以我从我的xhtml中删除了所有<c:set>,并在该页面上使用适当的MVC模式。


注:
对于那些谁不知道什么MVC是:它是明确划分的用户界面和操作数据整齐的架构模式。了解更多信息on wikipedia