如何使动态生成的URL重定向到另一个标签?

时间:2018-10-30 10:56:12

标签: jsf primefaces url-redirection

我正在使用PrimeFaces 6.2

大家好。如标题中所述,当用户单击链接(动态生成)时,我需要打开一个新选项卡。我现在尝试了2种解决方案,但都没有完全起作用:

第一个解决方案在PrimeFaces组件中将 url target 归因于

手镯:

<p:contextMenu id="menuMesure" for="treeVArboParents" nodeType="3">
    <p:menuitem value="OPL" url="#{arboParObjView.sessionService.lienUrl()}" target="_blank"/>
</p:contextMenu>

查看:

@Named(value="arboParObjView")
@ViewScoped
public class ArboParObjView implements Serializable
{
    @Inject
    SessionService sessionService;

    private TreeNode selectedNode //changes everytime a node is selected - both right and left clicks work

    ...some code here...

    public void genererLienBirt() //called everytime the selectedNode value is changed
    {
        String libelle="";
        if (selectedNode != null)
        {
            //code to find the id of the associated to the selected node.
            //I need the id because I want to pass it as a parameter of the link
            //And this part of code works well

            sessionService.setIdMesure(idMesure);
        }
    }       
}

会话服务:

@Named(value="sessionService")
@SessionScoped
public class SessionService implements Serializable
{
    private LienURL lienUrl = new LienURL();

    public String lienUrl()
    {
        String lien = "";
        if (idMesure != null)
        {
            lien = lienUrl.getUrl();
            lien += idMesure.toString();
            return lien;
        }
        return "";
    }
}

Bean:

public class LienURL
{
    private String url;

    public LienURL()
    {
        this.url = "myLink&BirtParameter="; //The base link with a Birt parameter waiting for the idMesure to be passed.
    }
}

此解决方案无效。当用户单击上下文菜单组件的菜单项时,它将打开一个新选项卡,但打开的页面与用户刚刚离开的页面相同。我认为这是因为PF的属性 url 加载了一次URL(并且第一次,我的URL为null,因为还没有填写idMesure),它只是忽略了我尝试传递的良好链接填写idMesure之后。

第二个解决方案使用FacesContext的重定向

手镯:

<p:contextMenu id="menuMesure" for="treeVArboParents" nodeType="3">
    <p:menuitem value="OPL" actionListener="#{arboParObjView.sessionService.lienUrl()}" />
</p:contextMenu>

服务:

@Named(value="sessionService")
@SessionScoped
public class SessionService implements Serializable
{
    private LienURL lienUrl = new LienURL();

    public void lienUrl() throws IOException
    {
        ExternalContext ec = FacesContext.getCurrentInstance().getExternalContext();
        String url = lienUrl.getUrl()+idMesure.toString();
        ec.redirect(url);
    }
}

bean和视图不变。与第一种解决方案相同。 第二种解决方案比第一种更好。它会使用正确的URL打开正确的页面,但在与用户所在页面相同的选项卡中。有没有一种使用FacesContext重定向的方法,但是在另一个选项卡中,就像 target =“ _ blank” 一样(目标仅适用于url属性)?还是有一种方法可以使url属性读取除第一个传递的URL之外的其他URL(为null)?

谢谢,请原谅我的英语。

2 个答案:

答案 0 :(得分:0)

请仅在第二种解决方案中使用p:menuitem中的target =“ _ blank”,它应该可以工作。

下面是更新的代码

<p:contextMenu id="menuMesure" for="treeVArboParents" nodeType="3">
    <p:menuitem value="OPL" actionListener="#{arboParObjView.sessionService.lienUrl()}" target="_blank" />
</p:contextMenu>

public void lienUrl() throws IOException
    {
        ExternalContext ec = FacesContext.getCurrentInstance().getExternalContext();
        String url = lienUrl.getUrl()+idMesure.toString();
        ec.redirect(url);
    }

答案 1 :(得分:0)

感谢所有贡献者的帮助。解决方案如下:

查看:

@Named(value="arboParObjView")
@ViewScoped
public class ArboParObjView implements Serializable
{
    @Inject
    private TreePodeService treePodeService;

    private TreeNode selectedNode;
    private Integer idMesure;
    private String lienOplBirt;

    ...

    //redirect to the generated link (called by the UI)
    public void redirectOpl()
    {
        try {
            FacesContext.getCurrentInstance().getExternalContext.redirect(lienOplBirt);
        } catch (IOException e) {
            e.printStackTrace();
        }
    }

    //generate the Birt Link
    public void genererLienBirt()
    {
        String libelle = "";
        if (selectedNode != null)
        {
            libelle = selectedNode.getData().toString();
            VArboParObjectifsParents mesureSelected = treePodeService.getPodeArboObjParentDao().findByLibelle(libelle);
            idMesure = mesureSelected.getIdRoot();
        }

        lienOplBirt = "https://theLinkToPass"+"&RP_idMesure="+this.idMesure;
    }

    ...

    //Execute the genererLienBirt() method everytime selectedNode's value changes
    public void setSelectedTreeNode(TreeNode selectedNode) {
        if (selectedNode !=  this.selectedNode)
        {
            this.selectedNode = selectedNode;
            genererLienBirt();
        }
        this.selectedNode = selectedNode;
    }
}

Facelet(UI)

<p:menuitem value="OPL" includeViewParams="true" action="#{arboParObjView.redirectOpl()}" ajax="false" />