# Erstes JSF Beispiel [http-apr-8080-exec-8]



## lill (8. Mai 2012)

Hi,

ich Versuche gerade mehr oder weniger meine erste JSF Seite zu schreiben. 
Möchte eine Tabelle auf der Seite anzeigen.

Meine Seite sieht so aus:


```
<?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:f="http://java.sun.com/jsf/core"
        xmlns:h="http://java.sun.com/jsf/html"
        xmlns:p="http://primefaces.prime.com.tr/ui">
	<head>
		<title>Book</title>
	</head>
	<body>		
	    <p:dataTable id="booksTable" var="book" value="#{tableBean.books}"
                 paginator="true" rows="15" paginatorPosition="top"
                 paginatorTemplate="{CurrentPageReport}  {FirstPageLink} {PreviousPageLink} {PageLinks} {NextPageLink} {LastPageLink} {RowsPerPageDropdown}"
                 rowsPerPageTemplate="5,10,15">
        <p:column>
            <f:facet name="header">
                <h:outputText value="isbn"/>
            </f:facet>
            <h:outputText value="#{book.isbn}"/>
        </p:column>

        <p:column>
            <f:facet name="header">
                <h:outputText value="author"/>
            </f:facet>
            <h:outputText value="#{book.author}"/>
        </p:column>

        <p:column>
            <f:facet name="header">
                <h:outputText value="title"/>
            </f:facet>
            <h:outputText value="#{book.title}"/>
        </p:column>
    </p:dataTable>	

		</h:form>
	</body>
</html>
```

und hier die Bean dazu:


```
public class Table {

	private static Logger log = LoggerFactory.getLogger(Table.class);
	
    private List<Book> books = new ArrayList<Book>();
    private ListDataModel booksModel;


    private String beanName;

    public Table() {
    	log.error("DataTableBean");
        for (int i = 0; i < 10000 ; i++) {
            books.add(new Book("isbn" + i, "author" + i, "title" + i));
        }
        booksModel = new ListDataModel(books);
    }

    public void addBooks(){
    	log.error("ADD");
        for (int i = 0; i < 10000 ; i++) {
            //books.add(new Book("isbn" + i, "author" + i, "title" + i));
            books.remove(books.size()-1);
        }
    }

    
    public List<Book> getBooks() {
        //log.error(beanName);
        return books;
    }

    public String getBeanName() {
        return beanName;
    }

    public void setBeanName(String beanName) {
        this.beanName = beanName;
    }

    public ListDataModel getBooksModel() {
        return booksModel;
    }

    public void setBooksModel(ListDataModel booksModel) {
        this.booksModel = booksModel;
    }
    
}
```

Im Browser, wenn ich die Seite aufrufe bekomme ich jetzt den Fehler:

null source


```
java.lang.IllegalArgumentException: null source
	at java.util.EventObject.<init>(EventObject.java:56)
	at javax.faces.event.SystemEvent.<init>(SystemEvent.java:67)
	at javax.faces.event.ComponentSystemEvent.<init>(ComponentSystemEvent.java:69)
	at javax.faces.event.PostRestoreStateEvent.<init>(PostRestoreStateEvent.java:69)
	at com.sun.faces.lifecycle.RestoreViewPhase.deliverPostRestoreStateEvent(RestoreViewPhase.java:256)
	at com.sun.faces.lifecycle.RestoreViewPhase.execute(RestoreViewPhase.java:245)
	at com.sun.faces.lifecycle.Phase.doPhase(Phase.java:97)
	at com.sun.faces.lifecycle.RestoreViewPhase.doPhase(RestoreViewPhase.java:107)
	at com.sun.faces.lifecycle.LifecycleImpl.execute(LifecycleImpl.java:114)
	at javax.faces.webapp.FacesServlet.service(FacesServlet.java:308)
	at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:305)
	at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:210)
	at org.apache.catalina.core.StandardWrapperValve.invoke(StandardWrapperValve.java:224)
	at org.apache.catalina.core.StandardContextValve.invoke(StandardContextValve.java:169)
	at org.apache.catalina.authenticator.AuthenticatorBase.invoke(AuthenticatorBase.java:472)
	at org.apache.catalina.core.StandardHostValve.invoke(StandardHostValve.java:168)
	at org.apache.catalina.valves.ErrorReportValve.invoke(ErrorReportValve.java:98)
	at org.apache.catalina.valves.AccessLogValve.invoke(AccessLogValve.java:927)
	at org.apache.catalina.core.StandardEngineValve.invoke(StandardEngineValve.java:118)
	at org.apache.catalina.connector.CoyoteAdapter.service(CoyoteAdapter.java:407)
	at org.apache.coyote.http11.AbstractHttp11Processor.process(AbstractHttp11Processor.java:987)
	at org.apache.coyote.AbstractProtocol$AbstractConnectionHandler.process(AbstractProtocol.java:579)
	at org.apache.tomcat.util.net.AprEndpoint$SocketProcessor.run(AprEndpoint.java:1805)
	at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1110)
	at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:603)
	at java.lang.Thread.run(Thread.java:722)
```

könnte mir vll jemand weiterhelfen?


----------



## Fant (8. Mai 2012)

Welche JSF-Implementierung wird verwendet
Welche Tomcat-Version benutzt du?
Die web.xml und die faces-config.xml könnten auch noch interessant sein.

Dieso (oder auch nur eine sehr ähnliche?) Fehlermeldung hab ich schon ab und an mal in irgendwelchen Foren gesehen. Das lag meist daran, dass eine verbuggte Mojarra-Version benutzt wurde. Ab 2.1.x wurde das gefixt. Wenn das noch nicht hilft, dann melde dich einfach mit dem oben genannten Informationen noch mal wieder.

Aber vielleicht hat ja auch so noch jemand eine andere Idee... :>

Gruß Fant


----------



## lill (8. Mai 2012)

ok, ähm:
jsf-api und impl 2.0.3
tomcat 7.0.25

web.xml:

[XML]
<?xml version="1.0" encoding="UTF-8"?>
<web-app 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"
        version="2.5">

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

	<!-- Faces Servlet Mapping -->
	<servlet-mapping>
		<servlet-name>Faces Servlet</servlet-name>
		<url-pattern>*.jsf</url-pattern>
	</servlet-mapping>

	<!-- Welcome files -->
	<welcome-file-list>
		<welcome-file>index.html</welcome-file>
	</welcome-file-list>

    <context-param>
        <param-name>javax.faces.PROJECT_STAGE</param-name>
        <param-value>Development</param-value>
    </context-param>

</web-app>

[/XML]

faces-config:
[XML]
<?xml version="1.0"?>
<faces-config version="2.0" xmlns="http://java.sun.com/xml/ns/javaee"
 xmlns:xi="http://www.w3.org/2001/XInclude"
 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-facesconfig_2_0.xsd">
 <managed-bean>
  <managed-bean-name>tableBean</managed-bean-name>
  <managed-bean-class>test.Table</managed-bean-class>
  <managed-bean-scope>application</managed-bean-scope>
 </managed-bean>
</faces-config>
[/XML]


----------



## lill (8. Mai 2012)

ok, habe jetzt die jsf jars ausgetauscht zu

jsf-api und impl 2.1.7.jar

der Fehler ist jetzt weg. bekomme jetzt folgender Fehler


```
Caused by: java.lang.IllegalStateException: Cannot create a session after the response has been committed
```


----------



## JimPanse (8. Mai 2012)

statt

1. Statt head ->  <h:head> verwenden
2. Du schließt ein form tag öffnest es aber nie -> um die datatable ein h:form Komponente
2. Die Klasse muss serialisiert sein -> außer bei RequestScope
3. Die Exception sagt aus das die Seite erstellt wird ohne eine gültige Session
3.1 Entweder 
[XML]
<context-param>
    <param-name>javax.faces.STATE_SAVING_METHOD</param-name>
    <param-value>client</param-value>
</context-param>
[/XML]
3.2 oder ein index.html Seite mit

```
<html>
	<head>
		<meta http-equiv="Refresh" content="0; URL=index.jsf">
	</head>
</html>
```

Greetz


----------



## lill (8. Mai 2012)

@JimPanse:
Danke, das hat mal das gröbste gelöst

ok,
zu 2.: sry, ist beim kopieren passiert

hab jetzt h:head (und auch h:body, richtig?) verwendet. Die Bean hab ich in der faces-config auf request gestellt und hab den context-paramter javax.faces.STATE_SAVING_METHOD mit in die web.xml aufgenommen

die Seite funktionierniet jetzt, also die Tabelle wird angezeigt, allerdings bekomme ich jetzt wieder auf der Konsole:


```
Schwerwiegend: Unable to determine URL for WEB-INF/classes
javax.naming.NameNotFoundException: Resource /WEB-INF/classes not found
at org.apache.naming.resources.BaseDirContext.listBindings(BaseDirContext.java:733)
....
.....
ERROR tableBean
08.05.2012 09:49:57 test.Table [http-apr-8080-exec-6]
```

und das wird auch jedesmal wieder ausgegeben wenn ich in der Tabelle blättere
(also mit verschiedenen Zahlen hinten dran [http-apr-8080-exec-X])

das
javax.naming.NameNotFoundException: Resource /WEB-INF/classes not found
hab ich nur bei google gefunden in Verbindung von Tomcat und dem Maven plugin, aber das
benutze ich nicht.
Und ansonsten, wenn ich meine war anschaue, gibts da den Ordner WEB-Inf mit dem Ordner classes drin


----------



## JimPanse (8. Mai 2012)

Ist in dem /WEB-INF/classes auch die Klasse Table?


----------



## JimPanse (8. Mai 2012)

Achja mit dem serialisieren bedeutete nicht das du die Klasse in den RequestScope legen muss. Einfacher wäre es auch Annotation zu benutzen. Ein guter Überblick bieten diese Refcards:

JSF 2.0: Annotations, New Navigation Eliminate XML Configuration - Developer.com

Greetz


----------



## lill (8. Mai 2012)

ja, Klasse Table ist im classes Ordner

hier jetzt die veränderte Klasse Table

```
@ManagedBean(name="tableBean")
@RequestScoped
public class Table implements Serializable{

	private static Logger log = LoggerFactory.getLogger(Table.class);
	
    private List<Book> books = new ArrayList<Book>();
    private ListDataModel booksModel;


    private String beanName;

    public Table() {
    	log.error("DataTableBean");
        for (int i = 0; i < 10000 ; i++) {
            books.add(new Book("isbn" + i, "author" + i, "title" + i));
        }
        booksModel = new ListDataModel(books);
    }

    public void addBooks(){
    	log.error("ADD");
        for (int i = 0; i < 10000 ; i++) {
            //books.add(new Book("isbn" + i, "author" + i, "title" + i));
            books.remove(books.size()-1);
        }
    }

    
    public List<Book> getBooks() {
        //log.error(beanName);
        return books;
    }

    public String getBeanName() {
        return beanName;
    }

    public void setBeanName(String beanName) {
        this.beanName = beanName;
    }

    public ListDataModel getBooksModel() {
        return booksModel;
    }

    public void setBooksModel(ListDataModel booksModel) {
        this.booksModel = booksModel;
    }
    
}
```

Fehler kommt immernoch


----------



## JimPanse (9. Mai 2012)

Was für ein Projekt hast du den aufgesetzt bzw welche IDE benutzt du?

Wenn eclipse schau dir dann google mal nach dynamic web project

Help - Eclipse Platform

ansonsten kann ich dir bei der fehlermeldung leider auch nicht weiterhelfen.

Greetz


----------



## lill (9. Mai 2012)

ok, danke. Ich schau mal. Sag bescheid wenn ich den Fehler gefunden hab


----------

