数据未显示在由viewscope spring bean

时间:2015-09-01 05:20:45

标签: spring jsf-2

我使用的是primefaces 5.1,jsf 2.2(Mojarra),spring 4.1.6,prettyfaces 2.3.3。 我有一个xhmtl,它包含一个带有多个选项卡的tabview和spring管理视图范围bean( viewBean )。 问题是页面的值( view.xhmtl ),并显示第0个选项卡的值。但其余选项卡中的其余数据未显示。但是,新交易标签中的值未显示。

当viewBean的newDeals对象变为静态时,将显示该值。

我经历了jsf viewscoped bean - set values for every page(tabs)Using JSF with multiple tabs in one browser,并想知道我从上述链接中理解的内容是否正确。即,我们必须在视图xhtml ??

中使用具有多个选项卡的bean或页面的会话范围

该项目使用prettyfaces进行重定向。

更新
http://balusc.blogspot.in/2011/09/communication-in-jsf-20.html#ManagedBeanScopes中,提到了

  

@ViewScoped:只要您在浏览器窗口/选项卡中与相同的JSF视图进行交互,此范围内的bean就会存在。它是在HTTP请求时创建的,一旦您回发到另一个视图就会被销毁。

那么,当加载第0个标签的数据时,如何(第1个到最后一个)选项卡的数据没有加载到包含tabview(带有多个选项卡)的页面中?

代码如下

List.xhmtl

<p:dataScroller value="#{listBean.pdtVOList}" var="pdt">
   <p:commandLink value="#{pdt.name}" action="#{viewBean.viewPdtFrmList(pdt.id)}" ></p:commandLink>
</p:dataScroller>

ListBean

@Scope("view")
@Component
public class ListBean implements Serializable {
  private List<Product> pdtVOList; //include getters and setters
  public void fillPage() {
    pdtVOList = ownerService.fillProductList(); //gets all product from db
  }

}

viewBean是

@Component
@Scope("view")
public class ViewBean implements Serializable {
   private static Product pdt = new Product();
   private NewDeals newDeals = new NewDeals();
   //include getter and setters

   public void fillPage() {
      //is Empty
   }
   public void viewPdtFrmList(String pdtIdStr) {
      pdt = new Product();
    //set pdt values
      setPdt(getPdtValuesFromDB(pdtIdStr));

      newDeals = pdtRepository.getNewDealsCOmbo();

      FacesContext.getCurrentInstance().getExternalContext()
                    .redirect("/pdt/view");

   }

   public getPdtValuesFromDB(String pdtIdStr) {
     //get values from database
     pdt = pdtRepository.getValuesFromDB(Integer.parseInt(pdtIdStr));
   }
}

产品型号

private int id;
private String name; //Include getter and setter

pdtView.xhtml

<h:outputText value="#{viewBean.pdt.id}"/>
<h:outputText value="#{viewBean.pdt.name}"/>
<p:tabView id="tabview" style="width:100%;float:right;">
    <p:tab id="clientPricing" title=" Pricing">
        <h:outputText value="#{viewBean.pdt.price}"/>
    </p:tab>
    <p:tab title="New Deals">
        <h:outputText value="#{viewBean.newDeals.name}"/>
    </p:tab>
</p:tabView>

prettyconfig.xml

<url-mapping id="ownerandpetsview"> 
    <pattern value="/pdt/view" />          
    <view-id value="/WEB-INF/views/pdtView.xhtml" />
 </url-mapping>

的web.xml

    <filter>
        <filter-name>Pretty Filter</filter-name>
        <filter-class>com.ocpsoft.pretty.PrettyFilter</filter-class>
    </filter>

   <filter-mapping>
        <filter-name>Pretty Filter</filter-name>
        <url-pattern>/*</url-pattern>
        <dispatcher>FORWARD</dispatcher>
        <dispatcher>REQUEST</dispatcher>
        <dispatcher>ERROR</dispatcher>
    </filter-mapping>

的web.xml

<context-param>
        <param-name>javax.faces.STATE_SAVING</param-name>
        <param-value>true</param-value>
    </context-param

1 个答案:

答案 0 :(得分:0)

你可以通过viewparam使它工作,在pdtView.xhtml

中有一个viewparam
    <f:metadata>
        <f:viewParam name="key" value="#{viewBean.key}"/>
    </f:metadata>

并从密钥

启动产品
    @Component
    @Scope("view")
    public class ViewBean implements Serializable {

        private static Product pdt = new Product();
        private NewDeals newDeals = new NewDeals();
        //include getter and setters

        public String key;

        public void fillPage() {
            //is Empty
        }

        @PostConstruct
        public void loadProduct () {
          getPdtValuesFromDB(key);
        }

        public void viewPdtFrmList(String pdtIdStr) {
            pdt = new Product();
            //set pdt values
            setPdt(getPdtValuesFromDB(pdtIdStr));

            newDeals = pdtRepository.getNewDealsCOmbo();

            FacesContext.getCurrentInstance().getExternalContext()
                    .redirect("/pdt/view");

        }

        public getPdtValuesFromDB(String pdtIdStr) {
            //get values from database
            pdt = pdtRepository.getValuesFromDB(Integer.parseInt(pdtIdStr));
        }
    }

最后来自list.xhtml您需要使用view.xhtml?key=pdt.id

等参数调用视图页面