Wie komme ich an die Werte in einem DataModel?

ceene

Erfahrenes Mitglied
Hallo alle zusammen.

Ich habe ein Problem mit meinem DataModel. Ich arbeite mit Eclipse, JBoss 4.2 und Seam.

Ich habe eine Seite auf der Daten in einem "h:dataTable" dargestellt werden. Das t soweit auch sehr gut. Wenn ich nun allerdings eine Datenzeile auswählen will und mir den RowIndex anzeigen lassen will, dann bekomme ich den Fehler "-1".

Wie komme ich nun an meine ausgewählten Daten?

Bei Aktivierung des Buttons "ok" zur Auswahl eines Datensatzes wird die Funktion "select()" ausgeführt.

Die xhtml-Seite
Code:
<!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:ui="http://java.sun.com/jsf/facelets"
      xmlns:h="http://java.sun.com/jsf/html"
      xmlns:f="http://java.sun.com/jsf/core"
      xmlns:s="http://jboss.com/products/seam/taglib"> 

<head>
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8" />
<link type="text/css" rel="stylesheet" href="../style.css" />
<title>Thomas Cook - Dialogpflege der Adressclearing-Datenbank</title>
</head>

<body>

<table width="100%">
<tr><td>
	<h4 style="line-height: 2">HWplz - Postalische Bereinigung  Deutschland</h4>
	<h5 style="line-height: 1.5">- Straßen-Auswahlliste -</h5>
</td>

<td style="text-align: center" valign="middle">
	<h:graphicImage value="/images/HW-Soft_logo.jpg"/>
</td></tr>
</table>


<h:form id="DLGStrAusw">
<h:messages styleClass="errorMsg"/>

<fieldset class="usrFormPos">
<legend>Anzahl gefundener Sätze: #{strhdl.strassen.rowCount}</legend>	
    <h:dataTable value="#{strhdl.strassen}" var="str" 
    	headerClass="usrDataHeader"
    	rowClasses="usrDataRow1,usrDataRow2"
    	columnClasses="usrDataColScore,usrDataColPlz,usrDataColOrt,usrDataColStr,usrDataColHsBreich,usrDataColOrt">
        <h:column>
    		<f:facet name="header">    		
    			<h:outputLabel value="%"/>
    		</f:facet>    		
    		<h:outputText value="#{str.score}" />
        </h:column>
        <h:column>
    		<f:facet name="header">
    			<h:outputLabel value="Plz"/>
    		</f:facet>
    		<h:outputText value="#{str.plz}" />
        </h:column>
        <h:column>
    		<f:facet name="header">
    			<h:outputLabel value="Ort"/>
    		</f:facet>
    		<h:outputText value="#{str.ort}" />
        </h:column>
        <h:column>
    		<f:facet name="header">    			
 				<h:outputLabel value="Straße"/>
    		</f:facet>
   			<h:outputText value="#{str.strasse}" />
        </h:column>
        <h:column>
    		<f:facet name="header">
    			<h:outputLabel value="Hsnr.-Ber."/>
    		</f:facet>
    		<h:outputText value="#{str.hsnrbereich}" />
        </h:column>
        <h:column>
    		<f:facet name="header">
    			<h:outputLabel value="Ortsteil"/>
    		</f:facet>
    		<h:outputText value="#{str.ortsteil}" />
        </h:column>
        <h:column>
            <s:button value="ok" action="#{strhdl.select}" styleClass="usrFormSubmitOk"/>  
        </h:column>
        
    </h:dataTable>
</fieldset>
</h:form>
</body>
</html>

Die java-Seite
Code:
import java.util.ArrayList;
import java.util.List;

import javax.ejb.*;
import javax.faces.context.FacesContext;
import javax.faces.model.DataModel;
import javax.faces.model.ListDataModel;
import javax.faces.event.ValueChangeEvent;
import org.jboss.seam.log.Log;
import org.jboss.seam.annotations.*;
import org.jboss.seam.ScopeType;
import org.jboss.seam.core.FacesMessages;
import hwplz_d.ejb.HWplz_DBeanRemote;
import hwname_pd.ejb.HWname_PDBeanRemote;
import tcdlgejb.*;
import tcdlgsbi.*;


@Stateful
@Name("strhdl")
@Scope(ScopeType.EVENT) 
public class StrasseHandler implements StrasseHandlerLocal {

	static private String inStr;
	static private String inPlz;
	static private String inOrt;
	
	@EJB
	private KundeHandlerLocal kundehdl;
	
	@EJB
	private HWplz_DBeanRemote hwplz_d; 
	
	@EJB
	private HWname_PDBeanRemote hwname_d;
	
	@EJB
	private ToolRemote toolBean;

	@Logger
	private Log log;

	private Kunde kunde;
	private DataModel datamodel_in;
	private static DataModel datamodel;
	private int rowIndex = -2;        
	
	/*
	 * Rückgabe der gefundenen Straßen
	 */
	public DataModel getStrassen() {        
		
		if(datamodel == null) {            
			datamodel = new ListDataModel();            
			datamodel.setWrappedData(getStrassenListe());        
		}                
		return datamodel;     
	}        
	
	/*
	 * Straßen in Liste übernehmen
	 */
	private List getStrassenListe() {       
		
		String h_ort = "";
		String h_str = "";
		String h_hsber = "";        

		List getStrassenListe = new ArrayList();        

 		try { 
			// Alle Strassen aus der Bean in die Liste übernehmen
			for (int i=1;i < Integer.parseInt(hwplz_d.getAnzAuswahl());i++) {

				//log.info(hwplz_d.getOrtInaktiv(i));
				
				// Ortstext ev. verkettet?
		        if (hwplz_d.getOrtInaktiv(i).length() != 0)
		        	h_ort = hwplz_d.getOrtInaktiv(i) + " -> " + hwplz_d.getOrtKurz(i);
		        else
		        	h_ort = hwplz_d.getOrtKurz(i);
				
		        // Straßentext ev. verkettet?
		        if (hwplz_d.getStrasseInaktiv(i).length() != 0)
		            h_str = hwplz_d.getStrasseInaktiv(i) + " -> " + hwplz_d.getStrasseKurz(i);
		        else
		        	h_str = hwplz_d.getStrasseKurz(i);

		        // Hausnummernbereich oder Postfachnummer-Bereich ev. verkettet
		        if (hwplz_d.getHausnrBereichInaktiv(i).length() != 0)
		            h_hsber = hwplz_d.getHausnrBereichInaktiv(i) + " -> " + hwplz_d.getHausnrBereich(i);
		        else if (hwplz_d.getHausnrBereich(i).length() != 0)
		            h_hsber = hwplz_d.getHausnrBereich(i);
		        else if (hwplz_d.getPostfachBereich(i).length() != 0)
		        {
		        	h_hsber = hwplz_d.getPostfachBereich(i).substring(0,6) + " - " +
		        			  hwplz_d.getPostfachBereich(i).substring(6,12);
		        }
						
		        // Werte in die Liste übernehmen
		        getStrassenListe.add(new Strasse(hwplz_d.getPunkte(i), hwplz_d.getPLZ(i), hwplz_d.getPLZTyp(i), 
						                         h_ort, h_str, h_hsber, hwplz_d.getOrtsteil(i)));        
			}
		} 
		catch (Exception e) {
			log.info("Fehler in getStrassenListe()!");
			e.printStackTrace(); 
		};		
		return getStrassenListe;    
	}        
	
	/*
	 * Rückgabe der eingegebenen Straße
	*/
	public DataModel getStrasseIn() {        
		
		if(datamodel_in == null) {            
			datamodel_in = new ListDataModel();            
			datamodel_in.setWrappedData(getStrasseInListe());        
		}                
		return datamodel_in;     
	}        
	
	/*
	 * Eingegebene Straße in Liste übernehmen
	*/
	private List getStrasseInListe() {       
		
		List getStrasseInListe = new ArrayList();        

		try { 
				getStrasseInListe.add(new Strasse("  ",inPlz,"u",inOrt,inStr,"  ","  "));        
		} 
		catch (Exception e) {
			log.info("Fehler in getStrassenInListe()!");
			e.printStackTrace(); 
		};		
		return getStrasseInListe;    
	}        
	
	public int getSelectedRowIndex() {        		
		return rowIndex;    
	}        
	
	public String select() {        
		//boolean test = true;
		String test;
		System.out.println("DWS");
		try { 
			System.out.println("DWS1");
			kunde = kundehdl.getSelectedKunde();
			rowIndex = datamodel.getRowIndex();
			//test = datamodel.isRowAvailable();
		}
		catch (Exception e) {
			log.info("Fehler in select()!");
			e.printStackTrace(); 
		};		
		//System.out.println(rowIndex);
		return "/kunden/kunde-bearbeiten.xhtml";    
	}	

	public void strtextChanged (ValueChangeEvent vce) {
		if (vce.getOldValue() != vce.getNewValue()) {
			
			// Der Listener liegt hinter den Feldern Straße, Ort und PLZ.
			// D.h., wenn sich in einem der 3 Felder der Wert ändert, wird
			// das Flag gesetzt.
			toolBean.setAFlag(1);
			log.info("1");
		}
	}
	
	public void strtextChangedHWname (ValueChangeEvent vce) {
		if (vce.getOldValue() != vce.getNewValue()) {
			
			// Der Listener liegt hinter den Feldern Straße, Ort und PLZ.
			// D.h., wenn sich in einem der 3 Felder der Wert ändert, wird
			// das Flag gesetzt.
			log.info("HWname");
		}
	}
	
	public void hwname_abgleich(Kunde selectedKunde)	{
		String hwname_outStatus;
		String eingabeName = "";
		String nachname;
		
		try	
		{
			hwname_d.setEinLenAdrname(30);
			hwname_d.setEinLenPersanrede(30);
			hwname_d.setEinSteuerung("KV");
			if(selectedKunde.getTitel_V() != "")
			{
				if(selectedKunde.getTitel_V() != null)
				{
					eingabeName = selectedKunde.getTitel_V() + " ";
				}
			}
			if(selectedKunde.getVorname() != "")
			{
				if(selectedKunde.getVorname() != null)
				{
					eingabeName+= selectedKunde.getVorname() + " ";
				}
			}
			if(selectedKunde.getTitel_Z() != "")
			{
				if(selectedKunde.getTitel_Z() != null)
				{
					eingabeName+= selectedKunde.getTitel_Z() + " ";
				}
			}
			if(selectedKunde.getAdelspraedikat() != "")
			{
				if(selectedKunde.getAdelspraedikat() != null)
				{
					eingabeName+= selectedKunde.getAdelspraedikat() + " ";
				}
			}
			if(selectedKunde.getNachname() != "")
			{
				if(selectedKunde.getNachname() != null)
				{
					eingabeName+= selectedKunde.getNachname() + " ";
				}
			}
			if(selectedKunde.getNachsatzwort() != "")
			{
				if(selectedKunde.getNachsatzwort() != null)
				{
					eingabeName+= selectedKunde.getNachsatzwort();
				}
			}
			hwname_d.setEinName(eingabeName);
			int tmp = Integer.parseInt(hwname_d.Do_HWname_PD());
			if(tmp <= 31)
			{
				selectedKunde.setVorname(hwname_d.getNormVorname(0,0));
				nachname = hwname_d.getNormNachname1(0);
				String dummy = hwname_d.getNachname1(0);
				int t = dummy.length()-1;
				int z = dummy.length();
				if(dummy.substring(t,z).equals("-"))
				{
					nachname += "-";
				}
				else if(hwname_d.getNormNachname2(0)!= "")
				{
					nachname += " ";
				}
				nachname +=hwname_d.getNormNachname2(0);
				selectedKunde.setNachname(nachname);
				selectedKunde.setAdelspraedikat(hwname_d.getNormAdelspraedikat1(0));
				selectedKunde.setNachsatzwort(hwname_d.getNormNachsatzwort(0));
				
				for(int i = 0; i<=4; i++)
				{
					String test = hwname_d.getPositionTitel(0,i);
					if(hwname_d.getPositionTitel(0,i).equals("V"))
					{
						selectedKunde.setTitel_V(hwname_d.getNormTitel(0,i));
					}
					else if(hwname_d.getPositionTitel(0,i).equals("Z"))
					{
						selectedKunde.setTitel_Z(hwname_d.getNormTitel(0,i));
					}
				}
			}
			else
			{
				
			}
		}
		catch (Exception e) {
			e.printStackTrace(); 
		}		 
		toolBean.setAFlag(0);
		
	}

	public String hwplz_abgleich(Kunde selectedKunde) {

		String hwplz_d_outStatus;		
		
		// Muss ein Abgleich durchgeführt werden?
		if (toolBean.getAFlag() == 1) {
		   
			try { 
				hwplz_d.setSchwellwert("80");
				hwplz_d.setMaxAuswahl("100");
				hwplz_d.setSteuerung("K ");
				hwplz_d.setPLZ(selectedKunde.getPlz()); 
				hwplz_d.setOrt(selectedKunde.getOrt());
				hwplz_d.setStrasse(selectedKunde.getStrasse_Hsnr()); 

				// Werte für das Anzeigen der Eingabe speichern
				inPlz = selectedKunde.getPlz(); 
				inOrt = selectedKunde.getOrt();
				inStr = selectedKunde.getStrasse_Hsnr();
							
				hwplz_d_outStatus = hwplz_d.Do_HWplz_D();
			  			
				// Wurde ein eindeutiger Satz gefunden?				
				if (Integer.parseInt(hwplz_d_outStatus) < 100 && Integer.parseInt(hwplz_d_outStatus) != 30 &&
					(hwplz_d.getAnschriftArt(1) == "V" || Integer.parseInt(hwplz_d.getPunkte(1)) >= 90)) {

					selectedKunde.setStrasse_Hsnr(hwplz_d.getStrasseKurz(1) + " " +
							                      hwplz_d.getHausnrFormat(1));
					selectedKunde.setPlz(hwplz_d.getPLZ(1));
					selectedKunde.setOrt(hwplz_d.getOrtLang(1));
					selectedKunde.setOrtsteil(hwplz_d.getOrtsteil(1));
				}
				else if (Integer.parseInt(hwplz_d_outStatus) == 30) {
					FacesMessages.instance().add("Hausnummer falsch oder nicht angegeben!");
					selectedKunde.setAdressen_Sperre("Z");
				}
				else	
				{
					return "/kunden/strassen-auswahl.xhtml";					
				}
			} 
			catch (Exception e) {
				e.printStackTrace(); 
			};		 
			toolBean.setAFlag(0);
		}
		return "";
	}
	
	@Destroy
	@Remove
	public void destroy() {
	}
}
 
Mit < f : param> :


<h:column>
<h:commandLink id="Edit" actionListener="#{userAdminBean.editUser}">
<h:eek:utputText value="Details" />
< f : param id="editId" name="id" value="#{user.id}" />
</h:commandLink>
</h:column>
 
Zuletzt bearbeitet:
also in der Select würde ich noch mit getBean die aktuelle Bean holen damit er auch die Daten des Kunden bekommt.

Allerdings spreche ich dies immer überden ActionListener an

Hier mal ein Bsp.: So wie ich das gelöst habe, ich hoffe es hilft dir:

Code:
   public void showDetails(ActionEvent ev)
 UIData uiData = (UIData) ev.getComponent().getParent().getParent();
        User benutzer = (User) uiData.getRowData();
        UserDetails benutzerDetail = (UserDetails) FacesUtils.getBean("userDetails");

        benutzerDetail.setCurrentBenutzer(benutzer);
 
Zuletzt bearbeitet:
also in der Select würde ich noch mit getBean die aktuelle Bean holen damit er auch die Daten des Kunden bekommt.

Allerdings spreche ich dies immer überden ActionListener an

Hier mal ein Bsp.: So wie ich das gelöst habe, ich hoffe es hilft dir:

Code:
    UIData uiData = (UIData) ev.getComponent().getParent().getParent();
        User benutzer = (User) uiData.getRowData();
        UserDetails benutzerDetail = (UserDetails) FacesUtils.getBean("userDetails");

        benutzerDetail.setCurrentBenutzer(benutzer);

Was ist denn "ev" für eine Variable?
 
Das wichtigste hab vergessen:



public void editUser(ActionEvent event){

UIParameter component = (UIParameter) event.getComponent().findComponent("editId");
 
Zurück