我是JSF的新手,试图了解include和param是如何工作的,但一直停滞不前。非常感谢您的帮助。
我有两个简单的页面(用于测试),Page1.xhtml和Page2.xhtml。当我直接调用Page2时,我可以看到参数被正确地传递,但当我调用Page1时,Page2被包含在没有参数的情况下。下面是代码。
第1页:
<h:body>
<h:form id="test">
<b>Page 1</b><br/>
<ui:include src="Page2.xhtml">
<ui:param name="id" value="123" />
</ui:include>
<b>End of Page 1</b>
</h:form>
第2页:
<h:head>
<f:view contentType="text/html"></f:view>
</h:head>
<h:body>
<h:form>
<h:outputLabel for="ID" value="ID on Page2: "/>
<h:outputText id="ID" value="#{pageTestBean.id}"/>
</h:form>
</h:body>
</html>
PageTestBean:@ManagedBean@会话范围公共类PageTestBean{
private Long id=new Long(11111);
public void init() {
//doesn't do anything yet;
}
// Getters and Setters
public long getId() {
return id;
}
public void setId(long id) {
this.id = id;
}
}
我希望在Page1上看到"123"作为输出Id,而不是"11111",这是没有传入参数时的默认值。但是,我总是看到11111。我的期望错了吗?
首先,包含处理不当:包含的页面应该只由<ui:composition>
组成,如下所示:
<ui:composition
xmlns="http://www.w3.org/1999/xhtml"
xmlns:ui="http://java.sun.com/jsf/facelets">
...incuded page content...
</ui:composition>
一个很好的参考点是BalusC对"如何使用JSF 2.0 Facelets在XHTML中包含另一个XHTML?"的回答?。
接下来,只需通过包含页面中的#{paramName}
访问包含的参数,如:
<h:outputText value="#{paramName}" />
在您的情况下,参数名称为id
。
代码还有其他一些缺点,比如滥用会话范围和嵌套的HTML表单,但这是另一个问题。最后但并非最不重要的是,您必须了解如何在视图中处理托管bean。