Моделирование 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> соответственно в одном месте, чтобы не было необходимости повторять это на каждом связанном шаблонном клиенте?

0 ответов

Другие вопросы по тегам