无法在另一个jsf页面上获取查看Scoped bean值?

时间:2014-03-07 14:26:09

标签: jsf jsf-2 popupwindow managed-bean

我正在使用JSF开发一个项目。在一个打开的弹出窗口中,我想显示一些产品的详细信息,但无法在数据表上获取视图范围bean的值。

你能帮助我吗?

感谢。

这是我的UrunuDenetlemeSayfasi.xhtml代码段:

<h:commandLink onclick="window.open('UruneGozAt.xhtml',
'Ürün İçeriği', config='width=700, height=400, top=100, left=100,
scrollbars=no, resizable=no');"
action="#{uruneGozAtBean.urunIdsineGoreUrunIcerigiGetir}" value="Ürün İçeriğine Göz At">
<f:param name="urunid" value="#{urun.urunID}" /> 
</h:commandLink>

这是UrunuGozAt.xhtml:

<!DOCTYPE html>
<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">
<h:body>
    <h:dataTable class="table table-striped"
        value="#{uruneGozAtBean.urunIcerik}" var="urun">
        <h:column>
            <f:facet name="header">
                <h:outputText value="barkod no" />
            </f:facet>
            <h:outputText value="#{urun.barkodNo}" />
        </h:column>
    </h:dataTable>
</h:body>
</html>

这是UruneGozAtBean.java

    UrunDenetlemeSayfasiBean urunDenetle = new UrunDenetlemeSayfasiBean();
    UrunDenetleService urunService = new UrunDenetleService();
    private UrunIcerik urunIcerik = new UrunIcerik();
    private Long urunIdParametre;

    public UrunIcerik getUrunIcerik() {
    return urunIcerik;
    }
    public void setUrunIcerik(UrunIcerik urunIcerik) {
    this.urunIcerik = urunIcerik;
    }
    public Long getUrunIdParametre() {
        return urunIdParametre;
    }
    public void setUrunIdParametre(Long urunIdParametre) {
        this.urunIdParametre = urunIdParametre;
    }
    public void urunIdsineGoreUrunIcerigiGetir() {
        setUrunIcerik(urunService.urunIdsineGoreUrunIcerigiGetir(urunIdEldeEt()));
    }
    public Long urunIdEldeEt(){      
        FacesContext fc = FacesContext.getCurrentInstance();
        setUrunIdParametre(getUrunIdParametre(fc));
        return getUrunIdParametre();
    }
    public Long getUrunIdParametre(FacesContext fc){
        Map<String, String> parametre =        fc.getExternalContext().getRequestParameterMap();
return Long.valueOf(parametre.get("urunid")).longValue();
    }

编辑:

现在是我当前的实现,它返回null

我正在使用JSF开发一个项目。在一个打开的弹出窗口中,我想显示一些产品的详细信息,但无法在数据表上获取视图范围bean的值。

你能帮助我吗?

感谢。

这是我的UrunuDenetlemeSayfasi.xhtml代码段:

<h:commandLink onclick="window.open('UruneGozAt.xhtml','Ürün İçeriği',
config='width=700, height=400, top=100, left=100, scrollbars=no, resizable=no');"
value="Ürün İçeriğine Göz At"> <f:param name="urunId" value="#{urun.urunID}" />
</h:commandLink>

这是UruneGozAt.xhtml:

<!DOCTYPE html>
<html xmlns="http://www.w3.org/1999/xhtml"
xmlns:h="http://java.sun.com/jsf/html"
xmlns:f="http://xmlns.jcp.org/jsf/core"
xmlns:ui="http://java.sun.com/jsf/facelets">

<f:metadata>
<f:viewParam name="urunId" value="#{uruneGozAtBean.urunId}"
    required="false" />
<f:viewAction action="#{uruneGozAtBean.urunIdsineGoreUrunIcerigiGetir()}" />
</f:metadata>

<h:head>
<title>Ürün İçeriği</title>
<!-- add this always, even if it's empty -->
</h:head>

<h:body>
<h:dataTable class="table table-striped"
    value="#{uruneGozAtBean.urunIcerik}" var="urun">
    <h:column>
        <f:facet name="header">
            <h:outputText value="barkod no" />
        </f:facet>
        <h:outputText value="#{urun.barkodNo}" />
    </h:column>
</h:dataTable>
</h:body>
</html>

这是UruneGozAtBean.java

@ManagedBean
@ViewScoped
public class UruneGozAtBean {

public UrunDenetlemeSayfasiBean urunDenetle = new UrunDenetlemeSayfasiBean();

public UrunDenetleService urunService = new UrunDenetleService();

private ArrayList<UrunIcerik> urunIcerik = new ArrayList<UrunIcerik>();

private Long urunId;

public Long getUrunId() {
    return urunId;
}

public void setUrunId(Long urunId) {
    this.urunId = urunId;
}

public ArrayList<UrunIcerik> getUrunIcerik() {
    return urunIcerik;
}

public void setUrunIcerik(ArrayList<UrunIcerik> urunIcerik) {
    this.urunIcerik = urunIcerik;
}

public void urunIdsineGoreUrunIcerigiGetir() {
    setUrunIcerik(urunService.urunIdsineGoreUrunIcerigiGetir(urunIdEldeEt()));
    System.out.print("aaa");
}

public Long urunIdEldeEt() {
    FacesContext fc = FacesContext.getCurrentInstance();
    setUrunId(getUrunId(fc));
    return getUrunId();
}

public Long getUrunId(FacesContext fc) {
    Map<String, String> parametre =     fc.getExternalContext().getRequestParameterMap();
return Long.valueOf(parametre.get("urunId")).longValue();
}
}

2 个答案:

答案 0 :(得分:3)

每个视图都有

@ViewScoped个bean。如果从当前视图打开弹出窗口,那么您将打开一个新视图,因此即使它使用相同的托管bean来显示数据,因为它们是不同的视图,它们使用同一类的不同实例。

在这种情况下,您应该通过查询字符串传递参数,然后在视图中接收它并处理它以加载所需的数据。在这种情况下,您的代码将是这样的(注意:请确保您发送名称为"urunId"的参数):

UrunuGozAt.xhtml:

<!DOCTYPE html>
<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">
<h:head>
    <!-- add this always, even if it's empty -->
    <f:metadata>
        <f:viewParam name="urunId" value="#{uruneGozAtBean.urunId}"
            required="false" />
        <f:viewAction action="#{uruneGozAtBean.loadData}" />
    </f:metadata>
</h:head>
<h:body>
    <h:dataTable class="table table-striped"
        value="#{uruneGozAtBean.urunIcerik}" var="urun">
        <h:column>
            <f:facet name="header">
                <h:outputText value="barkod no" />
            </f:facet>
            <h:outputText value="#{urun.barkodNo}" />
        </h:column>
    </h:dataTable>
</h:body>
</html>

UruneGozAtBean托管bean:

@ViewScoped
@ManagedBean
public class UruneGozAtBean {
    //your current fields, getters and setters...
    private Long urunId;
    //getter and setter for this field...

    public void loadData() {
        if (urunId != null) {
            //load the data for the table...
        }
    }
}

更多信息:

答案 1 :(得分:0)

DataTable需要一个列表来迭代,但据我所知,你返回一个UrunIcerik对象。