Post Daten Abfangen

TheBigNeo

Mitglied
Hallo zusammen
Ich hoffe ich Poste das nicht am falschen Ort.

Kurzfassung:
Wie kann ich Post Daten mit Java abfangen und verarbeiten.


Etwas ausführlicher:

Ich habe folgendes Problem: (aber zuerst Erklärung)
Glassfish Server
Java und xhtml Files

Ich geh auf meine xhtml File (newBook.xhmtl) da habe ich input Boxen in die ich irgend was rein schreibe
dann Button erstellen, das erstellt mir in der DB einen neuen Eintrag.

Nun komme ich auf listBooks.xhtml da sehe ich alle Einträge in der DB.
Neben jedem Eintrag hat es eine Checkbox, die ist zum Löschen der Einträge gedacht.
Das Löschen erfolgt über die ID.

Wenn ich im Code fest codiert die ID die isch löschen will rein schreibe dann klappt das.


Jetzt zu meinem Problem:
Wenn ich die Checkboxen auswähle und dann auf Löschen klicke, werden die ID der Ausgewählten Einträge mit Post (aus irgend einem Grund) übergeben (habe ich mit FF HttP Fox herausgefunden das die Werte wirklich übergeben werden).

Ich möchte jetzt aber erreichen das wenn ich auf Löschen drücke diese Post Werte irgend wie in einer Liste oder Array gespeichert werden das ich diese anschliessend löschen kann.

Vielen Dank für eure Hilfe im Vorras.

Gruss
TheBigNeo

listBooks.xhtml Checkbox + Button Code:

[Java] <h:dataTable value="#{bookController.bookList}" var="bk">
<h:column>
<f:facet name="header">
<h:eek:utputText value="Loeschen" />
</f:facet>
<input type="checkbox" name="Buch" value="#{bk.ID}" /> #{bk.ID}
</h:column>


<h:commandButton name="Delete" value="Delete"
action="#{bookController.doDeleteBook}" />
</h:form>
[/code]

bookController Lösch Code:

Java:
 // Delete a Book
  public String doDeleteBook() {
    log.debug("####called");
     Long ID = 306L;

    bookEJB.deleteBook(ID);
    bookList = bookEJB.findBooks();
    log.debug("####complete");
    return "listBooks.xhtml";
  }
 

GuPhisch

Mitglied
Hi,

Du müsstest so auf die Daten im Request zugreifen können:
Java:
Map<String, Object> requestMap = FacesContext.getCurrentInstance().getExternalContext().getRequestMap();

Musst Dir dann nur die richtigen aus der Map rausholen.
 
M

maki

Gast
Du nutzt JSF, da solltest du keinen Notwendigkeit haben selber mit den Postdaten zu hantieren, ManagedBeans und so...

Jetzt zu meinem Problem:
Wenn ich die Checkboxen auswähle und dann auf Löschen klicke, werden die ID der Ausgewählten Einträge mit Post (aus irgend einem Grund) übergeben (habe ich mit FF HttP Fox herausgefunden das die Werte wirklich übergeben werden).

Ich möchte jetzt aber erreichen das wenn ich auf Löschen drücke diese Post Werte irgend wie in einer Liste oder Array gespeichert werden das ich diese anschliessend löschen kann.
Ja, ist richtig so.
Nicht-ausgewählte Checkboxen werden nicht übertragen.
 

GuPhisch

Mitglied
Hi,

um Map zu verwenden musst Du java.util.Map importieren. Mit
Java:
nameDerMapVariablen.get("keyDesGewuenschtenWertes")
kannst Du dir dann die gewünschten Objekte aus der Map holen.

MfG
GuPhisch
 

TheBigNeo

Mitglied
Hallo
Klappt nicht :(
Der Post Wert ist da aber kann nicht abgefragt werden

BookController Lösch Code:

Java:
// Delete a Book
  public String doDeleteBook() {
    log.debug("####DO DELETE START !!!!!!!!!!!!");
    log.debug("####called");
    Long ID = 306L;

    Map<String, Object> requestMap = FacesContext.getCurrentInstance().getExternalContext().getRequestMap();

    Object test = requestMap.get("Buch");
    log.debug("OBJECT " + test);
    ID = (Long)test; --> Führt zu 
   // ID = Long.parseLong( test.toString()); --> Führt zu NullPointerException
    log.debug("Long " + ID);

    bookEJB.deleteBook(ID);
    bookList = bookEJB.findBooks();
    log.debug("####complete");
    return "listBooks.xhtml";
  }

Server Log:
Code:
bookshelf.BookController.doDeleteBook() DEBUG: ####DO DELETE START !!!!!!!!!!!!
Code:
bookshelf.BookController.doDeleteBook() DEBUG: ####called
Code:
bookshelf.BookController.doDeleteBook() DEBUG: OBJECT null
Code:
bookshelf.BookController.doDeleteBook() DEBUG: Long null
Code:
Geht durch bis die Funktion fertig ist


javax.ejb.EJBException:
Code:
javax.faces.el.EvaluationException: javax.ejb.EJBException
Code:
Caused by: java.lang.IllegalArgumentException: An instance of a null PK has been incorrectly provided for this find operation.


java.lang.NullPointerException: (Nur bei
Code:
ID = Long.parseLong( test.toString());
)
Code:
javax.faces.el.EvaluationException: java.lang.NullPointerException
Code:
Caused by: java.lang.NullPointerException
 
Zuletzt bearbeitet:

Crian

Top Contributor
Ist denn ein
Code:
"Buch"
in deiner Map drin? Lass dir doch mal die Schlüssel/Werte der Map ausgeben.
 

TheBigNeo

Mitglied
Hallo

Nein, das ist Ja das Problem:

Server Log:
Code:
bookshelf.BookController.doDeleteBook() DEBUG: ####DO DELETE START !!!!!!!!!!!!
Code:
bookshelf.BookController.doDeleteBook() DEBUG: ####called
Code:
bookshelf.BookController.doDeleteBook() DEBUG: OBJECT null
Code:
bookshelf.BookController.doDeleteBook() DEBUG: Long null
Geht durch bis die Funktion fertig ist

Code:
bookshelf.BookController.doDeleteBook() DEBUG: OBJECT null
<-- ist der Wert von MAP
 

TheBigNeo

Mitglied
Hey
Okay, dann habe ich dich wohl falsch verstanden.
Dachte
Code:
OBJECT
ausprinten bewirkt das.

Wie lass ich mir das denn ausgeben ?
 
D

duKennstMich

Gast
Guten Tag Herr Bart

Mit
Java:
requestMap.containsKey("Buch");
kannst du prüfen, ob "Buch" überhaupt übergeben wurde. (Gibt einen Boolean zurück.)
Mit
Java:
for(Object o : requestMap.values()){
        log.debug(o.toString);
}
kannst du alle Werte in deine Logdatei schreiben

Freundliche Grüsse
 

Crian

Top Contributor
Hast du mal in die Dokumentation von Map geschaut?

Ich hab dir mal ein kleines Beispielprogramm geschrieben:

Java:
package javaThings;

import java.util.HashMap;
import java.util.Map;
import java.util.Map.Entry;
import java.util.Set;

public class MapTest {

    public static void main(String[] args) {

        /* Map erzeugen: */
        Map<Integer, String> map = new HashMap<Integer, String>();
        map.put(1, "eins");
        map.put(2, "zwei");
        map.put(3, "drei");
        map.put(2, "vier");

        /* Liste der Schlüssel ausgeben: */
        System.out.println("Schlüssel:");
        for (Integer key : map.keySet())
            System.out.println("    " + key);

        /* Liste der Werte ausgeben: */
        System.out.println("Werte:");
        for (String value : map.values())
            System.out.println("    " + value);

        /* Liste der Paare ausgeben: */
        System.out.println("Paare:");
        Set<Entry<Integer,String>> set = map.entrySet();
        for (Entry<Integer,String> pair : set)
            System.out.println("    " + pair.getKey()
                    + " -> " + pair.getValue());
        System.out.println("");
    }

}


Mit der Ausgabe:
Code:
Schlüssel:
    1
    2
    3
Werte:
    eins
    vier
    drei
Paare:
    1 -> eins
    2 -> vier
    3 -> drei
 

TheBigNeo

Mitglied
Hallo
Das mit dem Ausgeben verstehe ich nicht ganz :(
Da das ganze bei mir auf einem Server über ne Page läuft
Code sieht momentan so aus:

Java:
// Delete a Book
  public String doDeleteBook() {
    log.debug("####DO DELETE START !!!!!!!!!!!!");
    log.debug("####called");
    
    Long ID = 1L;

    Map<String, Object> requestMap = FacesContext.getCurrentInstance().getExternalContext().getRequestMap();

    Object test = requestMap.get("Buch");

    Boolean b = requestMap.containsKey("Buch");
    log.debug("Boolean " + b);

    for (Object o : requestMap.keySet()) {
      log.debug(o.toString());
    }

    log.debug("book.getID() = "+book.getID());
    
    log.debug("OBJECT " + test);
    ID = (Long) test;
    // ID = Long.parseLong( test.toString());
    log.debug("Long " + ID);

    bookEJB.deleteBook(ID);
    bookList = bookEJB.findBooks();

    log.debug("####complete");
    return "listBooks.xhtml";
  }

Und ich weiss echt nicht weiter
 

TheBigNeo

Mitglied
Immer noch das gleiche im OBJECT steht immer noch null


Code:
bookshelf.BookController.doDeleteBook() DEBUG: ####DO DELETE START !!!!!!!!!!!!
Code:
bookshelf.BookController.doDeleteBook() DEBUG: ####called
Code:
bookshelf.BookController.doDeleteBook() DEBUG: Boolean false
Code:
bookshelf.BookController.doDeleteBook() DEBUG:m.sun.faces.context.ExternalContextFactoryImpl_KEY
Code:
bookshelf.BookController.doDeleteBook() DEBUG: bookController
Code:
bookshelf.BookController.doDeleteBook() DEBUG: book.getID() = null
Code:
bookshelf.BookController.doDeleteBook() DEBUG: OBJECT null
Code:
bookshelf.BookController.doDeleteBook() DEBUG: Long null
 
Zuletzt bearbeitet:
M

maki

Gast
*verschoben*

verstehe den Grund für dein Problem ehrlich gesagt nicht, JSF bietet bestimmt schon Möglichkeiten Checkboxen zu behandeln, ohne selber Postdaten auslesen zu müssen.
JSF ist bei mir schon ein paar Jahre her (und das ist gut so), sollte aber wie gesagt kein Grund sein, selber Postdaten auslesen zu müssen.

Google suche liefert Ergebnisse wie folgendes: How can I use the check box group in JSF to select the items of database and generate a list in the next page? - Stack Overflow

Ob das für deinen Fall passt weiss ich nciht, aber irgendwo wird sich ja etwas finden lassen.
 
M

maki

Gast
Halte das für eine Sache die zu den Basics gehört bei JSF, der Ansatz mit Postdaten auslesen halte ich für grundlegend falsch.
 

Final_Striker

Top Contributor
Schau dir mal die zweiten Lösungsvorschlag für "Select of Multiple Rows" an.

The BalusC Code: Using datatables

Das sollte bei dir funktionieren.

Du brauchst eine zusätzliche Map in der ein eindeutiger Identifier und ein Boolescherwert abgelegt werden.

Java:
<h:form>
    <h:dataTable value="#{myBean.dataList}" var="dataItem">
        <h:column>
            <f:facet name="header">
                <h:outputText value="Select" />
            </f:facet>
            <h:selectBooleanCheckbox value="#{myBean.selectedIds[dataItem.id]}" /> // <- Hier werden die Ids der Map hinzugefügt
        </h:column>

        ...
    </h:dataTable>

    <h:commandButton value="Get selected items" action="#{myBean.getSelectedItems}" />
</h:form>

-----------------------------------------------------------------------------------------------

public class MyBean {

    // Init --------------------------------------------------------------------------------------

    private List<MyData> selectedDataList;

    // Actions -----------------------------------------------------------------------------------

    public String getSelectedItems() {

        // Get selected items.
        selectedDataList = new ArrayList<MyData>();
        for (MyData dataItem : dataList) {
            if (dataItem.isSelected()) {
                selectedDataList.add(dataItem);
                dataItem.setSelected(false); // Reset.
            }
        }

        // Do your thing with the MyData items in List selectedDataList.

        return "selected"; // Navigation case.
    }

    // Getters -----------------------------------------------------------------------------------

    public List<MyData> getSelectedDataList() {
        return selectedDataList;
    }

}
 
Zuletzt bearbeitet:

GuPhisch

Mitglied
Hi,

Code:
dataList
ist eine Variable in der ManagedBean, auf die kann dann per Getter und Setter zugegriffen werden. In deinem Code hattest Du das ja schon mit
Code:
bookList
genutzt.

MfG
GuPhisch
 

TheBigNeo

Mitglied
Hallo

Aber, bei
Code:
bookList
kommt dann folgendes
Code:
Type mismatch: cannot convert from element type Book to MyData
Also welchen Typ muss die
Code:
dataList
haben :S
 

GuPhisch

Mitglied
Hi,

vieleicht postest Du einmal deinen geänderten Code der xhtml Seite und den des ManagedBeans. Dann sollte man bessere Aussagen darüber treffen können wo dein Fehler liegt.
 

TheBigNeo

Mitglied
Okay

listBooks.xhtml
Java:
<h:body>
	<h1>List of the books</h1>
	<hr />

	<h:form>
		<h:dataTable value="#{bookController.bookList}" var="bk">


			<h:column>
				<f:facet name="header">
					<h:outputText value="Select" />
				</f:facet>
				<h:selectBooleanCheckbox value="#{bookController.selectedIds[bk.id]}" /> // <- Hier werden die Ids der Map hinzugefügt
        </h:column>

		<h:commandButton name="Delete" value="Delete"
			action="#{bookController.doDeleteBook}" />
	</h:form>
	<hr />
</h:body>

bookController.java
Java:
 @EJB
  private BookEJB bookEJB;
  private Book book = new Book();
  private List<Book> bookList = new ArrayList<Book>();
  private List<Book> selectedBookList = new ArrayList<Book>();
  private List<MyData> selectedDataList;

public String getSelectedItems() {
    
    // Get selected items.
    selectedDataList = new ArrayList<MyData>();
   
    for (MyData dataItem : bookList) {
        if (dataItem.isSelected()) {
            selectedDataList.add(dataItem);
            dataItem.setSelected(false); // Reset.
        }
    }

    // Do your thing with the MyData items in List selectedDataList.

    return "selected"; // Navigation case.
}


 // ****************************************************************************************
  // Getters und Setters
  
  
  public List<MyData> getSelectedDataList() {
    return selectedDataList;
}

MyData.java
Java:
package ch.bbp.igt.bookshelf;

public class MyData {

  // Init --------------------------------------------------------------------------------------

  private boolean selected;

  // Getters -----------------------------------------------------------------------------------

  public boolean isSelected() {
      return selected;
  }

  // Setters -----------------------------------------------------------------------------------

  public void setSelected(boolean selected) {
      this.selected = selected;
  }

}
 

TheBigNeo

Mitglied
Niemand eine Idee ??

MyData.Java
Java:
package ch.bbp.igt.bookshelf;

public class MyData {

  // Init --------------------------------------------------------------------------------------

  private boolean selected;

  // Getters -----------------------------------------------------------------------------------

  public boolean isSelected() {
      return selected;
  }

  // Setters -----------------------------------------------------------------------------------

  public void setSelected(boolean selected) {
      this.selected = selected;
  }

}

listBooks.xhtml
Java:
<h:form>
		<h:dataTable value="#{bookController.bookList}" var="bk">

  
			<h:column>
				<f:facet name="header">
					<h:outputText value="Select" />
				</f:facet>
				<h:selectBooleanCheckbox value="#{bookController.selectedDataList[bk.ID]}" /> 
        </h:column>


  <h:commandButton value="Get selected items" action="#{bookController.getSelectedItems}" />


bookController.java
Java:
 public String getSelectedItems() {

    // Get selected items.
    selectedDataList = new ArrayList<MyData>();

    for (MyData dataItem : dataList) {
      if (dataItem.isSelected()) {
        selectedDataList.add(dataItem);
        dataItem.setSelected(false); // Reset.
      }
    }

    // Do your thing with the MyData items in List selectedDataList.

    doDeleteBook();
    
    return "selected"; // Navigation case.
  }

  // Delete a Book
  public String doDeleteBook() {
    log.debug("####DO DELETE START !!!!!!!!!!!!");
    log.debug("####called");

    Long ID = 1L;

    book = bookEJB.createBook(book);
    bookList = bookEJB.findBooks();

    Map<String, Object> requestMap = FacesContext.getCurrentInstance().getExternalContext().getRequestMap();

    Object test = requestMap.get("Buch");

    Boolean b = requestMap.containsKey("Buch");
    log.debug("Boolean " + b);

    for (Object o : requestMap.keySet()) {
      log.debug(o.toString());
    }

    log.debug("book.getID() = " + book.getID());

    log.debug("OBJECT " + test);
    ID = (Long) test;
    // ID = Long.parseLong( test.toString());
    log.debug("Long " + ID);

    bookEJB.deleteBook(ID);
    bookList = bookEJB.findBooks();

    log.debug("####complete");
    return "listBooks.xhtml";
  }
 
M

maki

Gast
Wieso verwendest du eigentlich [c]MyData[/c]?
Das ist nur das Beispiel, must schon mit Book arbeiten.
 

TheBigNeo

Mitglied
Hallo,

Wieso verwendest du eigentlich [c]MyData[/c]?
Das ist nur das Beispiel, must schon mit Book arbeiten.

ich glaube die passende Antwort darauf wäre: "Weil ich dumm bin"

Habe es jetzt angepasst.
Sieht es jetzt besser aus ?

bookController.java
Java:
public String getSelectedItems() {

    // Get selected items.
    for (Book book : bookList) {
      if (book.isSelected()) {
        selectedBookList.add(book);
        book.setSelected(false); // Reset.
      }
    }

    // Do your thing with the MyData items in List selectedDataList.

    doDeleteBook();
    
    return "selected"; // Navigation case.
  }

listBooks.xhtml
Java:
<h:column>
				<f:facet name="header">
					<h:outputText value="Select" />
				</f:facet>
				<h:selectBooleanCheckbox value="#{bookController.selectedBookList[book.ID]}" /> 
        </h:column>

<h:commandButton value="Get selected items" action="#{bookController.getSelectedItems}" />
 
M

maki

Gast
Kann dir da leider nicht helfen, das letzte mal hatte ich mit JSF (1.1) vor ein paar Jahren zu tun.
 
M

maki

Gast
Man könnte daraus schließen, Du hättest ein besseres Java Webframework gefunden???
(Wobei die Kriterien für "besser" sehr individuell sein können)
JSF 1.1 ist nicht wirklich angenehm gewesen, auf dem Papier sieht JSF 2 um Welten besser aus, so gesehen kann ich jedem nur von JSF 1.1(.14) abraten :)
Das ist natürlich heute eine völlig sinnfreie/nutzlose Aussage, aber es soll ja noch Leute geben, die sich in struts 1.x einarbeiten wollen, davon würde ich auch abraten *g*

Habe schon länger keine Frontends für WebApps mehr geschrieben, aber Wicket sieht ganz gut aus, wie gesagt JSF 2 auch, und im Moment arbeite ich mich gerade in GWT ein.

@TheBigNeo
Hast du denn ein gutes Buch zu JSF 2?
 
M

maki

Gast
:)

Wie wolltest du JSF denn dann erlernen? :)

Wie gesagt, IMHO ist nicht so trivial dass es per "learning by doing" funktioniert...
Persönlich fand ich das "Core Java Server Faces" gut für JSF 1.2 (klar das es nicht immer anwendbar war für JSF 1.1), scheint auch eine neue Auflage für JSF 2 zu geben.
 

jdev

Mitglied
Wicket sieht ganz gut aus, wie gesagt JSF 2 auch, und im Moment arbeite ich mich gerade in GWT ein.

Hi Maki,
gut zu wissen, dass JSF "nicht ganz so schlecht" ist, als Entwickler wäre es "strategisch" gut, diesen Quasi-Standard zu beherrschen - auch wenn es vielleicht produktivere Frameworks gibt (aber das ist ein anderer Aspekt für die Framework-Auswahl). Ich denke daran, gleich den Sprung von Java zu Grails (Groovy) zu machen (kürzeres Coding).
 
M

maki

Gast
Hmmm
Wäre mein Programm schon fertig, dann könnte ich jetzt da nachschauen ob ich so ein Buch rumligen habe :)
Hmmm... wieso fangen Leute gleich an ein richtiges Programm zu schreiben, wenn sie nicht mal die Grundlagen draufhaben?

Was in 99% der Fälle dabei rauskommt ist auch klar :reflect:

Wie würdest du dich fühlen wenn du einen Klemptner bestellst um eine Wasserleitung einzubauen und dann hörst, wie er zu seinem Kollegen sagt "Wasserrohrzange? Wofür baucht man die eigentlich?"
 

TheBigNeo

Mitglied
Hmmm... wieso fangen Leute gleich an ein richtiges Programm zu schreiben, wenn sie nicht mal die Grundlagen draufhaben?

Was in 99% der Fälle dabei rauskommt ist auch klar :reflect:

Wie würdest du dich fühlen wenn du einen Klemptner bestellst um eine Wasserleitung einzubauen und dann hörst, wie er zu seinem Kollegen sagt "Wasserrohrzange? Wofür baucht man die eigentlich?"

Hmmm okay, das ist ein Argument.
Aber aus diesem Grund bin ich ja auch in Ausbildung :)
 
M

maki

Gast
IMHO ist dein momentanes Problem, dass du dich viel zu weit in die offene See gewagt hast, obwohl du noch nicht wirklich schwimmen kannst, weil du dachtest, dass deine Schwimmflügel schon ausreichen werden.
Meine das nicht böse, sollte nur mal eine Dastellung der Situation sein.
Gibt auch schlimmeres, was meinst du wie oft Leute an einem Java EE Projekt arbieten, ohne sich wirklich auszukennen, und dann dafür noch Geld nehmen.

Kann auch nix mehr sagen zu deinem konkreten JSF Problem.
 
Ähnliche Java Themen
  Titel Forum Antworten Datum
S AJAX/RestController Post Problem Web Tier 18
J werte per post an servlet übergeben und auswerten Web Tier 3
G Json post Web Tier 4
S servlet bedienen mit get und post parameter Web Tier 10
M Zwischen GET und POST unterscheiden Web Tier 9
O Kann man POST Parameter Link-abhängig setzen? Web Tier 4
I Daten einer Datenbank in ein Formular einfügen Web Tier 3
S Daten von Client empfangen Web Tier 1
J Servlet Einschätzung anderer zu Daten-Repositories Web Tier 3
N JSF CommandButton Daten aus anderem Form auslesen Web Tier 3
C JSF JSF Daten aus Klasse werden nicht angezeigt Web Tier 4
X SQL Datenbank-Daten in ApplicationScoped ManageBean zwischenspeichern? Web Tier 4
P JSF Primefaces Picklist-Ersatz mit vielen Daten Web Tier 4
F Wo und wie Daten die für alle Benutzer bestimmt sind verwalten Web Tier 4
H JSF Daten aus ManagedBean können vom Controller gelesen werden Web Tier 6
P SelectOneMenu liest Daten nicht ein Web Tier 7
X JSP Auslesen der Daten einer Session Web Tier 3
R Daten Streamen mit Servlets. Web Tier 4
I JSF Daten aus Formular werden nicht übernommen Web Tier 6
1 JSP Mit Daten einer c:forEach Rechnen ? Web Tier 4
T Daten - DB-Abfrage - Tabelle Web Tier 5
H Daten von Webseiten bekommen Web Tier 6
T Einfach nur Daten im JSP ausgeben Web Tier 2
S Daten zwischen 2 Servlets aus 2 Webapplikationen teilen? Web Tier 17
R Wo Daten manipulieren? Client oder Server? Web Tier 3
N Tabelle dynamisch mit Daten aus Datenbank füllen Web Tier 3
sliwalker forEach und Scriptlet: Daten aus Scriptlet in jstl sehen Web Tier 2
S [SelectItems value(herkunft bean)] in [UI:repeat] lädt daten nicht neu nach Web Tier 3
P Formular-Daten-Überprüfung - Eingaben im Fehlerfall behalten Web Tier 2
T Daten aus der Form holen Web Tier 2
U JSP form-Daten (ohne name-Attribut) an Servlet = Problem Web Tier 6
G Daten von ablaufenden Sessions speichern? Web Tier 3
reibi Servlet Stop-Signal abfangen Web Tier 4
P Error 404 abfangen Web Tier 5
M Falsche URL-Eingaben abfangen Web Tier 3

Ähnliche Java Themen

Neue Themen


Oben