2015-08-05 4 views
0

Я пытаюсь получить «Counter» Primefaces. Это действительно работает, но я должен обновить страницу один раз, чтобы открыть конечную точку push. Как я могу открыть его при загрузке первой страницы?Первичные кнопки нажимают странное поведение

Я запускаю это на Tomcat 8.0.24.

Вот зависимостей в pom.xml:

<dependencies> 
    <dependency> 
     <groupId>org.apache.tomcat</groupId> 
     <artifactId>servlet-api</artifactId> 
     <version>6.0.44</version> 
    </dependency> 
    <dependency> 
     <groupId>org.apache.myfaces.core</groupId> 
     <artifactId>myfaces-api</artifactId> 
     <version>2.2.8</version> 
    </dependency> 
    <dependency> 
     <groupId>org.apache.myfaces.core</groupId> 
     <artifactId>myfaces-impl</artifactId> 
     <version>2.2.8</version> 
    </dependency> 
    <dependency> 
     <groupId>org.primefaces</groupId> 
     <artifactId>primefaces</artifactId> 
     <version>5.2</version> 
    </dependency> 
    <dependency> 
     <groupId>org.atmosphere</groupId> 
     <artifactId>atmosphere-runtime</artifactId> 
     <version>2.3.3</version> 
    </dependency> 
</dependencies> 

конечная точка:

@PushEndpoint("/counter") 
public class CounterResource { 

    @OnMessage(encoders = { JSONEncoder.class }) 
    public String onMessage(String count) { 
    return count; 
    } 

    @OnOpen 
    public void onOpen(RemoteEndpoint r, EventBus e) { 
    System.out.println("CounterResource:onOpen PushEndpoint open!"); 
    } 

    @OnClose 
    public void onClose(RemoteEndpoint r, EventBus e) { 
    System.out.println("CounterResource:onClose PushEndpoint closed!"); 
    } 
} 

Управляемый Bean:

@ManagedBean 
@ApplicationScoped 
public class GlobalCounterView implements Serializable { 

    private volatile int count; 

    public int getCount() { 
    return count; 
    } 

    public void setCount(int count) { 
    this.count = count; 
    } 

    public void increment() { 
    count++; 

    EventBus eventBus = EventBusFactory.getDefault().eventBus(); 
    eventBus.publish("/counter", String.valueOf(count)); 
    } 
} 

counter.xhtml страница:

<h:body> 
<h:form id="form"> 
    <h:outputText id="out" value="#{globalCounterView.count}" 
     styleClass="ui-widget display" /> 

    <p:commandButton value="Click" 
     actionListener="#{globalCounterView.increment}" /> 
</h:form> 

<p:socket onMessage="handleMessage" channel="/counter" /> 

<script type="text/javascript"> 
    /* ugly workaround here 
    window.onload = function() { 
     if (!localStorage.justOnce) { 
      localStorage.setItem("justOnce", "true"); 
      window.location.reload(); 
     } 
    }*/ 

    function handleMessage(data) { 
     $('.display').html(data); 
    } 
</script> 

Файл web.xml:

<!-- JSF --> 
<servlet> 
    <servlet-name>Faces Servlet</servlet-name> 
    <servlet-class>javax.faces.webapp.FacesServlet</servlet-class> 
    <load-on-startup>1</load-on-startup> 
</servlet> 

<servlet-mapping> 
    <servlet-name>Faces Servlet</servlet-name> 
    <url-pattern>/faces/*</url-pattern> 
</servlet-mapping> 
<servlet-mapping> 
    <servlet-name>Faces Servlet</servlet-name> 
    <url-pattern>*.xhtml</url-pattern> 
</servlet-mapping> 

<!-- Primefaces Push --> 
<servlet> 
    <servlet-name>Push Servlet</servlet-name> 
    <servlet-class>org.primefaces.push.PushServlet</servlet-class> 
    <init-param> 
     <param-name>org.atmosphere.cpr.broadcasterCacheClass</param-name> 
     <param-value>org.atmosphere.cache.UUIDBroadcasterCache</param-value> 
    </init-param> 
    <load-on-startup>1</load-on-startup> 
    <async-supported>true</async-supported> 
</servlet> 

<servlet-mapping> 
    <servlet-name>Push Servlet</servlet-name> 
    <url-pattern>/primepush/*</url-pattern> 
</servlet-mapping> 

При выполнении этого кода у меня нет выхода, когда я первый загрузить страницу и нажмите на кнопку, значение увеличивается на стороне сервера, но на дисплее значение не изменяется, поскольку конечная точка не открыта.

Затем, когда я обновляю страницу, открывается конечная точка, отображается правильное значение счетчика, и когда я нажимаю кнопку, значение увеличивается и отображается по назначению.

Буду признателен за любую помощь по этому вопросу. Спасибо за помощь.

+0

Есть ли ошибки в инструменте разработчика браузера при первоначальном доступе к странице? – Kukeltje

+0

@Kukeltje Нет У меня нет ошибки в консоли разработчика или в tomcat, и это действительно беспокоит меня. – Vinciwin

+0

Также не на вкладке сети инструмента разработчика? A 101 или 404 или что-то – Kukeltje

ответ

0

Изменение сервера приложений от Tomcat 8.0.24 до Tomcat 7.0.63 решило проблему!

Я в порядке с этим решением, так как мне абсолютно не нужен Tomcat 8.

И благодаря @Kukeltje я заметил, что разница между Tomcat 7 и Tomcat 8 происходит на уровне сети при загрузке первой страницы. Я думаю, что проблема может возникнуть из-за времени работы в атмосфере, и я буду смотреть дальше на это, чтобы удовлетворить мое любопытство :)

+0

Хорошо, что он работает. Возможно, другая версия Атмосферы помогает (или может попробовать PF 5.3-SNAPSHOT с последней атмосферой). Или, может быть, искать в списке проблем с атмосферой. – Kukeltje

Смежные вопросы