表单组件在其祖先中需要有一个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,则会更简单