Bu örnekte JSF 2.3'de "f:websocket" kullanılarak bir web socket örneği yaratılmıştır. Örnekte bir sayfadan mesaj gönderildiği zaman hem mesaj mesaj gönderilen sayfaya hem de ikinci bir sayfaya gelen mesaj sunucudan push edilmiştir.
Öcelikle aşağıdakiler bağımlılıkta olmalıdır :
<dependency>
<groupId>java.servlet</groupId>
<artifactId>javax.servlet-api</artifactId>
<version>4.0.0</version>
</dependency>
<dependency>
<groupId>org.glassfish</groupId>
<artifactId>javax.faces</artifactId>
<version>2.3.9</version>
</dependency>
<dependency>
<groupId>javax.faces</groupId>
<artifactId>javax.faces-api</artifactId>
<version>2.3</version>
<scope>provided</scope>
</dependency>
<dependency>
<groupId>javax.enterprise</groupId>
<artifactId>cdi-api</artifactId>
<version>1.2<version>
</dependency>
<dependency>
<groupId>org.jboss.weld.servlet</groupId>
<artifactId>weld-servlet</artifactId>
<version>2.2.9.Final</version>
</dependency>
<dependency>
<groupId>javax.json</groupId>
<artifactId>javax.json-api</artifactId>
<version>1.1.4</version>
</dependency>
<dependency>
<groupId>org.glassfish</groupId>
<artifactId>javax.json</artifactId>
<version>1.1.4</version>
</dependency>
java.lang.ClassNotFoundException: javax.json.Json
java.lang.ClassNotFoundException: org.glassfish.json.JsonProviderImpl hataları alıyorsanız javax.json ve javax.json-api bağımlılıklarını eklememişsiniz demektir.
Öncelikle girilen mesajı diğerlerine push eden bean yaratıyoruz :
import java.io.Serializable;
import javax.faces.push.Push;
import javax.faces.push.PushContext;
import javax.faces.view.ViewScoped;
import javax.inject.Inject;
import javax.inject.Named;
@Named
@ViewScoped
public class MessageBean implements Serializable {
@Inject @Push
private PushContext mypush;
private String message;
public void sendMessage() {
mypush.send(message);
}
public String getMessage() {
return message;
}
public void setMessage(String message) {
this.message = message;
}
}
mypush, push enpoint'idir. sendMessage() yöntemi çağrıldığında gelen mesaj diğerler sayfalara gönderilir.
Mesaj üreten ve aynı zamanda dışarıdan gelen bir mesajı gösteren sayfa aşağıdaki gibidir :
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE html>
<html xmlns:h="http://java.sun.com/jsf/html"
xmlns:f="http://java.sun.com/jsf/core">
<h:head>
<title>Socket</title>
</h:head>
<h:body>
<h:form>
<script>
function myMessageListener(message) {
alert(message);
}
</script>
<f:websocket channel="mypush" onmessage="myMessageListener"/>
<h:inputText id="pushMessage" value="#{messageBean.message}"/>
<br/>
<h:commandButton action="#{messageBean.sendMessage}" value="Send Message"/>
</h:form>
</h:body>
</html>
Yazı alanına mesajı yazıp Send Message düğmesine basılınca MessageBean'in sendMessage yöntemi çağrılır. Bu yöntemde socket açmış tüm sayfalara mesajı iletir.
Sadece gelen mesajı gösterecek ikinci sayfa aşağıdaki gibidir :
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE html>
<html xmlns:h="http://java.com/jsf/html" xmlns:f="http://java.sun.com/jsf/core">
<h:head>
<title>Socket</title>
</h:head>
<h:body>
<h:form>
<script>
function myMessageListener(message) {
alert(message);
}
</script>
<f:websocket channel="mypush" onmessage="myMessageListener"/>
</h:form>
</h:body>
</html>
İlk sayfada mesajı girip düğmeye basarsanız hem bulunduğunuz sayfada hem de diğer sayfada alert penceresinde girdiğiniz mesaj gözükecektir.