这是我的表格:
<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>
内。
答案 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)。
这是一个艰难的方式,但希望你能找到问题的根源。如果警告消息还显示有问题的组件ID
,则会更加简单答案 5 :(得分:0)
就我而言,此警告消息显示在p:messages
中,我已将其显示在对话框中以显示验证错误,因此我刚刚在severity="error"
中包含了p:messages
和警告消息不见了。