【问题标题】:Why is the Validator not called?为什么不调用验证器?
【发布时间】:2011-12-09 12:54:18
【问题描述】:

在我的申请中,我有以下表格

<h:form id="addItemForm" enctype="multipart/form-data">                      
    <h:panelGrid columns="3" border="1">
        <h:outputText value="Name: " />
        <h:inputText label="name" 
                     id="name" value="#{addItem.name}" 
                     required="true" requiredMessage="Name is required." />
        <h:message styleClass="errorMsg" for="name" />

        <h:outputText value="Description: " />
        <h:inputText label="description" 
                     id="description" value="#{addItem.description}" 
                     required="true" requiredMessage="Description is required." />
        <h:message styleClass="errorMsg" for="description" />

        <h:outputText style="font-weight: bold" value="Picture : " />
        <t:inputFileUpload label="picture" 
                           id="picture" value="#{addItem.picture}" 
                           required="true" requiredMessage="Picture is required." />
        <h:message styleClass="errorMsg" for="picture" />

    </h:panelGrid>
    <h:commandButton value="Confirm" actionListener="#{addItem.addItem}"/>
    <h:outputText id="status" value="#{addItem.statusMsg}" />
</h:form>

如果我输入描述并将名称留空,然后单击“确认”按钮,则不会看到缺少名称的任何错误消息。一件奇怪的事情是我的页面似乎被刷新了,因为我输入的任何描述都消失了。此外,即使我输入了名称和描述,也从未调用过 actionListener 中的 addItem 函数。

昨天,一切正常。如果有人能告诉我我在这里可能做错了什么,我将不胜感激。

【问题讨论】:

  • 您必须使用 ajax (&lt;f:ajax) 让您的命令按钮不刷新页面。并尝试将您的form 更改为&lt;h:form id="addItemForm" prependId="false"。
  • “刷新”是指在我点击确认按钮后,它看起来像是一个全新的请求,与之前的请求完全无关。我的 ManagedBean 在 ViewScope 中,这意味着即使我没有输入名称,我输入的描述也应该在这里。
  • 但是如果验证失败,那么Update Model Values 阶段将被转义,对吧?
  • 其实不是,“应用请求值”阶段发生在“验证”阶段之前。因此,即使我没有通过验证阶段,我输入的任何内容都应该可用。

标签: java validation jsf jsf-2


【解决方案1】:

删除enctype="multipart/form-data"。 JSF 没有对它的原生支持。 JSF 依赖提交的请求参数以 application/x-www-form-urlencoded 的形式提供,这已经是默认的表单编码。您的表单中也没有任何 &lt;input type="file"&gt; 字段(既不是普通字段,也不是由第 3 方 JSF 组件表示),因此您根本不需要 multipart/form-data 编码。

也许它以前工作过,因为您有一个由某个 3rd 方组件库提供的过滤器,它解析并准备 multipart/form-data 对 JSF 的请求,但是您已将其从您的 web.xml 中删除,或者您没有将其包含在您的新组件中项目。


更新:您编辑了问题以包含&lt;t:inputFileUpload&gt;。好的,你应该保留enctype="multipart/form-data"。根本没有提交表单的唯一原因可能是 ExtensionsFilter 已从 web.xml 中删除或无法初始化。添加它和/或阅读 webapp 启动日志。它负责将multipart/form-data 请求解析为JSF 可用的参数。另一个可能的原因是您将多个 &lt;h:form&gt; 组件相互嵌套,这会生成无效的 HTML。另见commandButton/commandLink/ajax action/listener method not invoked or input value not updated。

【讨论】:

  • 实际上,我确实有一个文件输入字段,我试图缩短我的代码,这样人们就不必阅读太多。非常感谢你的帮助!您在 JavaEE 方面真的很有经验。当我将我的代码与存储库中朋友的代码合并时,我忘记更新 web.xml。因此,我丢失了过滤器和过滤器映射设置。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2011-02-18
  • 2013-10-30
  • 1970-01-01
  • 2017-07-03
  • 2016-11-13
  • 1970-01-01
相关资源
最近更新 更多