2014-12-02 4 views
0

У меня проблемы с обработкой Multi-Window в моем приложении. В настоящее время я использую область разговора, чтобы включить обработку нескольких окон/вкладок, но если пользователь открывает ссылку (кнопку) на новой вкладке, разговор делится между старой и новой вкладками.Альтернатива Deltaspike Multi-Window Handling in Seam 3 Application

Apache Deltaspike имеет решение для этого (http://deltaspike.apache.org/documentation/#_module_overview), но я уже использую Seam 3 (и JSF 2.1) и не хочу переходить на Deltaspike.

Итак, я ищу альтернативное решение без Deltaspike или можно использовать Deltaspike AND Seam 3?

+0

Если вы можете перейти на JSF-2.2: он обрабатывает несколько окон в настоящее время – kolossus

+0

После всего Об этом в JSF 2.2 сказано, что он не работает, если пользователь открывает ссылку/кнопку на новой вкладке, потому что идентификатор окна будет одинаковым на обеих вкладках. В любом случае обновление JSF 2.2 в настоящее время невозможно. – user1127860

+0

JSF 2.2 просто предоставляет ClientWindow, но он не управляет областью для него. Используйте DeltaSpike вместо Seam3. DeltaSpike - это будущее на этой дороге и просто потрясающе! –

ответ

0

я построить решение с р: remoteCommand и этот ответ: In javascript, how can I uniquely identify one browser window from another which are under the same cookiedbased sessionId

Я добавил этот JS в шаблон, который создает уникальный идентификатор для каждой вкладки Browswer сохраняет его в window.name. Затем он вызывает р: 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> 

И добавил проверочное действие, которое validateds вкладки/окна текущего браузера путем сравнения справ-х:

@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; 
    } 

}