【发布时间】:2011-07-16 12:32:06
【问题描述】:
我想在运行时动态包含 .xhtml 文件,您可能会这样称呼它 JSF 前端到实体级别的继承层次结构。我预计 总共有 100 x 30-50 行的 xhtml 文件,这些文件只会被加载 如果需要正确处理基础数据。一个典型的用例是 需要一两个 xhtml 文件来处理基础数据, 所以你可以想象我不想每次都加载完整的 100,它会 这样做是愚蠢的犯罪行为。
现在我知道关于这个话题有无休止的讨论,但是 经过无数小时的研究,我一无所获。我在用 莫哈拉 2.1.1.
在下面的示例中,我最初是 ui:include 一个“空”文件,一个带有 最少的内容(而不是 c:catch),然后单击一个命令按钮 将要包含的内容更改为 new.xhtml 并更新容器 ui:include with ajax。
new.xhtml 的内容显示在页面上,所以看起来不错。这 问题是我在 new.xhtml 中有一个 commandButton,当这个文件 动态包含 commandButton 将不起作用 - 操作例程 永远不会被调用。如果您使用 ui:include new.xhtml(而不是 #{bean.page}) 它工作正常。所以有几个问题:
- 还有其他人解决这个问题吗?
- 如果没有,还有其他方法吗?
- 为什么这么明显和有用的事情这么难做?
我今天玩了 jQuery load(),虽然我可以使用它来加载文件 有各种各样的问题。我要加载的文件将包含 PrimeFaces 对话框,当被 jQuery 加载时,对话框似乎瞬间闪现 消失之前在屏幕上,永远,进入深渊。其他人报告 没有任何 CSS 样式的组件。
谢谢。
编辑:我应该明确表示我希望进行动态加载而不是 只是导航到不同的页面是因为我只想使用 primefaces 对话框,根据底层的类型不同 数据。如果可能的话,这将是一种更简洁的方式。
index.xhtml
<?xml version='1.0' encoding='UTF-8' ?>
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<html xmlns="http://www.w3.org/1999/xhtml"
xmlns:h="http://java.sun.com/jsf/html"
xmlns:ui="http://java.sun.com/jsf/facelets"
xmlns:f="http://java.sun.com/jsf/core">
<h:head>
<title>Facelet Title</title>
</h:head>
<h:body>
<h:form>
<h:commandButton value="push" action="#{bean.doit}">
<f:ajax render="load"/>
</h:commandButton>
<br/>
<h:panelGroup id="load">
<ui:include src="#{bean.page}"/>
<ui:remove>
<ui:include src="new.xhtml"/>
</ui:remove>
</h:panelGroup>
</h:form>
</h:body>
</html>
新的.xhtml
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Strict//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd">
<html xmlns="http://www.w3.org/1999/xhtml"
xmlns:ui="http://java.sun.com/jsf/facelets"
xmlns:h="http://java.sun.com/jsf/html"
xmlns:f="http://java.sun.com/jsf/core">
<h:outputText value="new.xhtml"/>
<br/>
<h:commandButton value="inc" action="#{bean.inc}">
<f:ajax/>
</h:commandButton>
</html>
empty.xhtml
<html xmlns="http://www.w3.org/1999/xhtml"/>
Bean.java
import javax.faces.bean.ManagedBean;
import javax.faces.bean.RequestScoped;
@ManagedBean
@RequestScoped
public class Bean {
private String page = "/empty.xhtml";
public String doit() {
page = "/new.xhtml";
return null;
}
// getters & setters removed
}
【问题讨论】: