我有一个JSF页面,我需要允许用户动态创建表单并从同一页面提交在此表单中输入的数据。
我采用了两种设计方法来实现它,但它们都没有完全发挥作用。
方法1:我在JSF页面上放置了一个p:panel组件,作为动态表单的容器,并将其绑定到我的支持bean。另外,我放置了commandButtons来在页面和这些按钮的动作处理程序中添加表单元素,我放置了将特定UIComponents添加到面板UI组件的逻辑。这些动作处理程序的结果,我设置为faces-redirect = true的同一页面。 结果:动态显示正确,但此动态表单的提交按钮始终仅适用于第二次单击。
方法2:我在JSF页面上放置了一个p:面板组件,作为动态表单的容器。在此面板中,我使用ui:include包含生成的JSF页面。与之前的方法类似,在命令按钮的动作处理程序中添加表单元素,我生成要包含的JSF页面。这些动作处理程序的结果,我设置为faces-redirect = true的同一页面。 结果:在完成操作处理程序执行和页面呈现后,不会立即显示生成的JSF页面。在手动页面刷新2或3次后,将显示生成的JSF页面。
我想,我没有采用正确的设计来达到我的要求。你能否告诉我这两种方法或其他方法都有问题。
我正在使用PrimeFaces和Tomcat 7.0.27。
祝你好运, 阿南德。
答案 0 :(得分:1)
我一直在使用Glassfish上的PrimeFaces 3.3在JSF 2.2中开发单页管理应用程序。您应该能够使用托管bean和ajax处理所有动态表单需求。确保您的提交表单bean是ViewScoped。我的大多数JSF问题都与范围有关。每个表单标记都应该有一个目的。这是我用于FORM页面的结构。
<html xmlns="http://www.w3.org/1999/xhtml"
xmlns:h="http://java.sun.com/jsf/html"
xmlns:p="http://primefaces.org/ui"
xmlns:f="http://java.sun.com/jsf/core">
<h:head>
</h:head>
<h:body>
<h2>
FORM ONE
</h2>
<h:form>
<p:panel> or <p:panelGrid>
</h:form>
<h2>
FORM TWO
</h2>
<h:form>
<p:panel> or <p:panelGrid>
</h:form>
</h:body>
BalusC是JSF的王者,这里是他关于这个主题的相关条目。
http://balusc.blogspot.com/2011/09/communication-in-jsf-20.html#ManagedBeanScopes
http://balusc.blogspot.com/2010/06/benefits-and-pitfalls-of-viewscoped.html
您使用的是JSF 1.2还是2.x?
http://balusc.blogspot.com/2006/06/communication-in-jsf.html