我遇到了JSF测试应用程序和PrimeFaces组件的问题,但找不到错误。
我开始使用由
定义的模板文件(layoutTempl.xhtml)....
<h:body>
<p:layout fullPage="true" >
<p:layoutUnit position="north" size="95" >
<ui:insert name="menubar" >
MenuBar
</ui:insert>
</p:layoutUnit>
<p:layoutUnit position="west" resizable="false" size="250">
<ui:insert name="tree" >
ProjectTree
</ui:insert>
</p:layoutUnit>
<p:layoutUnit position="center">
<ui:insert name="main" >
MainContent
</ui:insert>
</p:layoutUnit>
<p:layoutUnit position="south" size="45">
<ui:insert name="footer" >
Footer
</ui:insert>
</p:layoutUnit>
</p:layout>
</h:body>
....
此模板用于两个页面(indexContent.xhtml):
....
<body>
<ui:composition template="./layoutTempl.xhtml">
<ui:define name="menubar">
MenuBar
</ui:define>
<ui:define name="tree">
Project Tree
</ui:define>
<ui:define name="main">
<ui:include src="index.xhtml"/>
</ui:define>
<ui:define name="footer">
Footer
</ui:define>
</ui:composition>
</body>
....
和(abcContent.xhtml):
....
<body>
<ui:composition template="./layoutTempl.xhtml">
<ui:define name="menubar">
MenuBar
</ui:define>
<ui:define name="tree">
Project Tree
</ui:define>
<ui:define name="main">
<ui:include src="abc.xhtml"/>
</ui:define>
<ui:define name="footer">
Footer
</ui:define>
</ui:composition>
</body>
....
包含的文件index.xhtml包含:
....
<h:body>
<ui:composition >
Hello from BareTest
<br /><br />
<h:form id="myform">
<p:selectOneMenu id="scroll2"
value="#{listTestBean.selectedMyObject}" >
<f:selectItems value="#{listTestBean.myObjects}"/>
<p:ajax event="change" listener="#{listTestBean.valueChanged}"/>
</p:selectOneMenu>
<br/><br/>
</h:form>
</ui:composition>
</h:body>
....
而abc.xhtml包含:
....
<h:body>
<h2>We got at abc page!</h2>
<br /><br />
<h:form id="abcForm">
<p>#{listTestBean.selectedMyObject}</p>
<p:commandLink id="Ajax" ajax="true" action="indexContent?faces-redirect=false">
<h:outputText value="Main page (link)" />
</p:commandLink>
</h:form>
</h:body>
....
请求范围的托管bean listTestBean包含getter和setter方法以及valueChanged方法。 valueChanged方法成立:
....
try {
FacesContext.getCurrentInstance().getExternalContext().redirect("abcContent.xhtml");
} catch (IOException ioe) {
System.err.println("listTestBean.valueChanged: IOException");
}
....
基本上是重定向到abcContent页面。
但是,当我从selectItem组件中选择一个项目时,abcContent.xhtml页面没有呈现,具有指定的layoutTempl?
我根本不懂,对不起!这可能是微不足道的,但我无法解决它!
此致
答案 0 :(得分:0)
试
<p:commandLink ajax="false" action="indexContent?faces-redirect=false">
重定向不需要ajax。
答案 1 :(得分:0)
请输入模板的完整相对网址,而不是template="./layoutTempl.xhtml"
。这意味着从当前目录加载模板。如果模板和页面位于同一目录中,只需将模板名称删除./
看看这个模板教程:
http://www.mkyong.com/jsf2/jsf-2-templating-with-facelets-example/
答案 2 :(得分:0)
在abcContent.xhtml
你有
<ui:define name="main">
<ui:include src="abc.xhtml"/>
</ui:define>
但abc.xhtml
定义为
<h:body>
<h2>We got at abc page!</h2>
<br /><br />
<h:form id="abcForm">
...
</h:form>
</h:body>
没有<ui:composition>
。您正在使用XHTML,如果您提供了错误的标记,那么JSF将无法正确解释。如果您使用的是IDE,则在使用ui:include
时不会收到警告。您可以通过打开浏览器并单击abcContent.xhtml
上的查看源代码来自行验证。您会注意到页面的某些部分仍然包含JSF代码(例如h:body
)。修复abc.xhtml
然后重试。
<h:body>
<ui:composition>
<h2>We got at abc page!</h2>
<br /><br />
<h:form id="abcForm">
...
</h:form>
</ui:composition>
</h:body>
答案 3 :(得分:0)
这是一个迟到的回复,但根据我的经验,当文件路径为
时会发生这种情况“abcContent.xhtml”
而不是
“的面孔/ abcContent.xhtml”
你甚至可以在浏览器的地址栏中测试它。
此外,这并不意味着您的文件位于名为“faces”的文件夹中。它只是web.xml中指定的url模式