Моделирование f:viewAction на шаблоне главной страницы
Существует область применения приложения.
@Named
@ApplicationScoped
public class Bean {
@Inject
private Service service;
private Entity entity; // Getter.
// Entity is periodically fetched by EJB timers on the server side
// which when fetched notifies associated clients through WebSockets.
// Clients then update themselves by sending an AJAX request.
// All of these things collectively form a different chapter.
// Just that update() needs to be invoked, when a client sends a synchronous GET request
public Bean() {}
@PostConstruct
private void init() {
consume();
}
private void consume() {
entity = service.getEntity();
}
public void update() {
consume();
System.out.println("update called.");
}
}
Доступ к этому bean-компоненту осуществляется с помощью страницы, включенной в основной шаблон, следующим образом (West.xhtml
):
<html lang="#{localeBean.language}"
xmlns="http://www.w3.org/1999/xhtml"
xmlns:h="http://xmlns.jcp.org/jsf/html"
xmlns:f="http://xmlns.jcp.org/jsf/core">
<h:form>
<!-- This is merely a fake attempt to show something like this is expected. -->
<ui:define name="metaData">
<f:metadata>
<f:viewAction action="{bean.update}"/>
</f:metadata>
</ui:define>
<h:outputText value="#{bean.entity.field}"/>
</h:form>
</html>
Существует ложная попытка вызвать update()
метод с помощью <f:viewAction>
из мастер-шаблона, который противоречит его семантике.
Чтобы это функционировало, <f:viewAction>
необходимо повторить на отдельных клиентах шаблонов, что затрудняет обслуживание, особенно когда что-то нужно изменить.
Есть ли возможность избежать <f:viewAction>
повторяется повсюду на каждом шаблонном клиенте?
Шаблон главной страницы выглядит следующим образом. Это не обязательно. Просто предположите, что приведенная выше страница включена с помощью <ui:include src=".."/>
в следующем мастер-шаблоне (/WEB-INF/templates/Template.xhtml
).
<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:f="http://xmlns.jcp.org/jsf/core">
<f:view locale="..." ...>
<ui:insert name="metaData"></ui:insert>
<h:head>
<title><ui:insert name="title">Default Title</ui:insert></title>
</h:head>
<h:body>
<h:panelGroup layout="block">
<ui:insert name="contentBar">
<!-- The file given above is included here - West.xhtml. -->
<ui:include src="/WEB-INF/template/contents/West.xhtml"/>
</ui:insert>
</h:panelGroup>
<ui:insert name="content">Default contents</ui:insert>
<!--Other content bars.-->
</h:body>
</f:view>
</html>
<f:viewAction>
Необходимо разместить на шаблонах клиентов, связанных что-то вроде следующего.
<ui:composition template="/WEB-INF/templates/Template.xhtml"
xmlns="http://www.w3.org/1999/xhtml"
xmlns:h="http://xmlns.jcp.org/jsf/html"
xmlns:ui="http://xmlns.jcp.org/jsf/facelets"
xmlns:f="http://xmlns.jcp.org/jsf/core">
<ui:define name="title">Page Title</ui:define>
<ui:define name="metaData">
<f:metadata>
<f:viewAction action="#{bean.update}"/>
</f:metadata>
</ui:define>
<ui:define name="content">
<!--Main contents-->
</ui:define>
</ui:composition>
И так далее, <f:viewAction>
необходимо повторить на каждом таком клиенте шаблона, чтобы он выполнил свою согласованную задачу.
Есть ли способ заявить <f:viewAction>
соответственно в одном месте, чтобы не было необходимости повторять это на каждом связанном шаблонном клиенте?