Jsf 带有dataTable的Contextmenu和target

Jsf 带有dataTable的Contextmenu和target,jsf,primefaces,datatable,contextmenu,target,Jsf,Primefaces,Datatable,Contextmenu,Target,我正在使用primefaces5.0进行jsf,下面是我的场景: 我有一个页面包含一个dataTable,其contextmenu如下所示: 当我单击contextmenu时,我想弹出另一个窗口,而不是包含所选数据信息的选项卡,例如字符串data1 但是,无论我在p:menuitem中使用action还是url参数都无法完成 当我使用action参数时,另一个页面在原始窗口中显示,但打开的新窗口为空: 如果我将action=/anotherPage更改为url=/anotherPage.xht

我正在使用primefaces5.0进行jsf,下面是我的场景:

我有一个页面包含一个dataTable,其contextmenu如下所示: 当我单击contextmenu时,我想弹出另一个窗口,而不是包含所选数据信息的选项卡,例如字符串data1

但是,无论我在p:menuitem中使用action还是url参数都无法完成

当我使用action参数时,另一个页面在原始窗口中显示,但打开的新窗口为空:

如果我将action=/anotherPage更改为url=/anotherPage.xhtml,则新窗口中将显示另一个页面,但没有关于所选数据的信息:请注意,标题已更改为另一个页面

以下是我所做的:

Facelet:

BackingBean:

AnotherPage.xhtml:

另一个页面bean:

多谢各位

使现代化 我做了很多调查,发现了一些东西:

menuitem的目标属性未呈现用于操作,它是一个属性,不会被修复。 Menuitem支持f:params根据传递参数。 当我使用url时,在请求映射中找不到参数,这可能意味着这是一个全新的请求,所以我找不到我放在请求映射中的内容。 也许我可以把参数放在会话映射而不是请求映射中,因为我在3中提到过。 如果使用url,则不会调用action或actionListener。
根据我在问题的更新部分所说的,我找到了一个解决办法。 请注意,我相信这只是一个解决办法,希望有一些正常的方法来解决它

由于menuitem的目标属性未为操作呈现,因此我只能使用url。 因此,我尝试使用f:params通过url传递参数,但仍然徒劳无功,因为我认为在更新部分提到的第三点

之后,我尝试通过支持bean将参数放入会话映射中,并使用action调用该方法。然而,它仍然无法工作,因为如果我使用url,则不会调用操作

根据这个想法,我在menuitem之外调用这个方法。 我向dataTable添加一个事件,并在其中调用方法:

<p:dataTable id="dataTable" value="#{mainBean.dataList}" var="data" rowIndexVar="index" emptyMessage="Loading..." 
                     selectionMode="single" selection="#{mainBean.selectedStr}" rowKey="#{data}">
        <p:ajax event="contextMenu" listener="#{mainBean.setParam()}"/>
        <p:column headerText="data">
            <p:outputLabel value="#{data}"/>
        </p:column>
</p:dataTable>    
因此,我可以通过另一个PageBean中的会话获取信息,如:

请注意,该属性应在获取信息后删除。 这就是结果:
仅适用于有相同问题的用户。

您是否尝试过在菜单项上使用target=\u blank?我尝试过,但页面仍显示在原始窗口中。。。
private List<String> dataList=new ArrayList<>();
private String selectedStr="";

public void showPopup(){
    Map<String, Object> reqMap=FacesContext.getCurrentInstance().getExternalContext().getRequestMap();
    reqMap.put("param", selectedStr);
}
<p:outputLabel value="This is the selected String:"/>
<p:outputLabel value="#{anotherPageBean.txt}"/>
private String txt;    

@PostConstruct
public void init(){
    Map<String, Object> reqMap=FacesContext.getCurrentInstance().getExternalContext().getRequestMap();
    txt=(String) reqMap.get("param");
}
<p:dataTable id="dataTable" value="#{mainBean.dataList}" var="data" rowIndexVar="index" emptyMessage="Loading..." 
                     selectionMode="single" selection="#{mainBean.selectedStr}" rowKey="#{data}">
        <p:ajax event="contextMenu" listener="#{mainBean.setParam()}"/>
        <p:column headerText="data">
            <p:outputLabel value="#{data}"/>
        </p:column>
</p:dataTable>    
 public void setParam(){
    HttpSession session=(HttpSession) FacesContext.getCurrentInstance().getExternalContext().getSession(false);
    session.setAttribute("param", selectedStr);
}
 @PostConstruct
public void init(){
    HttpSession session=(HttpSession) FacesContext.getCurrentInstance().getExternalContext().getSession(false);
    txt=(String) session.getAttribute("param");
    session.removeAttribute("param");
}