在以下页面中,我无法加载automobileLists
,因为填充它的方法位于f:metadata
中的组件之外。我有一个nullPointerException错误。
部分代码:
<html xmlns="http://www.w3.org/1999/xhtml"
xmlns:h="http://xmlns.jcp.org/jsf/html"
xmlns:ui="http://xmlns.jcp.org/jsf/facelets"
xmlns:p="http://primefaces.org/ui"
xmlns:f="http://xmlns.jcp.org/jsf/core">
<h:head>
<title>title</title>
</h:head>
<f:metadata>
<f:viewAction action="#{primeAutomobileController.populateAutomobileFieldList}"/>
</f:metadata>
<ui:composition template="layout/template.xhtml">
<ui:define name="content">.....................
我加载它的唯一方法是将primeAutomobileController
范围限定为会话而不是原始请求,并通过按钮从前一页调用该方法,我希望它在开始时加载该页面而不是之前调用它。问题的方法:
public void populateAutomobileFieldList(){
List<String> automobileFieldSource = new ArrayList<>();
List<String> automobileFieldTarget = new ArrayList<>();
automobileFieldSource.add("Make");
automobileFieldSource.add("Model");
automobileFieldSource.add("Year");
automobileFieldSource.add("Description");
setAutomobileList(new DualListModel<>
(automobileFieldSource, automobileFieldTarget));
}
部分 index.xhtml 页面加载f:metadata
<html xmlns="http://www.w3.org/1999/xhtml"
xmlns:h="http://xmlns.jcp.org/jsf/html"
xmlns:ui="http://xmlns.jcp.org/jsf/facelets"
xmlns:p="http://primefaces.org/ui"
xmlns:f="http://xmlns.jcp.org/jsf/core">
<h:head>
<title>title</title>
</h:head>
<f:metadata>
<f:viewAction action="#{primeAutomobileController.loadAutomobiles}"/>
<f:viewAction action="#{primeAutomobileController.populateAutomobileFieldList}"/>
</f:metadata>
<ui:composition template="layout/template.xhtml">
<ui:define name="content"> ......................
这里f:metadata
中的两个方法都得到了正确加载,就像我正在关注的视频教程中的示例中所示,但是当它与差异xhtml中的相同的完全代码时,它不起作用。
答案 0 :(得分:1)
metadata tag的文档显示了在使用模板时必须如何完成(模板必须如何以及如何在模板客户端中使用它):
实现必须允许根据这个元素进行模板化 以下模式。
模板客户端XHTML视图,view01.xhtml
<ui:composition template="template.xhtml"> <ui:define name="metadata"> <f:metadata> <f:viewParam name="id"/> </f:metadata> </ui:define> <ui:define name="content"> <h1>The big news stories of the day</h1> </ui:define> </ui:composition>
注意第4行。页面作者必须确保
<f:metadata>
元素 不会出现在模板或包含的页面上。它必须驻留在 与viewId对应的根页面。模板页面template.xhtml
<html xmlns="http://www.w3.org/1999/xhtml" xmlns:ui="http://java.sun.com/jsf/facelets" xmlns:f="http://java.sun.com/jsf/core" xml:lang="en" lang="en"> <body> <f:view> <ui:insert name="metadata"/> <div id="container"> <ui:insert name="content"/> </div> </f:view> </body> </html>
页面作者不需要使用模板,,但如果他们这样做,那么 必须如上所示完成