数据未显示在由 viewscope spring bean 管理的 Primefaces 选项卡中

Posted

技术标签:

【中文标题】数据未显示在由 viewscope spring bean 管理的 Primefaces 选项卡中【英文标题】:Data not being displayed in Primefaces tab managed by viewscope spring bean 【发布时间】:2015-11-26 05:52:04 【问题描述】:

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

当 viewBean 的 newDeals 对象变为静态时,值就会显示出来。

我通过jsf viewscoped bean - set values for every page(tabs), Using JSF with multiple tabs in one browser,并想知道我从上述链接中理解的内容是否正确。即,我们必须将会话范围用于在视图 xhtml 中有多个选项卡的 bean 或页面??

该项目使用漂亮的面孔进行重定向。

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

@ViewScoped:只要您在浏览器窗口/选项卡中与同一个 JSF 视图交互,这个范围内的 bean 就会存在。它是根据 HTTP 请求创建的,并在您回发到不同的视图后被销毁。

那么,在加载第 0 个选项卡的数据时,为什么(第一个到最后一个)选项卡的数据没有加载到由选项卡视图(具有多个选项卡)组成的页面中?

代码如下

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

【问题讨论】:

因为它的view bean在你按下tab键时会失去它的状态并且实例newDeals被再次实例化。 所以你的意思是在tabchange上我应该重新初始化newdeals对象..对吗? 【参考方案1】:

您可以通过 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这样的参数调用视图页面

【讨论】:

以上是关于数据未显示在由 viewscope spring bean 管理的 Primefaces 选项卡中的主要内容,如果未能解决你的问题,请参考以下文章

对象未找到但在由“新”创建时工作

如何在 JSF 2.0/2.1 中用 CDI 替换 @ManagedBean / @ViewScope

Pyspark UDF 广播变量未定义仅在由单独脚本导入时

在由 docker 拉取的 Spring Boot 应用程序中实现 LetsEncrypt

将 GET 请求参数放入 @ViewScoped bean

没有@ViewScoped的JSF