【问题标题】:Open JSP in new browsertab from serverside code从服务器端代码在新的浏览器选项卡中打开 JSP
【发布时间】:2011-11-06 02:23:00
【问题描述】:

是否可以从服务器端 jsf 代码将资源打开到新的浏览器选项卡(如命令按钮的 target="_newtab")?

以下代码在同一选项卡中打开资源:

FacesContext.getCurrentInstance().getExternalContext().redirect("resource.jsp"); 

我正在使用素面。我认为javascript和icefaces有可能。

【问题讨论】:

    标签: jsp jsf-2 primefaces


    【解决方案1】:

    您无法在服务器端控制它。您需要在客户端控制它。例如,调用 bean 操作的命令按钮在其父级 <h:form> 上应该有一个 target="_blank"

    <h:form target="_blank">
        <h:commandButton value="Submit" action="#{bean.submit}" />
    </h:form>
    

    或者,如果您没有在操作方法中进行任何后处理,只需将该按钮完全替换为纯链接即可。

    <a href="resource.jsp" target="_blank">link</a>
    

    【讨论】:

    • 我正在使用组合框进行导航,某些元素应在同一选项卡中打开,而其他元素应在新选项卡中打开。所以表单的全局目标是不可能的。
    • 组合框?你不是说下拉吗?我不明白为什么您会允许编辑指向其他页面的下拉值。无论如何,您最好的选择是根据当前选定的项目使用 JavaScript 动态设置表单的目标。
    • @Brian:也许您是通过 ajax 按钮而不是常规按钮提交的?
    • 我在页面上确实有 AJAX 组件,但这不是一个,也不包含在一个中。页面上是否有任何 AJAX 会导致这种行为?最终我不得不放弃并改用commandLink,使用一堆o'格式来尝试让它看起来像一个按钮。
    【解决方案2】:

    我发现的最佳解决方案是:

    RequestContext context = RequestContext.getCurrentInstance();
    context.execute("window.open('resource.jsp', '_newtab')");
    

    【讨论】:

    • 不知道这怎么可能是正确的。我正在使用 PrimeFaces,并且 RequestContext 当前实例没有可用的“执行”方法!这里有没有代码?
    • 我猜你用错了RequestContext。你导入org.primefaces.context.RequestContext了吗?
    • 非常感谢,这对我很有用,所以如果你使用 primefaces,你可以 Execute script 并调用 window.open 脚本 org.primefaces.PrimeFacescurrent().executeScript。也许这对某人有帮助。问候。
    【解决方案3】:

    这在 Icefaces 上对我有用:

    JavascriptContext.addJavascriptCall(FacesContext.getCurrentInstance(), "window.open(dir, '_newtab');");
    

    其中dir 是新标签的方向。

    【讨论】:

      猜你喜欢
      • 2016-07-19
      • 2021-03-04
      • 2011-07-28
      • 2016-09-24
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2014-03-19
      相关资源
      最近更新 更多