Chat PrimeFaces Funciona apenas localmente

5 respostas
J

Pessoal depois de muita luta consegui fazer funcionar o chat do show case do primefaces, mas tem outro problema

o chat só funciona local ou na rede local da empresa se eu colocar em um servidor as mensagens não são enviadas, e não aparece erro nenhum.

O código:

index.xhtml:

<?xml version='1.0' encoding='UTF-8' ?>
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<html xmlns="http://www.w3.org/1999/xhtml"
      xmlns:h="http://java.sun.com/jsf/html"
      xmlns:p="http://primefaces.org/ui"
      xmlns:f="http://java.sun.com/jsf/core"
      xmlns:ui="http://java.sun.com/jsf/facelets">
    <h:head>
        <title>Facelet Title</title>
        <link rel = "stylesheet" type = "text/css" href = "css/default.css"/>
        <style type="text/css">
            .messageInput {
                width:400px;
            }

            .publicColumn {
                width:80%;
            }

            .usersColumn {
                width:20%;
            }

            .vtop {
                vertical-align: top;
            }

            .chatlogs {
                height:200px;
                overflow:auto;
                padding: 0.5em 1em 0.5em 0.5em;
            }

            .usersList {
                height:200px;
                overflow:auto;
            }

            .usersList ul {
                list-style-type: none;
                padding-left:10px;
            }

            .usersList ul li {
                margin-bottom: 2px;
            }

            .usersList .ui-button-text {
                padding:0;
            }
        </style>
    </h:head>
    <h:body>
        <f:view>
            
                    <p:growl id="growl" showDetail="true" />

                    <h:form id="form">

                        <p:fieldset id="container" legend="PrimeChat" toggleable="true">

                            <h:panelGroup rendered="#{chatView.loggedIn}">

                                <h:panelGrid columns="2" columnClasses="publicColumn,usersColumn" style="width:100%">
                                    <p:outputPanel id="public" layout="block" styleClass="ui-corner-all ui-widget-content chatlogs"/>

                                    <p:dataList id="users" var="user" value="#{chatView.users}" styleClass="usersList">
                                        <f:facet name="header">
                                            Users
                                        </f:facet>
                                        <p:commandButton title="Chat" icon="ui-icon-comment" oncomplete="pChat.show()" update=":form:privateChatContainer">
                                            <f:setPropertyActionListener value="#{user}" target="#{chatView.privateUser}" />
                                        </p:commandButton>
                                        #{user}
                                    </p:dataList>
                                </h:panelGrid>

                                <p:separator />

                                <p:inputText value="#{chatView.globalMessage}" styleClass="messageInput" />
                                <p:spacer width="5" />
                                <p:commandButton value="Send" actionListener="#{chatView.sendGlobal}" oncomplete="$('.messageInput').val('').focus()"/>
                                <p:spacer width="5" />
                                <p:commandButton value="Disconnect" actionListener="#{chatView.disconnect}" global="false" update="container" />
                            </h:panelGroup>

                            <h:panelGroup rendered="#{not chatView.loggedIn}" >
                                Username: <p:inputText value="#{chatView.username}" />

                                <p:spacer width="5" />
                                <p:commandButton value="Login" actionListener="#{chatView.login}" update="container"
                                                 icon="ui-icon-person" />
                            </h:panelGroup>

                        </p:fieldset>

                        <p:dialog widgetVar="pChat" header="Private Chat" modal="true" showEffect="fade" hideEffect="fade">
                            <h:panelGrid id="privateChatContainer" columns="2" columnClasses="vtop,vtop">
                                <p:outputLabel for="pChatInput" value="To: #{chatView.privateUser}" />
                                <p:inputTextarea id="pChatInput" value="#{chatView.privateMessage}" rows="5" cols="30" />

                                <p:spacer />
                                <p:commandButton value="Send" actionListener="#{chatView.sendPrivate}" oncomplete="pChat.hide()" />
                            </h:panelGrid>
                        </p:dialog>

                    </h:form>

                    <p:socket onMessage="handleMessage" channel="/chat" autoConnect="false" widgetVar="subscriber"/>

                    <script type="text/javascript">
                        function handleMessage(data) {
                            var chatContent = $(PrimeFaces.escapeClientId('form:public'));
                            chatContent.append(data + '<br />');

                            //keep scroll
                            chatContent.scrollTop(chatContent.height());
                        }
                    </script>

        </f:view>
    </h:body>
</html>

O bean:

import java.util.ArrayList;
import java.util.List;
import javax.faces.application.FacesMessage;
import javax.faces.bean.ManagedBean;
import javax.faces.bean.SessionScoped;
import javax.faces.context.FacesContext;
import org.primefaces.context.RequestContext;
import org.primefaces.push.PushContext;
import org.primefaces.push.PushContextFactory;

@ManagedBean
@SessionScoped
public class ChatView {

    private final PushContext pushContext = PushContextFactory.getDefault().getPushContext();

    private static List<String> users;

    private String privateMessage;

    private String globalMessage;

    private String username;

    private boolean loggedIn;

    private String privateUser;

    private final static String CHANNEL = "/chat/";

    static{
        users = new ArrayList<String>();
    }

    public List<String> getUsers() {
        return users;
    }

    public void setUsers(List<String> users) {
        this.users = users;
    }

    public String getPrivateUser() {
        return privateUser;
    }

    public void setPrivateUser(String privateUser) {
        this.privateUser = privateUser;
    }

    public String getGlobalMessage() {
        return globalMessage;
    }

    public void setGlobalMessage(String globalMessage) {
        this.globalMessage = globalMessage;
    }

    public String getPrivateMessage() {
        return privateMessage;
    }

    public void setPrivateMessage(String privateMessage) {
        this.privateMessage = privateMessage;
    }

    public String getUsername() {
        return username;
    }
    public void setUsername(String username) {
        this.username = username;
    }

    public boolean isLoggedIn() {
        return loggedIn;
    }
    public void setLoggedIn(boolean loggedIn) {
        this.loggedIn = loggedIn;
    }

    public void sendGlobal() {
        pushContext.push(CHANNEL + "*", username + ": " + globalMessage);

        globalMessage = null;
    }

    public void sendPrivate() {
        pushContext.push(CHANNEL + privateUser, "[MP] " + username + ": " + privateMessage);

        privateMessage = null;
    }

    public void login() {
        RequestContext requestContext = RequestContext.getCurrentInstance();

        if(users.contains(username)) {
            loggedIn = false;
            FacesContext.getCurrentInstance().addMessage(null, new FacesMessage(FacesMessage.SEVERITY_ERROR, "Username taken", "Try with another username."));

            requestContext.update("growl");
        }
        else {
            users.add(username);
            pushContext.push(CHANNEL, username + " entrou no chat.");
            requestContext.execute("subscriber.connect('/" + username + "')");
            loggedIn = true;
        }
    }
    public void disconnect() {
        //remove user and update ui
        users.remove(username);
        RequestContext.getCurrentInstance().update("form:users");

        //push leave information
        pushContext.push(CHANNEL, username + " saiu do chat.");

        //reset state
        loggedIn = false;
        username = null;
    }
}

O web.xml:

<?xml version="1.0" encoding="UTF-8"?>
<web-app version="2.5" xmlns="http://java.sun.com/xml/ns/javaee" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://java.sun.com/xml/ns/javaee http://java.sun.com/xml/ns/javaee/web-app_2_5.xsd">
    <context-param>
        <param-name>javax.faces.PROJECT_STAGE</param-name>
        <param-value>Development</param-value>
    </context-param>
    <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>
    <session-config>
        <session-timeout>30</session-timeout>
    </session-config>
    <welcome-file-list>
        <welcome-file>faces/index.xhtml</welcome-file>
    </welcome-file-list>
    <servlet>
        <servlet-name>Push Servlet</servlet-name>
        <servlet-class>org.primefaces.push.PushServlet</servlet-class>
    </servlet>
    <servlet-mapping>
        <servlet-name>Push Servlet</servlet-name>
        <url-pattern>/primepush/*</url-pattern>
    </servlet-mapping>
</web-app>

Será que alguém sabe qual o problema?

5 Respostas

J

Dando uma olhada aqui na documentação do primefaces achei que essa configuração deve ser adicionada no web.xml,:

<context-param> <param-name>primefaces.PUSH_SERVER_URL</param-name> <param-value>http://dominioDaAplicacao:porta</param-value> </context-param>

mas não funcionou.

J

Alguma ideia Pessoal…?

R

Cara não conheço um ser humano que tentou usar esse PrimePush e conseguiu. Vai pro DWR pq o Push do primefaces não funciona nem no site de demos deles.

M

to tentando fazer um chat igual a esse mais ta complicado, quais as lib você utilizou?

A

usa assim, pra mim funcionou:

<context-param>
     <param-name>primefaces.PUSH_SERVER_URL</param-name>
     <param-value>ws://192.168.1.17:8080</param-value>
</context-param>
<servlet>
     <servlet-name>Push Servlet</servlet-name>
     <servlet-class>org.primefaces.push.PushServlet</servlet-class>
     <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>
Criado 28 de novembro de 2012
Ultima resposta 21 de jul. de 2014
Respostas 5
Participantes 4