Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/jsf-2/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Jsf 2 Seam 3应用中Deltaspike多窗口处理的替代方案_Jsf 2_Seam3_Deltaspike - Fatal编程技术网

Jsf 2 Seam 3应用中Deltaspike多窗口处理的替代方案

Jsf 2 Seam 3应用中Deltaspike多窗口处理的替代方案,jsf-2,seam3,deltaspike,Jsf 2,Seam3,Deltaspike,我在应用程序中遇到了多窗口处理的问题。 我目前正在使用对话范围来启用多窗口/选项卡处理,但如果用户在新选项卡中打开链接按钮,对话将在新旧选项卡之间共享 ApacheDeltaspike对此有一个解决方案,但我已经在使用Seam3和JSF2.1,不想迁移到Deltaspike 因此,我正在寻找没有Deltaspike的替代解决方案,或者是否可以使用Deltaspike和Seam 3?我使用p:remoteCommand构建了一个解决方案,答案如下: 我将这个JS添加到我的模板中,该模板为每个浏览器

我在应用程序中遇到了多窗口处理的问题。 我目前正在使用对话范围来启用多窗口/选项卡处理,但如果用户在新选项卡中打开链接按钮,对话将在新旧选项卡之间共享

ApacheDeltaspike对此有一个解决方案,但我已经在使用Seam3和JSF2.1,不想迁移到Deltaspike


因此,我正在寻找没有Deltaspike的替代解决方案,或者是否可以使用Deltaspike和Seam 3?

我使用p:remoteCommand构建了一个解决方案,答案如下:

我将这个JS添加到我的模板中,该模板为每个浏览器选项卡创建一个唯一的id,并将其存储在window.name中。然后调用p:remoteCommand来检查guid:

$(window).load(function() {
    // ----------------------
    var GUID = function() {
        // ------------------
        var S4 = function() {
            return (Math.floor(Math.random() * 0x10000 /* 65536 */
            ).toString(16));
        };
        return (S4() + S4() + "-" + S4() + "-" + S4() + "-" + S4() + "-" + S4() + S4() + S4());
    };

    if (!window.name.match(/^GUID-/)) {
        window.name = "GUID-" + GUID();
    }

    if ($('#guid_form\\:server_guid').text().length == 0 || 
            $('#guid_form\\:server_guid').text() != window.name) {
        checkGuid([{name:'guid', value:window.name}]);
    }
})
向上面的脚本调用的我的模板中添加了Primefaces remoteCommand

<h:form id="guid_form">
    <h:outputText value="#{checkTabAction.guid}" id="server_guid"/>
    <p:remoteCommand name="checkGuid" actionListener="#{checkTabAction.checkGuid}" process="@this" partialSubmit="true" />
</h:form>
并添加了一个检查操作,通过比较guid来验证当前浏览器选项卡/窗口:

@ConversationScoped
@Named(value = "checkTabAction")
public class CheckTabAction implements Serializable {

    private static final long serialVersionUID = 1L;

    @Inject
    private Logger log;

    private String guid = null;

    public void checkGuid() {
        Map<String, String> params = FacesContext.getCurrentInstance().getExternalContext().getRequestParameterMap();
        String guid = params.get("guid").toString();

        if (this.guid == null) {
            this.guid = guid;
        }

        if (!StringUtils.equals(this.guid, guid)) {
            log.info("New tab detected!");
            throw new NonexistentConversationException("New tab detected!");
        }
    }

    public String getGuid() {
        return guid;
    }

}

如果可以的话,升级到JSF-2.2:它现在可以处理多个窗口。我在JSF 2.2中读到的所有内容都是,如果用户在一个新选项卡中打开一个链接/按钮,它将不起作用,因为两个选项卡中的窗口ID都是相同的。无论如何,JSF2.2的更新目前是不可能的。JSF2.2只提供了一个ClientWindow,但它不管理它的作用域。使用DeltaSpike而不是Seam3。德尔塔斯派克是这条路上的未来,非常棒!