如何使动态生成的 URL 重定向到另一个选项卡?
How to make a dynamically generated URL redirect to another tab?
我正在使用 PrimeFaces 6.2
大家好。正如标题中提到的,当用户单击 link(动态生成)时,我需要打开一个新选项卡。我现在尝试了 2 个解决方案,其中 none 个完全有效:
第一个解决方案:属性url和目标 在 PrimeFaces 组件中
小脸:
<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);
}
}
}
Session 服务:
@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 "";
}
}
豆子:
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 为空,因为 idMesure 不是filled yet), 它只是忽略了好的 link 我在 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 属性读取其他 urls 而不是第一个传递的(它是空的)?
谢谢,请原谅我的英语。
请仅在第二种解决方案中使用 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);
}
感谢所有贡献者的帮助。解决方案如下:
查看:
@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" />
我正在使用 PrimeFaces 6.2
大家好。正如标题中提到的,当用户单击 link(动态生成)时,我需要打开一个新选项卡。我现在尝试了 2 个解决方案,其中 none 个完全有效:
第一个解决方案:属性url和目标 在 PrimeFaces 组件中
小脸:
<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);
}
}
}
Session 服务:
@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 "";
}
}
豆子:
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 为空,因为 idMesure 不是filled yet), 它只是忽略了好的 link 我在 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 属性读取其他 urls 而不是第一个传递的(它是空的)?
谢谢,请原谅我的英语。
请仅在第二种解决方案中使用 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);
}
感谢所有贡献者的帮助。解决方案如下:
查看:
@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" />