Я пытаюсь получить «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>
При выполнении этого кода у меня нет выхода, когда я первый загрузить страницу и нажмите на кнопку, значение увеличивается на стороне сервера, но на дисплее значение не изменяется, поскольку конечная точка не открыта.
Затем, когда я обновляю страницу, открывается конечная точка, отображается правильное значение счетчика, и когда я нажимаю кнопку, значение увеличивается и отображается по назначению.
Буду признателен за любую помощь по этому вопросу. Спасибо за помощь.
Есть ли ошибки в инструменте разработчика браузера при первоначальном доступе к странице? – Kukeltje
@Kukeltje Нет У меня нет ошибки в консоли разработчика или в tomcat, и это действительно беспокоит меня. – Vinciwin
Также не на вкладке сети инструмента разработчика? A 101 или 404 или что-то – Kukeltje