【问题标题】:how to force refresh of my screen in JSF如何在 JSF 中强制刷新我的屏幕
【发布时间】:2014-10-09 17:12:31
【问题描述】:

在我的 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>

【问题讨论】:

  • 显示执行更新的 Facelets 代码的内容以及应该更新的组件。
  • 您好,我添加了包含组合列表的 layout.xhtml 和 header.xhtml。应该刷新的组件是 home.xhtml

标签: jsf icefaces-3


【解决方案1】:

我找到了解决方案,问题出在 ManagedBean ContextBean 的 templateHomeName 属性值不正确。我在 loader.load(homeScreen1) 中添加并刷新,一切正常。我应该将我的 JSF 版本:2.1.0-b11 升级到 2.1.26,因为刷新时出现错误。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2014-03-28
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-11-28
    • 2012-02-06
    • 1970-01-01
    相关资源
    最近更新 更多