表单组件需要在其祖先中具有UIForm。建议:在<h:form> </h:form>中包含必要的组件

时间:2010-11-03 16:08:55

标签: forms jsf jsf-2

这是我的表格:

<form action="j_security_check">
    <h:panelGrid columns="2" bgcolor="#eff5fa" cellspacing="5" frame="box" styleClass="center">
        <h:outputLabel value="User ID:"/>
        <h:inputText id="j_username" tabindex="1" />
        <h:outputLabel value="Password:"/>
        <h:inputSecret id="j_password"/>
        <h:outputLabel value=""/>
        <h:commandButton id="login" value="Login"/>
    </h:panelGrid>
</form>

它适用于Glassfish 3.0.1,但是从Glassfish 3.1 b2开始,它在JSF页面中将此警告显示为FacesMessage

  

表单组件需要在其祖先中具有UIForm。建议:在<h:form>

中包含必要的组件

如果我将<form action="j_security_check">更改为<h:form>,则无法解决问题,我必须将<h:form>置于<h:panelGrid>内。

6 个答案:

答案 0 :(得分:44)

这只是警告而不是错误。通常会有警告通知开发人员可能不会立即导致技术错误/问题的不可预见的情况/条件。任何事情都可能完美无缺,但行为/结果可能不像开发人员所希望的那样。例如,新手开发者可能会意外地使用<form>代替<h:form>。这样的警告会有所帮助。

在您的特定情况下,由于需要提交到非JSF服务,您只是被迫使用<form>。您作为一个更有经验的开发人员知道它是合法有效的。你可以忽略这个警告。只有在javax.faces.PROJECT_STAGE设置为Development时才会显示此警告,而当设置为Production时,会显示此警告。

但是,当表单和输入子节点之间有另一个组件如panelgrid时,它仍会显示警告,对我来说是一个错误。我会向Mojarra家伙报告。看起来好像只检查直接的父母而不是所有的父母。 更新:根据Mojarra 2.1.3 / 2.2进行修复,另请参阅issue 2147

顺便说一句,这不是Glassfish的具体方式。较新的GF版本当然附带了更新的Mojarra版本,该版本已实施这些警告。另请参阅issue 1663

相关问题:

答案 1 :(得分:17)

这是由PrimeFaces论坛的Oleg向我建议并且有效:

<h:form id="login" prependId="false"
                onsubmit="document.getElementById('login').action='j_security_check';">

此致 布伦丹。

答案 2 :(得分:4)

它仅显示您是否基于Web配置进行JSF开发。

<context-param>
        <param-name>javax.faces.PROJECT_STAGE</param-name>
        <param-value>Development</param-value>
    </context-param>

当您将其更改为生产时,它将不再显示

答案 3 :(得分:3)

如果有人有一天会发现这个有用, 我有同样的错误,问题是我有primefaces组件

<p:something ....

并且该组件不在<h:form>元素

答案 4 :(得分:1)

我正在使用Mojarra 2.1.27并发现这是我的错误。然而,它很难找到错误是什么。希望Mojarra的某个人可以在警告消息中添加组件ID。 以下是我发现组件的方法:(也发布到https://code.google.com/p/primefaces/issues/detail?id=1586#c48

我通过下载Mojarra源代码并在方法中向com.sun.faces.context.FacesContextImpl类添加断点来跟踪它: public void addMessage(String clientId,FacesMessage message)。 当断点捕获时,打开Debugging窗口或调用堆栈窗口以找出它是由类调用的 com.sun.faces.application.view.FormOmittedChecker 在方法中 private static void addFormOmittedMessage(FacesContext context) 以前通过方法

调用

public static void check(FacesContext context)。

在check方法中有参数变量组件。 您可以从Watch或变量窗口获取组件ID,然后将其追溯到您的html页面和代码。

这是一个艰难的方式,但希望你能找到问题的根源。如果警告消息还显示有问题的组件ID

,则会更加简单

答案 5 :(得分:0)

就我而言,此警告消息显示在p:messages中,我已将其显示在对话框中以显示验证错误,因此我刚刚在severity="error"中包含了p:messages和警告消息不见了。