【发布时间】:2014-12-25 09:55:42
【问题描述】:
技术背景
我们正在使用 JSF 2.2 和 IBM WAS 8.5.5 开发 J2E 应用程序。
问题
我们开发了一个屏幕来加载不同的表单(12 种不同的表单,包括 Ajax 和其他子表单......)。我们希望能够使用“ui:include”标签在 Ajax 的模态框中动态加载表单。
不幸的是,与动态生成的表单相关联的操作没有被执行。
问题
- 之前有人遇到过这个问题吗?
- 你有解决问题的线索吗?
- 您知道在同一页面中加载动态表单的替代方法吗?
代码
我们构建了一个简单的示例来展示我们遇到的问题。
主页(片段)
<ui:composition template="/WEB-INF/templates/globalLayout.xhtml">
<ui:param name="context" value="publication"/>
<ui:define name="content">
<h:form>
<h:commandLink value="EDIT1"
action="#{test.edit()}" layout="block" >
</h:commandLink>
<h:commandLink value="EDIT2"
action="#{test.edit2()}" layout="block" >
</h:commandLink>
<ui:include src="#{test.page}"/>
</h:form>
</ui:define>
</ui:composition>
子页面 1(片段)
<h:outputText value="Page 1 "></h:outputText>
<h:commandLink value="EDIT1" action="#{test.edit()}" layout="block" >
</h:commandLink>
<h:commandLink value="EDIT2" action="#{test.edit2()}" layout="block" >
</h:commandLink>
子页面2(片段)
<h:outputText value="Page 2 "></h:outputText>
<h:commandLink value="EDIT1" action="#{test.edit()}" layout="block" >
</h:commandLink>
<h:commandLink value="EDIT2" action="#{test.edit2()}" layout="block" >
</h:commandLink>
托管 Bean
package com.myapp;
import java.io.Serializable;
import javax.faces.bean.ManagedBean;
import javax.faces.bean.ViewScoped;
@ManagedBean(name = "test")
@ViewScoped
public class TestManagedBean implements Serializable {
/**
*
*/
private static final long serialVersionUID = -3750906342500909173L;
private String page;
public void edit() {
page = "page.xhtml";
}
public void edit2() {
page = "page2.xhtml";
}
public String getPage() {
return page;
}
public void setPage(String page) {
this.page = page;
}
}
注意
使用“ui:fragment”元素是不可用的。对我们来说,生成页面需要将近一分钟,而使用完整的 ajax 大约需要 2.3 秒。 所以下面的例子不适合我们。
<ui:fragment rendered="#{index.page eq 'page2'}">
<ui:include src="page2.xhtml"/>
</ui:fragment>
【问题讨论】:
标签: ajax jsf jsf-2 dynamic-forms