Невозможно использовать f: метаданные f:viewAction из внутренних компонентов
На следующей странице я не могу загрузить 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, он не работает.
1 ответ
В документации тега метаданных показано, как это должно быть сделано при использовании шаблонов (как должен выглядеть шаблон и как его использовать в клиенте шаблона):
Реализация должна позволять шаблонизацию для этого элемента в соответствии со следующим шаблоном.
шаблон клиентского представления 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>
Автор страницы не обязан использовать шаблоны, но если они это делают, это должно быть сделано, как показано выше