我必须验证h:inputText是否有值。因为我在该组件上使用required =“true”。它完成了这项工作并且有效,但随后发生了一些奇怪的事情。
当我将其留空时,会发生required =“true”。当我在inputText中键入一些文本时,不会发生required =“true”。当我在添加文本后删除文本时,发生了required =“true”,但之前输入的值重新出现在inputText中。
我真的不知道这可能是什么。请注意,当我说“required =”true“”发生时,我的意思是inputText的边框变为红色(参见代码)。
以下是代码:
<h:form id="generateLetterForm">
<h:panelGroup id="submitterPanel">
<h:panelGrid styleClass="rSplitPanel1" columns="1">
<e:inputText entityBB="#{entityBB}" type="#{type}"
property="submitterFirstName" />
<e:inputText entityBB="#{entityBB}" type="#{type}"
property="submitterLastName" />
</h:panelGrid>
<h:panelGrid styleClass="rOnePanel" columns="1">
<h:panelGroup>
<h:outputText value="#{AppMessages[type.concat('.address')]}"
styleClass="Fieldname" />
<h:panelGrid columns="3" cellpadding="2" cellspacing="0"
styleClass="Fieldcontent"
columnClasses="rAddressStreet, rAddressStreetNr, rAddressBoxNr">
<h:panelGroup>
<h:inputText id="submitterStreetName"
value="#{entityBB.entity.address.street}" required="true" styleClass="#{component.valid ? '' : 'addressError'}" />
<rich:tooltip target="submitterStreetName">
<h:outputText
value="#{AppMessages[type.concat('.submitterStreetName')]}" />
</rich:tooltip>
</h:panelGroup>
"2 other similar columns" (would make code to complex for the problem)
</h:panelGrid>
</h:panelGroup>
</h:panelGrid>
</h:panelGroup>
<a4j:commandButton value="#{AppMessages['general.action.save']}"
actionListener="#{entityBB.createStandardLetter()}"
render="generateLetterForm messages letterExistsPanel"
status="ajaxStatus" styleClass="floatRight"/>
</h:form>
编辑:前2个输入文本字段(e:inputText)是我自己的组件。没有什么不对。
支持bean是ViewScoped
答案 0 :(得分:1)
当您正确输入表单时,该值将存储在ViewScoped bean的属性中。然后,当您错误地输入表单时,“处理验证”阶段将抛出错误,这意味着不会执行“更新模型值”阶段,因此ViewScoped bean中的值仍然是您输入时输入的原始值。正确地形成,并且在渲染视图时重新显示此值。
答案 1 :(得分:0)
找到问题虽然没有修复,因为可能的修复(将context-param设置为false)可能不会发生。我猜这种行为可以被视为JSF中的一个错误?
在web xml中:
<context-param>
<param-name>javax.faces.INTERPRET_EMPTY_STRING_SUBMITTED_VALUES_AS_NULL</param-name>
<param-value>false</param-value>
</context-param>