2014-10-09 69 views
0

我有组成屏幕:如何在我的JSF2应用程序迫使我的屏幕刷新在JSF

  • 身体

在标题我有一个组合列表。在组合列表中每次更改值时,我都有一个Ajax请求来更新正文中的数据。到目前为止,一切正常。现在当组合列表的值发生变化时,主屏幕的结构应该改变。要做到这一点,我有:

  • 1 ManagedBean HomeBean是管理家庭
  • 1 ManagedBean HeaderBean用于管理标题
  • 2物体HomeScreen1.java和HomeScreen2.java,让我有价值的数据,从每个屏幕
  • 2服务HomeScreen1Loader.java和HomeScreen2Loader.java是管理每个类型的屏幕加载
  • 1模板home.xhtml
  • 2 fichier 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> 
+0

显示执行更新的Facelets代码的内容以及应更新的组件。 – 2014-10-09 17:14:49

+0

你好,我添加了包含组合列表的layout.xhtml和header.xhtml。应该刷新的组件是home.xhtml – 2014-10-10 10:18:46

回答

0

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

相关问题