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

这是我的forms:

<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。 build议:在<h:form>包含必要的组件

如果我将<form action="j_security_check">更改为<h:form> ,它不会修复它,我必须将<h:form>放在<h:panelGrid>

这只是一个警告,不是一个错误 。 警告通常是通知开发者有关可能不会立即引起技术错误/问题的不可预见的情况/情况。 任何事情都可以完美地工作,但行为/结果可能不会像开发人员所期望的那样。 例如,新手开发者可能意外地使用了<form>而不是<h:form> 。 这样的警告是有帮助的。

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

但是,当窗体和input的子窗体之间还有另一个像panelgrid的组件时,它仍然会显示警告,这对我来说是一个bug。 我会把它报告给Mojarra家伙。 它看起来好像是在检查直接父母而不是所有的父母。 更新 :根据Mojarra 2.1.3 / 2.2已经修复,另见issue 2147 。

顺便说一下,Glassfish并不是特定的。 新的GF版本当然附带一个更新的Mojarra版本,其中有警告的实施。 另见问题1663 。

相关问题:

  • 表单组件在其祖先中需要有一个UIForm。 build议:在<h:form>中包含必要的组件

这是由PrimeFaces论坛的Oleg向我推荐的:

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

问候,布伦丹。

它只显示你是否在JSF开发基于你的网页configuration。

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

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

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

 <p:something .... 

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

我正在使用Mojarra 2.1.27,并发现这是我的错误。 但是很难find错误。 希望来自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窗口或调用堆栈窗口,找出它是由方法private com.unit.face.application.view.FormOmittedChecker方法调用的,这个方法以前是用方法调用的

公共静态无效检查(FacesContext上下文)。

在检查方法里面有参数variables组件。 您可以从Watch或variables窗口获取组件ID,然后将其追溯到您的HTML页面和代码。

这是一个困难的方式,但希望你能find问题的根源。 如果警告消息也显示有问题的组件ID,则会更简单