# [JSF 2.0] Ausgabe aus Schleife bzw. einer ArrayList



## alberti (3. Sep 2010)

Hallo zusammen,

ich beziehe aus einer Schleife folgendes:

```
while(true){
		++i;
		System.out.println(sf.title);
		System.out.println(sf.path2Ressource);
		System.out.println(sf.relevance);
		System.out.println(sf.summary+ "\n\n");
		if(i >= al.size())
			break;
		sf = al.get(i);
	}
```
*Anmerklung:* al ist dabei eine ArrayList aus der ich die Objekte mit den Werten hole.
Bisher sah die Ausgabe auf der Konsole wie oben zu sehen ist aus und funktioniert auch einwandfrei.

Nun ist meine Frage, wie ich diese Werte mittels JSF ausgeben kann, so da diese alle auf der Webseite dargestellt werden?


*Nachtrag (Dies könnte hier ein alternativ Lösungsweg für mein Problem sein, d.h. ne Lösung für Ausgabe aus Schleife, würde ich immer noch bevorzugt nehmen )*

Ich habe gelesen, das dies u.a. mit  dem <:dataTable-Tag geht. Allerdings gibt es bei mir hier ein paar Probleme.
Hierfür muss ich meine Struktur erklären.
Ich habe eine Klasse HauptStruktur diese wird von einer Klasse SpeziellenStruktur erweitert (extends HauptStruktur).
Dann habe ich wiederum eine Klasse KonkreteStrukturErgebnis, welche wie folgt aussieht:

```
import java.util.ArrayList;
public class KonkreteStrukturErgebnis {
	private ArrayList<HauptStruktur> sb;
	
	
	public KonkreteStrukturErgebnis(){
		sb = new ArrayList<HauptStruktur >();
	}
	
	public void addHauptStruktur (HauptStruktur sfr){
		sb.add(sfr);
	}
	
	public ArrayList<HauptStruktur > getHauptStruktur (){
		return this.sb;
	}

}
```

Diese ist sozusagen meine Struktur, welche eine Liste (genauer ArrayList) von HauptStruktur darstellt und in meinem Fall dazu benutzt als Liste für meine SpeziellenStrukturen (es gibt mehrere) zu dienen.
Dann habe ich eine Klasse EnterpriseSchicht (dies ist eine Klasse für meine Anfragen für meine Enterprise Suche). Dann habe ich eine Klasse Core in welcher wie folgt aussieht:

```
public class Core {
	
	final private String host = "localhost";
	
	final private int port = 10000;

	private KonkreteStrukturErgebnis csr;
	public void setSearch(String queryString) throws Exception{
		AbstractSchicht aal = new EnterpriseSchicht(); 

		
		this.csr = aal.response(aal.doConnection(aal.connectionDetails(this.host, this.port)), aal.queryParameters(queryString));
		
		
	}
	
	public KonkreteStrukturErgebnis getSearch(){
		return this.csr;
	}
```

Der Aufbau ist absichtlich so, um einzelne Teile schnell erweitern bzw. ändern zu können ohne alles neu schreiben zu müssen.
Das Bean sieht wie folgt aus:


```
import javax.faces.bean.ManagedBean;
import javax.faces.bean.SessionScoped;
import javax.faces.context.FacesContext;

@ManagedBean
@SessionScoped
public class SearchBean {
private String searchWord;
private Core mycore = new Core();




public Core getMyCore(){
	return this.mycore ;
}




public void setSearchWord(String searchWord)  {
	this.searchWord = searchWord;
}

public String dosearch() throws Exception{
	
		this.mycore.setSearch(this.searchWord );
	
	return null;
}

public String getSearchWord() {
	return searchWord;
}

public String getA() {
	return searchWord;
}



}
```

Und und nun das Facelet was nicht funktionieren will:
[XML]<h:dataTable var="core" value="#{searchBean.mycore.search}">
            <h:column>
                    <hutputText value="#{core.titel}"/>

            </h:column>
            <h:column>
                <hutputText value="#{core.path2Ressource}"/>
            </h:column>
            <h:column>

                <hutputText value="#{core.relevance}"/>
            </h:column>
            <h:column>

                <hutputText value="#{core.summary}"/>
            </h:column>
        </h:dataTable>[/XML]

Es es will mir nicht in den Kopf, warum das Ganze nicht so funktioniert, wie ich es hier dargestellt habe bzw. wie ich eben auch entwickelt habe???:L

Ich hoffe einer von euch weiß Rat




Beste Grüße und besten Dank,

alberti


----------



## alberti (3. Sep 2010)

Hallo zusammen,

mittlerweile habe ich das Ausgeben lösen können:
[XML]....
<h:dataTable var="core" value="#{searchBean.mycore.search.hauptStruktur}">
...
[/XML]

Jetzt muss noch die richtig Ausgabe formatiert werden (das ist kein Problem). Allerdings habe ich jetzt bei der Ausgabe das Problem, dass das letzte Element (Suchresultat/SpeziellenStruktur) 2mal ausgegeben wird.
Das Problem hatte ich bei der Konsolenausgabe auch gehabt, konnte es aber wie in der Schleife oben zu sehen lösen.

Hoffe mir kann da jmd. weiterhelfen


----------



## gman (3. Sep 2010)

Hi,

kleine Anmerkung zu deinem ersten Code-Beispiel: Wäre sowas nicht einfacher:


```
for(<Typ_von_sf> sf : al) {
    System.out.println(sf.title);
    System.out.println(sf.path2Ressource);
    System.out.println(sf.relevance);
    System.out.println(sf.summary+ "\n\n");
  }
```

Ich weiss jetzt nicht von welchem Typ die Variablen "al" und "sf" sind, aber
es scheint ja zu passen.


----------



## alberti (8. Sep 2010)

Hi,

danke für Deine Antwort  Ist in der Tat so einfacher und schöner.
Die Ausgabe an sich funktioniert, nur hätte ich gerne eine etwas andere Darstellung der Daten.
Derzeit sieht diese wie folgt aus:


```
<td>Titel</td><td>Relevanz</td><td>Pfad</td><td>Zusammenfassung</td>
```

ich hätte allerdings gerne solch eine Darstellung:

```
<tr><td>Titel</td><td>Relevanz</td></tr><tr>Pfad</tr><tr>Zusammenfassung</tr>
```

nur wie kann das realisieren, immerhin habe ich kein <h:row-Element???:L


----------



## gman (8. Sep 2010)

Hmm,

dann musst du wohl über deine Hauptstruktur iterieren und dir deine Tabelle selber zusammenbasteln. Weiss
jetzt grad nicht welches Tag fürs iterieren gut ist, aber da gibts was ;-) Also ungefähr so:


```
<iteratorTag var="core" value="#{searchBean.mycore.search.hauptStruktur}">
        <tr>
            <td>Titel</td><td>Relevanz</td>
        </tr>
        <tr>
            <td>Pfad</td><td>Zusammenfassung</td>
        </tr>
    </iteratorTag>
```


----------



## alberti (8. Sep 2010)

Hi,

habe die Darstellung jetzt hinbekommen mittels PrimeFaces bzw. <p:dataTable:

```
<p:dataTable rendered="#{searchBean.searched}" var="core" value="#{searchBean.jesl.search.structResult}"
			selection="#{searchBean.jesl.result}"
			selectionMode="cellblock">
			
			
			<p:column>
				<p:panel header="#{core.title}">
					<h:panelGrid columns="1" border="0" style="width:100%">
						
							<h:outputText value="#{core.summary}" style="color:#006633;" />
						

						
							<h:outputText value="#{core.path2Ressource}"
								style="color:#003366;text-decoration: underline;" />
						

						<h:outputLabel value="Relevanz: "
							style="font: small-caps bold 1em/1.5em verdana, sans-serif;" >
							<h:outputText value="#{core.relevance}" /></h:outputLabel>
					</h:panelGrid>
				</p:panel>


			</p:column>


		</p:dataTable>
```

Allerdings tun sich hier immer noch 2 (kleine) Problem auf:

*Problem 1 - nun gelöst*
Das erste Problem ist das sobald ich die einen neue Eingabe mache zum Suchen das ich folgenede Meldung erhalte:

```
exception

javax.servlet.ServletException
	javax.faces.webapp.FacesServlet.service(FacesServlet.java:325)

root cause

java.lang.NullPointerException
	java.lang.reflect.Array.newArray(Native Method)
	java.lang.reflect.Array.newInstance(Array.java:52)
	org.primefaces.component.datatable.DataTableRenderer.decodeMultipleSelection(DataTableRenderer.java:174)
	org.primefaces.component.datatable.DataTableRenderer.decodeSelection(DataTableRenderer.java:151)
	org.primefaces.component.datatable.DataTableRenderer.decode(DataTableRenderer.java:63)
	javax.faces.component.UIComponentBase.decode(UIComponentBase.java:790)
	javax.faces.component.UIData.processDecodes(UIData.java:980)
	org.primefaces.component.datatable.DataTable.processDecodes(DataTable.java:379)
	javax.faces.component.UIComponentBase.processDecodes(UIComponentBase.java:1042)
	javax.faces.component.UIComponentBase.processDecodes(UIComponentBase.java:1042)
	javax.faces.component.UIViewRoot.processDecodes(UIViewRoot.java:941)
	com.sun.faces.lifecycle.ApplyRequestValuesPhase.execute(ApplyRequestValuesPhase.java:78)
	com.sun.faces.lifecycle.Phase.doPhase(Phase.java:101)
	com.sun.faces.lifecycle.LifecycleImpl.execute(LifecycleImpl.java:118)
	javax.faces.webapp.FacesServlet.service(FacesServlet.java:312)
```

Ich verstehe beim besten Willen nicht, woher der Fehler kommt:bahnhof:.

*Problem 2*
Das zweite Problem ist, das ich keinen Rand im <hanelGrid haben möchte (daher auch border=0) allerdings ist überall (im panelGrid also in der Tabelle) ein Rand  zu sehen.???:L


Ich hoffe einer von euch kann mir heir weiterhelfen



*Update*
Problem 1 konnte ich lösen, die Bean war als SessionScope deklariert nun habe ich das auf RequestScope geändert und es funktioniert.


----------



## gman (8. Sep 2010)

Pack die Style-Informationen für den Rand auch mal in das "style"-Attribut:


```
<h:panelGrid columns="1" style="width:100%; border: 0px;">
```


----------



## Cage Hunter (9. Sep 2010)

Primefaces neigt dazu solche Styleinformationen zu..."überlesen"^^
Häng also nen !important ran, wenn's ohne nicht gehen will


----------



## alberti (9. Sep 2010)

Hi,

erstmal Danke für eure Schnellen Antworten ,

@Cage Hunter
Was meinst du mit !important, wie und wo genau muss ich das ran hängen?


Besten Dank, alberti


----------



## Cage Hunter (9. Sep 2010)

Guckst du da
Geht einfach nur darum, dass du das von Primefaces vorgegebene Design überschreibst...


----------

