как принудительно обновить мой экран в JSF

в моем приложении JSF2 у меня есть экраны, составленные из:

  • Заголовок
  • Тело

В шапке у меня есть комбо-список. При каждом изменении значения в комбинированном списке у меня есть запрос Ajax, который обновляет данные в теле. Пока все работает правильно. Теперь структура домашнего экрана должна меняться при изменении значения списка комбо. Для этого у меня есть:

  • 1 ManagedBean HomeBean, управляющий домом
  • 1 ManagedBean HeaderBean, управляющий заголовком
  • 2 объекта HomeScreen1.java и HomeScreen2.java, которые позволяют мне получать данные с каждого экрана
  • 2 службы HomeScreen1Loader.java и HomeScreen2Loader.java, которые управляют загрузкой каждого типа экрана
  • 1 шаблон home.xhtml
  • 2 файла home1.xhtml и home2.xhtml

Когда я вхожу в приложение, я получаю соответствующую хорошую страницу (тип элемента 1 => домашняя страница 1). Но когда я выбираю элемент типа 2, выполняется метод actionListener, данные ManagedBean обновляются (для экрана типа 2), но страница не обновляется. Что вы делаете ?

HeaderBean.java:

package com.omb.view;

import java.io.Serializable;
import java.util.List;

import javax.faces.event.ValueChangeEvent;
import javax.faces.model.SelectItem;

import org.apache.commons.logging.Log;
import org.apache.commons.logging.LogFactory;
import org.springframework.context.annotation.Scope;
import org.springframework.stereotype.Controller;


import com.omb.exception.TechnicalException;
import com.omb.view.util.Constants;
import com.omb.view.util.FacesUtils;

@Controller
@Scope("session")
public class HeaderBean implements Serializable {

    private static final long serialVersionUID = 1L;
    private static final Log logger = LogFactory.getLog(HeaderBean.class);
    private List<SelectItem> elementsDisplayed;

    public void initComboList() throws FunctionnalException {
        // init the combo list
    }

    public void elementChangeListener(ValueChangeEvent event) {
        if (event.getNewValue() != null) {
            // Do traitement....

            ContextBean contextBean = (ContextBean) FacesUtils.getObjectInSession(ContextBean.CONTEXT_BEAN_NAME);
            AbstractBean currentBean = (AbstractBean) FacesUtils.getObjectInSession(contextBean
                    .getCurrentBeanInSession());
            try {
                currentBean.refresh();
            } catch (TechnicalException e) {
                logger.error(e.getMessage(), e);
            }
        }
    }

    public String disconnect() {
        FacesContext.getCurrentInstance().getExternalContext().invalidateSession();
        return "/login.xhtml?faces-redirect=true";
    }


    public List<SelectItem> getElementsDisplayed() {
        return elementsDisplayed;
    }

    public void setElementsDisplayed(List<SelectItem> elementsDisplayed) {
        this.elementsDisplayed = elementsDisplayed;
    }

}

ContextBean.java:

package com.omb.view;

import org.springframework.context.annotation.Scope;
import org.springframework.stereotype.Controller;

import com.omb.view.util.Constants;

@Controller
@Scope("session")
public class ContextBean {

    public final static String CONTEXT_BEAN_NAME = "contextBean";

    private String templateHomeName;
    private boolean defaultHome;


    public String getTemplateHomeName() {
        return this.templateHomeName;
    }

    public void setTemplateHomeName(String templateHomeName) {
        this.templateHomeName = templateHomeName;
    }

    public boolean isDefaultHome() {
        return this.defaultHome;
    }

    public void setDefaultHome(boolean defaultHome) {
        this.defaultHome = defaultHome;
    }

}

HomeBean.java :

package com.omb.view.home;

import org.apache.commons.logging.Log;
import org.apache.commons.logging.LogFactory;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.context.annotation.Scope;
import org.springframework.stereotype.Controller;
import com.omb.exception.FunctionnalException;
import com.omb.exception.TechnicalException;
import com.omb.view.AbstractBean;
import com.omb.view.util.Constants;


@Controller
@Scope("session")
public class HomeBean extends AbstractBean {

    private static final Log logger = LogFactory.getLog(HomeBean.class);

    public static final String HOME_1_NAME = "home1.xhtml";
    public static final String HOME_2_NAME = "home2.xhtml";

    @Autowired
    private HomeScreen1 homeScreen1;

    @Autowired
    private HomeScreen2 homeScreen2;

    @SuppressWarnings({"unchecked", "rawtypes"})
    public String display() throws TechnicalException, FunctionnalException {

        ContextBean context = (ContextBean) FacesUtils.getObjectInSession(ContextBean.CONTEXT_BEAN_NAME);

        if (!isInitialized()) {

            if (defaultHomeScreen == null) {
                defaultHomeScreen = new DefaultHomeScreen();
            }

            if (eurHomeScreen == null) {
                eurHomeScreen = new EurHomeScreen();
            }

            AbstractHomeScreenLoader loader = HomeScreenLoaderFactory.getLoader(getTypeElement());
            if (Constants.CODE_TYPE_1.equals(getTypeElement()) {
                loader.load(homeScreen1);
                context.setTemplateHomeName(HOME_1_NAME);
            } else {
                loader.load(homeScreen2);
                context.setTemplateHomeName(HOME_2_NAME);
            }

            setInitialized(true);
        } else if (!upToDate) {
            refresh();
        }

        return "home";

    }

    @SuppressWarnings({"unchecked", "rawtypes"})
    public void refresh() throws TechnicalException {
        upToDate = true;
        AbstractHomeScreenLoader loader = HomeScreenLoaderFactory.getLoader(getTypeElement());
        if (Constants.CODE_TYPE_1.equals(userContext.getCurrentHotelCountryId())) {
            loader.refresh(homeScreen1);
        } else {
            loader.refresh(homeScreen2);
        }
    }


    public HomeScreen1 getHomeScreen1() {
        return this.homeScreen1;
    }

    public void setHomeScreen1(HomeScreen1 homeScreen1) {
        this.homeScreen1 = homeScreen1;
    }

    public HomeScreen2 getHomeScreen2() {
        return this.homeScreen2;
    }

    public void setHomeScreen2(HomeScreen2 homeScreen2) {
        this.homeScreen2 = homeScreen2;
    }

}

layout.xhtml основной шаблон приложения:

<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<html xmlns="http://www.w3.org/1999/xhtml"
    xmlns:h="http://java.sun.com/jsf/html"
    xmlns:ui="http://java.sun.com/jsf/facelets"
    xmlns:ice="http://www.icesoft.com/icefaces/component">

<h:head>
    <title><ui:insert name="title">OMB</ui:insert></title>
    <ice:outputStyle href="/xmlhttp/css/xp/xp.css" rel="stylesheet" type="text/css" />
    <link type="text/css" rel="stylesheet"
        href="#{facesContext.externalContext.requestContextPath}/resources/css/style.css" />

</h:head>

<h:body>

    <h:panelGroup id="page" styleClass="mainMaster" layout="block">
        <h:panelGroup id="header" styleClass="header" layout="block">
            <ui:insert name="header">
                <ui:include
                    src="/pages/layer/header/#{contextBean.templateHeaderName}" />
            </ui:insert>
        </h:panelGroup>
        <h:panelGroup id="headerMenu" styleClass="menu" layout="block">
            <ui:insert name="buttons">
                <ui:include
                    src="/pages/layer/menu/#{contextBean.templateMenuButtonName}" />
            </ui:insert>
        </h:panelGroup>
        <h:panelGroup id="main" styleClass="mainContent" layout="block">
            <h:panelGroup id="content" styleClass="content" layout="block">
                <ui:insert name="content" />
            </h:panelGroup>
        </h:panelGroup>
        <h:panelGroup id="footer" styleClass="footer" layout="block">
            <ui:insert name="footer">
                <ui:include src="/pages/layer/footer/footer.xhtml" />
            </ui:insert>
        </h:panelGroup>
    </h:panelGroup>
</h:body>
</html>

header.xhtml, страница, управляющая комбинированным списком:

<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<html xmlns="http://www.w3.org/1999/xhtml"
    xmlns:ui="http://java.sun.com/jsf/facelets">
<body>
    <ui:composition>
        <ice:form id="headerForm" xmlns:h="http://java.sun.com/jsf/html"
            xmlns:f="http://java.sun.com/jsf/core"
            xmlns:ice="http://www.icesoft.com/icefaces/component"
            xmlns:ace="http://www.icefaces.org/icefaces/components"
            xmlns:c="http://java.sun.com/jstl/core"
            xmlns:ui="http://java.sun.com/jsf/facelets">

            <h:panelGroup styleClass="logo" layout="block">
                <ice:graphicImage styleClass="imgLogoHR"
                    value="#{facesContext.externalContext.requestContextPath}/resources/images/common/logo/Logo.png" />

                <h:panelGroup styleClass="loginArea" layout="block">
                    <h:panelGroup styleClass="area" layout="block">

                        <h:panelGroup styleClass="comboHotel" layout="block">
                            <ace:simpleSelectOneMenu id="selectCurrentElement"
                                value="#{headerBean.currentElementDisplayed}"
                                valueChangeListener="#{headerBean.elementChangeListener}"
                                labelPosition="left" indicatorPosition="left" required="false"
                                rendered="#{not empty headerBean.elementsDisplayed}">
                                <f:selectItems value="#{headerBean.elementsDisplayed}" />
                                <ace:ajax execute="@this" render="@all" />
                            </ace:simpleSelectOneMenu>
                        </h:panelGroup>

                    </h:panelGroup>
                </h:panelGroup>
            </h:panelGroup>
        </ice:form>
    </ui:composition>
</body>
</html>

home.xhtml основной шаблон домашней страницы и компонента должны быть обновлены:

<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<html xmlns="http://www.w3.org/1999/xhtml"
    xmlns:h="http://java.sun.com/jsf/html"
    xmlns:f="http://java.sun.com/jsf/core"
    xmlns:ui="http://java.sun.com/jsf/facelets"
    xmlns:ice="http://www.icesoft.com/icefaces/component"
    xmlns:ace="http://www.icefaces.org/icefaces/components">
<h:body>
    <ui:composition template="/pages/layer/layout.xhtml">
        <ui:define name="content">
            <ui:include
                src="/pages/home/#{contextBean.templateHomeName}" />
        </ui:define>
    </ui:composition>
</h:body>
</html>

person Ousmane MINTE    schedule 09.10.2014    source источник
comment
Покажите содержимое кода Facelets, где вы выполняете обновление, и компоненты, которые необходимо обновить.   -  person Luiggi Mendoza    schedule 09.10.2014
comment
Здравствуйте, я добавил layout.xhtml и header.xhtml, которые содержат комбинированный список. Компонент, который следует обновить, это home.xhtml   -  person Ousmane MINTE    schedule 10.10.2014


Ответы (1)


Я нашел решение, проблема возникла с атрибутом templateHomeName ManagedBean ContextBean, который не был правильно оценен. Я добавил в loader.load(homeScreen1) и обновил и все в порядке. Я должен обновить свою версию JSF: 2.1.0-b11 до 2.1.26, потому что у меня возникла ошибка при обновлении.

person Ousmane MINTE    schedule 10.10.2014