JSF Primefaces Chatproblem trotz 3.4

.Domii

Bekanntes Mitglied
Nachdem ich den Chat von Primefaces (PrimeFaces - ShowCase) zum laufen gebracht habe (das überhaupt mal etwas angezeigt wird) bekomme ich einfach keine Anzeige der Nachrichten die ich versende.. nein ich werd nicht einmal eingeloggt!

Wichtig: damit dieser Chat funktioniert müsst ihr Primefaces 3.4 verwenden!

HTML:
<ui:composition xmlns="http://www.w3.org/1999/xhtml"
                xmlns:ui="http://java.sun.com/jsf/facelets"
                xmlns:h="http://java.sun.com/jsf/html"
                xmlns:f="http://java.sun.com/jsf/core"
                xmlns:p="http://primefaces.org/ui"
                template="../templates/ui.xhtml">

    <ui:define name="head">
        <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>

        <script type="text/javascript">
            //<![CDATA[
            function handleMessage(data) {
                var chatContent = $(PrimeFaces.escapeClientId('form:public'));
                chatContent.append(data + '<br />');
                
                //keep scroll
                chatContent.scrollTop(chatContent.height());
            }
            //]]>
        </script>
    </ui:define>

    <ui:define name="content">

        <h1 class="title ui-widget-header ui-corner-all">PrimePush - Chat</h1>
        <div class="entry">
            <p>Chat is a simple push based application created with PrimePush.</p>

            <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="#{chatUsers.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">
                <p:ajax event="message" update=":form:users" />
            </p:socket>
        </div>
    </ui:define>
</ui:composition>

Java:
/*
 * Copyright 2009-2012 Prime Teknoloji.
 *
 * Licensed under the Apache License, Version 2.0 (the "License");
 * you may not use this file except in compliance with the License.
 * You may obtain a copy of the License at
 *
 * [url]http://www.apache.org/licenses/LICENSE-2.0[/url]
 *
 * Unless required by applicable law or agreed to in writing, software
 * distributed under the License is distributed on an "AS IS" BASIS,
 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
 * See the License for the specific language governing permissions and
 * limitations under the License.
 */
package view;

import java.util.ArrayList;
import java.util.List;
import javax.annotation.PostConstruct;

public class ChatUsers {
    
    private List<String> users;
    
    @PostConstruct
    public void init() {
        this.users = new ArrayList<String>();
    }

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

    public void setUsers(List<String> users) {
        this.users = users;
    }
    
    public void addUser(String user) {
        this.users.add(user);
    }
    
    public void removeUser(String user) {
        this.users.remove(user);
    }
    
    public boolean contains(String user) {
        return this.users.contains(user);
    }
}

Java:
/*
 * Copyright 2009-2012 Prime Teknoloji.
 *
 * Licensed under the Apache License, Version 2.0 (the "License");
 * you may not use this file except in compliance with the License.
 * You may obtain a copy of the License at
 *
 * [url]http://www.apache.org/licenses/LICENSE-2.0[/url]
 *
 * Unless required by applicable law or agreed to in writing, software
 * distributed under the License is distributed on an "AS IS" BASIS,
 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
 * See the License for the specific language governing permissions and
 * limitations under the License.
 */
package view;

import javax.faces.application.FacesMessage;
import javax.faces.context.FacesContext;
import org.primefaces.context.RequestContext;
import org.primefaces.push.PushContext;
import org.primefaces.push.PushContextFactory;

public class ChatView {
    
    private final PushContext pushContext = PushContextFactory.getDefault().getPushContext();
    
    private ChatUsers users;

        private String privateMessage;
    
    private String globalMessage;
        
        private String username;
        
        private boolean loggedIn;
    
    private String privateUser;
    
    private final static String CHANNEL = "/chat/";

    public void setUsers(ChatUsers 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, "[PM] " + 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.addUser(username);
            pushContext.push(CHANNEL + "*", username + " joined the channel.");
            requestContext.execute("subscriber.connect('/" + username + "')");
            loggedIn = true;
        }
        }
    
    public void disconnect() {
        //remove user and update ui
        users.removeUser(username);
        RequestContext.getCurrentInstance().update("form:users");
        
        //push leave information
        pushContext.push(CHANNEL + "*", username + " left the channel.");
        
        //reset state
        loggedIn = false;
        username = null;
    }
}

Vllt wisst ihr eine andere JSF Alternative zu diesem Chat - wäre euch sehr Dankbar!

.Domii
 

Templarthelast

Bekanntes Mitglied
Warum nicht eben einen eigenen Chat programmieren, dieser ist ja nicht besonders komplex. Einfach ein Formular für den Namen, das den user in einer Datenbank registiert und dort auch alle nachrichten speichert.
 

krazun

Bekanntes Mitglied
Hast du denn auch Atmosphere in der web.xml richtig konfiguriert? Den Teil hast du nämlich nicht gepostet.

grüße,
krazun
 

.Domii

Bekanntes Mitglied
@Templarthelast: Das wäre eine Idee (habe diese auch aufgeschnappt) jedoch habe ich die User bereits in einer Datenbank - und möchte mir dies auch später sparen. Ich habe nun versucht mithilfe des ObserverPatterns einen Chat zu realisieren - scheitere aber an der Anbindung des fertig ausprogrammierten Patterns in eine JSF Seite.. siehe hier: Own Chat App Problem


Atmosphere? Sry ich bin relativ neu was JSF betrifft o.o

HTML:
<?xml version="1.0" encoding="UTF-8"?>
<web-app version="3.0" 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_3_0.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>
</web-app>

so schaut meine web.xml aus!
 
Zuletzt bearbeitet:

Fant

Bekanntes Mitglied
Wie schaut die faces-config aus? Hast du die Beans innerhalb der Applikation bekannt gemacht? Wenn ja in welchem Scope liegen diese?

Wird denn z.B. die login-Methode aufgerufen? Einfach mal ein paar Systemausgaben einbauen oder ein bisschen was loggen.
 

.Domii

Bekanntes Mitglied
faces-config wird in JSF 2.0 nichtmehr benötigt?

Scopes kannst du oben aus den Files lesen! :) - vorallem wichtig - Es ist das genaue Beispiel vom Showcase Lab (primesfaces.org)
 

Fant

Bekanntes Mitglied
faces-config wird in JSF 2.0 nichtmehr benötigt?

Scopes kannst du oben aus den Files lesen! :) - vorallem wichtig - Es ist das genaue Beispiel vom Showcase Lab (primesfaces.org)

Wo soll ich das denn ablesen können?

Klar brauchst du nicht zwingend die passenden Einträge in der faces-config, aber dann sollten die Beans per Annotation bekannt gemacht werden. Ich seh aber weder das eine, noch das andere.

Wenn das erledigt ist, dann schau mal, wie es bezüglich der zweiten Frage aussieht.


Die Codebeispiele von Primefaces sind übrigens auch nicht immer zu 100% vollständig, sondern zeigen meist nur das für das Problem wesentliche.
 

jwiesmann

Bekanntes Mitglied
Vielleicht solltest du der Klasse ChatView noch mitteilen, dass diese eine ManagedBean ist...
Java:
@ManagedBean
public class ChatView {
.....
 

.Domii

Bekanntes Mitglied
@Fant - war wohl schon der erste Fehler sieht jetzt so aus:

Java:
@ViewScoped
@ManagedBean
public class ChatView {
........

Bezüglich der 2. Frage:
Bekomme jetzt direkt nach dem Deploying & Build auf der Seite folgende Fehlerausgabe: "java.io.FileNotFoundException"
die So aussieht:
HTML:
java.io.FileNotFoundException
	at org.apache.naming.resources.DirContextURLConnection.getInputStream(DirContextURLConnection.java:403)
	at com.sun.faces.facelets.impl.DefaultFaceletCache._getLastModified(DefaultFaceletCache.java:172)
	at com.sun.faces.facelets.impl.DefaultFaceletCache.access$000(DefaultFaceletCache.java:62)
	at com.sun.faces.facelets.impl.DefaultFaceletCache$1.newInstance(DefaultFaceletCache.java:82)
	at com.sun.faces.facelets.impl.DefaultFaceletCache$1.newInstance(DefaultFaceletCache.java:78)
	at com.sun.faces.util.ExpiringConcurrentCache$1.call(ExpiringConcurrentCache.java:99)
	at java.util.concurrent.FutureTask$Sync.innerRun(FutureTask.java:303)
	at java.util.concurrent.FutureTask.run(FutureTask.java:138)
	at com.sun.faces.util.ExpiringConcurrentCache.get(ExpiringConcurrentCache.java:114)
	at com.sun.faces.facelets.impl.DefaultFaceletCache.getFacelet(DefaultFaceletCache.java:121)
	at com.sun.faces.facelets.impl.DefaultFaceletCache.getFacelet(DefaultFaceletCache.java:62)
	at com.sun.faces.facelets.impl.DefaultFaceletFactory.getFacelet(DefaultFaceletFactory.java:256)
	at com.sun.faces.facelets.impl.DefaultFacelet.include(DefaultFacelet.java:366)
	at com.sun.faces.facelets.impl.DefaultFacelet.include(DefaultFacelet.java:346)
	at com.sun.faces.facelets.impl.DefaultFaceletContext.includeFacelet(DefaultFaceletContext.java:199)
	at com.sun.faces.facelets.tag.ui.CompositionHandler.apply(CompositionHandler.java:155)
	at com.sun.faces.facelets.compiler.NamespaceHandler.apply(NamespaceHandler.java:93)
	at com.sun.faces.facelets.compiler.EncodingHandler.apply(EncodingHandler.java:86)
	at com.sun.faces.facelets.impl.DefaultFacelet.apply(DefaultFacelet.java:152)
	at com.sun.faces.application.view.FaceletViewHandlingStrategy.buildView(FaceletViewHandlingStrategy.java:774)
	at com.sun.faces.lifecycle.RenderResponsePhase.execute(RenderResponsePhase.java:100)
	at com.sun.faces.lifecycle.Phase.doPhase(Phase.java:101)
	at com.sun.faces.lifecycle.LifecycleImpl.render(LifecycleImpl.java:139)
	at javax.faces.webapp.FacesServlet.service(FacesServlet.java:594)
	at org.apache.catalina.core.StandardWrapper.service(StandardWrapper.java:1542)
	at org.apache.catalina.core.StandardWrapperValve.invoke(StandardWrapperValve.java:281)
	at org.apache.catalina.core.StandardContextValve.invoke(StandardContextValve.java:175)
	at org.apache.catalina.core.StandardPipeline.doInvoke(StandardPipeline.java:655)
	at org.apache.catalina.core.StandardPipeline.invoke(StandardPipeline.java:595)
	at org.apache.catalina.core.StandardHostValve.invoke(StandardHostValve.java:161)
	at org.apache.catalina.connector.CoyoteAdapter.doService(CoyoteAdapter.java:331)
	at org.apache.catalina.connector.CoyoteAdapter.service(CoyoteAdapter.java:231)
	at com.sun.enterprise.v3.services.impl.ContainerMapper$AdapterCallable.call(ContainerMapper.java:317)
	at com.sun.enterprise.v3.services.impl.ContainerMapper.service(ContainerMapper.java:195)
	at com.sun.grizzly.http.ProcessorTask.invokeAdapter(ProcessorTask.java:849)
	at com.sun.grizzly.http.ProcessorTask.doProcess(ProcessorTask.java:746)
	at com.sun.grizzly.http.ProcessorTask.process(ProcessorTask.java:1045)
	at com.sun.grizzly.http.DefaultProtocolFilter.execute(DefaultProtocolFilter.java:228)
	at com.sun.grizzly.DefaultProtocolChain.executeProtocolFilter(DefaultProtocolChain.java:137)
	at com.sun.grizzly.DefaultProtocolChain.execute(DefaultProtocolChain.java:104)
	at com.sun.grizzly.DefaultProtocolChain.execute(DefaultProtocolChain.java:90)
	at com.sun.grizzly.http.HttpProtocolChain.execute(HttpProtocolChain.java:79)
	at com.sun.grizzly.ProtocolChainContextTask.doCall(ProtocolChainContextTask.java:54)
	at com.sun.grizzly.SelectionKeyContextTask.call(SelectionKeyContextTask.java:59)
	at com.sun.grizzly.ContextTask.run(ContextTask.java:71)
	at com.sun.grizzly.util.AbstractThreadPool$Worker.doWork(AbstractThreadPool.java:532)
	at com.sun.grizzly.util.AbstractThreadPool$Worker.run(AbstractThreadPool.java:513)
	at java.lang.Thread.run(Thread.java:662)

In folgendem Tag:
HTML:
<UIViewRoot id="j_id1" inView="true" locale="de_AT" renderKitId="HTML_BASIC" rendered="true" transient="false" viewId="/index.xhtml"/>

Verstehe das Problem einfach nicht :/
 

jwiesmann

Bekanntes Mitglied
Hi, ich kenne zwar das Tag nicht, aber probier mal
[XML]<UIViewRoot id="j_id1" inView="true" locale="de_AT" renderKitId="HTML_BASIC" rendered="true" transient="false" viewId="/faces/index.xhtml"/>[/XML]

Code:
faces
kennzeichnet den Pfad, der in deiner Web.xml steht.
Alles was in deiner Entwicklungsumgebung im root-Verzeichnis steht, wird sozusagen, dahin kopiert.

Deine Web.xml
[XML]
<servlet-mapping>
<servlet-name>Faces Servlet</servlet-name>
<url-pattern>/faces/*</url-pattern>
</servlet-mapping>
[/XML]
 

.Domii

Bekanntes Mitglied
Zeig mal deine Ordner-/Dateistruktur...

Hab sie dir im Anhang als jpg rangehängt! ScreenShot010.jpg!


Alles was in deiner Entwicklungsumgebung im root-Verzeichnis steht, wird sozusagen, dahin kopiert.
D.h. ich muss an die normale
Code:
localhost:8080/projektname
noch
Code:
/faces/
dranhängen?
Hab es so jetzt probiert - immer noch "java.io.FileNotFoundException".

Habt ihr bei euch die Primefaces.org Showcase Lab schon zum laufen gebracht - die rede ist vom Chat.. um den geht es hier nämlich.. :)


EDIT:

FileNotFoundException behoben dank "Dateistruktur" ansehen ;D
Bin drauf gekommen das ich die templates im Web Pages nicht hatte (ui.xthml) und habe sie nun eingerichtet. zudem kam noch die falsche Verlinkung (../templates/ui.xthml) da gehört natürlich dann auch ./templates/ui.xthml :)
Nun stehe ich vor einem anderen Problem nämlich:

Code:
Could not initialize class org.primefaces.push.PushContextFactory
Diese wird mir nun geworfen! Ich glaube das dies mit Atmosphere zusammenhängt! Woher bekomme ich die dazugehörige .jar und wie kann ich diese dann konfigurieren?

Neue Dateistruktur unter ScreenShot011.jpg

EDIT: Atmosphere hab ich nun eingebunden..^^
trotzdem immer noch dieser Fehler:
Code:
 Could not initialize class org.primefaces.push.PushContextFactory

Mit freundlichen Grüßen
.Domii
 

Anhänge

  • ScreenShot010.jpg
    ScreenShot010.jpg
    12,9 KB · Aufrufe: 35
  • ScreenShot011.jpg
    ScreenShot011.jpg
    18,2 KB · Aufrufe: 34
Zuletzt bearbeitet:

Fant

Bekanntes Mitglied
Ist das die komplette Meldung?

Was passiert, wenn du die PushContext-Variable zusätzlich noch als static deklarierst?
 
Ähnliche Java Themen
  Titel Forum Antworten Datum
D Running Primefaces Chat Example Allgemeine Java-Themen 2
D JSF Primefaces Mobil Chat Allgemeine Java-Themen 8
L Primefaces checkboxen Allgemeine Java-Themen 19
J Erste Schritte Java 8 Tutorials trotz Java 13 Allgemeine Java-Themen 22
T Input/Output Konsole gibt trotz printf keine Umlaute aus Allgemeine Java-Themen 17
V Applet trotz Ausnahme blockiert Allgemeine Java-Themen 0
G Nullpointer trotz vorherigem Nullcheck Allgemeine Java-Themen 2
R Gleiche Objektreferenz trotz clone()? Allgemeine Java-Themen 12
S Erste Schritte Exception beendet Schleife nicht - Methode macht trotz throw weiter? Allgemeine Java-Themen 9
T SecurityException trotz signierten JAR? Allgemeine Java-Themen 11
I HashMap key wird nicht erkannt trotz überschriebener equals/hashCode Methode Allgemeine Java-Themen 6
C Schleife mit leerem Anweisungsblock wird trotz erfüllter Bedingung nicht verlassen Allgemeine Java-Themen 9
B Input/Output Datei noch geöffnet trotz Close Allgemeine Java-Themen 4
M Webstart Exception trotz signierten JARs Allgemeine Java-Themen 3
U DLLs werden nicht gefunden trotz Pfad: Allgemeine Java-Themen 4
R java in der konsole nicht gefunden trotz jre,jdk,home und path Allgemeine Java-Themen 4
D Java Heap error trotz anpassungen mit -xmx Allgemeine Java-Themen 4
S Fenster "verschwindet" nicht, trotz setVisible(false); Allgemeine Java-Themen 22
M Radianwert wiederholt sich trotz unterschiedlicher zufälliger Koordinaten Allgemeine Java-Themen 6
P not enough space for object heap - Trotz mehr RAM? Allgemeine Java-Themen 6
J Wie die gleichzeitige Ausführung mehrerer Tasks trotz Multithreading verhindern? Allgemeine Java-Themen 2
B Trotz fat_jar NoClassDefFounError Allgemeine Java-Themen 4
H2SO3- Date "18.11.2002 20:02:33" trotz Locale.GERMAN nic Allgemeine Java-Themen 9
T Security-Exception trotz gegebener Rechte? Allgemeine Java-Themen 3
Saxony Blocked GUI trotz Thread(s) Allgemeine Java-Themen 2
G Leere Datei mit PrintWriter trotz flush und close Allgemeine Java-Themen 8
X Softwareverkauf trotz Lizens Allgemeine Java-Themen 5
G Trotz Generics Cast-Fehler! Allgemeine Java-Themen 5
R ConcurrentModificationException trotz synchronized? Allgemeine Java-Themen 12
H NullPointerException trotz Abfangen von null? Allgemeine Java-Themen 9
P Trotz setModal, der JDialog ist nicht modal ? Allgemeine Java-Themen 18
A Kein finally ausführen trotz verlassen des try blocks? Allgemeine Java-Themen 14
G JFileChooser öffnet sich nicht im Browser ( trotz Signatur ) Allgemeine Java-Themen 10
R Bild wird trotz allem einfach nicht angezeigt. - AHHHHH!!!!! Allgemeine Java-Themen 30
M Bild wird trotz MediaTracker nicht oder nur halb gezeichnet Allgemeine Java-Themen 2

Ähnliche Java Themen

Neue Themen


Oben