dr.Colossos: Anfaengerfrage

Hi,

eine Frage zu JSP (glaub ich):

Ich moechte eine Applikation schreiben, die Daten aus einer Datenbank liest, diese in HTML-Formularen anzeigt, und nach Klick wieder (geaendert) in die DB zurueck schreibt.

Geht wunderbar mit PHP, aber eine Sache stoert mich an der PHP-Loesung, naemlich dass ich es nicht schaffe an die Daten der Formulare zu kommen die im Formulare waren im Schritt i - 1 (ausser ich sichere es in der Session!).

Also:
i: lade Daten in Formular
i + 1: speicher Daten in Formular
       -> Daten gehen in POST-Daten an PHP-Script, Daten von Schritt i (geladene Daten) gehen beim Klick auf Button logischerweise verloren, liegt an der Natur von PHP.

Ich wurde aber gerne die gesendeten Daten mit den geladenen vergleichen, serverseitig (ja, wuerde mit PHP Session gehen, ich weiss, aber ich suche nach einer Alternative).

Wie is das mit Java Server Pages, ist das auch so zustandlos wie HTTP/PHP oder is da was eingebaut dass das nicht verloren geht?

Komisch Frage, aber trotzdem Danke an diejenigen die da Erfahrug haben.

  1. n'abend,

    Geht wunderbar mit PHP, aber eine Sache stoert mich an der PHP-Loesung, naemlich dass ich es nicht schaffe an die Daten der Formulare zu kommen die im Formulare waren im Schritt i - 1 (ausser ich sichere es in der Session!).

    Du könntest beim Absenden des Formulars auch einfach nochmal lesend auf die Datenbank zugreifen, um Unterschiede zwischen den DB-Daten und den Formulareingaben zu ermitteln.

    Weniger sicher und weniger toll könntest für jedes Eingabefeld im Formular noch ein hidden-Field mit dem Ursprungswert hinzufügen. Verursacht mehr Traffic und ist in sofern unsicher, als dass versteckte Eingabefelder von "findigen" Surfern ohne Probleme verändert werden können.

    Also:
    i: lade Daten in Formular
    i + 1: speicher Daten in Formular
           -> Daten gehen in POST-Daten an PHP-Script, Daten von Schritt i (geladene Daten) gehen beim Klick auf Button logischerweise verloren, liegt an der Natur von PHP.

    Bis du auf den Submit-Button des Formulars geklickt hast, ist das PHP-Script vermutlich schon 10x fertig. Das Script "lebt" nur so lange, wie es braucht um dein Formular zu erstellen (wenn es nicht noch gerade etwas anderes machen soll). Die Zeit zwischen "Formular wird angezeigt" und "Formular wird abgeschickt" hat der Server (und somit auch PHP) nichts mehr mit dir zu tun (außer du hast da ganz tolles Putzmittel™ im Einsatz).

    Ich wurde aber gerne die gesendeten Daten mit den geladenen vergleichen, serverseitig (ja, wuerde mit PHP Session gehen, ich weiss, aber ich suche nach einer Alternative).

    Ich würde - wäre ich an deiner Stelle - vermutlich bei "i+1" erneut lesend auf die Datenbank zugreifen. Gehampel mit Sessions, oder gar temporären Dateien macht nur dann sinn, wenn die Datenbankabfrage _extrem_ aufwändig ist.

    Wie is das mit Java Server Pages, ist das auch so zustandlos wie HTTP/PHP oder is da was eingebaut dass das nicht verloren geht?

    Du willst erkennen, dass Java eine Programmiersprache ist. Das ist PHP auf eine gewisse Art und weise auch. HTTP ist das sicher nicht. HTTP ist ein Protokoll (Hyper Text Transfer Protocol). HTTP ist eine definierte Art und Weise, wie zwei Gesprächspartner (Browser, Server) zu kommunizieren haben.

    Du wirst auch mit Java das Problem haben, dass du Daten in einer Session speichern musst, um diese über verschiedene von einander unabhängige HTTP Anfragen hinweg verfügbar zu haben. Das kann sich in Java zwar etwas anders gestalten als in PHP, das Prinzip ist jedoch das gleiche.

    weiterhin schönen abend...

    --
    Freundlich wie man war, hat man mir Großbuchstaben geschenkt.
    sh:( fo:# ch:# rl:| br:> n4:& ie:{ mo:} va:) de:] zu:} fl:( ss:? ls:[ js:|
    1. Du könntest beim Absenden des Formulars auch einfach nochmal lesend auf die Datenbank zugreifen, um Unterschiede zwischen den DB-Daten und den Formulareingaben zu ermitteln.

      Nope, es ist im Multi-User-Betrieb, d.h. es kann waehrend die Daten in der Anzeige sind von einem anderen User geaendert werden - damit ist dieser Vergleich nicht moeglich.

      Hidden-Fields sind definitiv nicht was ich will, die Formulare haben u.U. SEHR viele Inputs.

      Bis du auf den Submit-Button des Formulars geklickt hast, ist das PHP-Script vermutlich schon 10x fertig. Das Script "lebt" nur so lange, wie es braucht um dein Formular zu erstellen (wenn es nicht noch gerade etwas anderes machen soll). Die Zeit zwischen "Formular wird angezeigt" und "Formular wird abgeschickt" hat der Server (und somit auch PHP) nichts mehr mit dir zu tun (außer du hast da ganz tolles Putzmittel™ im Einsatz).

      Jo, klar, so meinte ich das auch ... wenn das Programm durchgelaufen ist, sind auch meine Variablen/Objekte weg.

      Du willst erkennen, dass Java eine Programmiersprache ist. Das ist PHP auf eine gewisse Art und weise auch. HTTP ist das sicher nicht. HTTP ist ein Protokoll (Hyper Text Transfer Protocol). HTTP ist eine definierte Art und Weise, wie zwei Gesprächspartner (Browser, Server) zu kommunizieren haben.

      Ja, ich kenn Java, zu genuege- nur halt keinerlei Erfahrung mit JSP.
      Und, wissend dass HTTP ein Protokoll ist und keine Sprache, wollte ich damit ausdruecken das es ja zustandslos ist.

      Was mich halt dann intersieren wuerde ist, ob sowas in JSP standardmaessig eingebunden ist.

      Sprich, wenn ich Daten an den Webserver schicke, dass eine Kopie davon auch serverseitg ueber Java zugreifbar ist, sodass ich, wenn das Dokument vom User zurueck gesendet wird, verglichen werden kann.

      Klar, selbes Prinzip wie mit der Session in PHP, aber halt evtl. built-in in JSP.

      1. n'abend,

        Nope, es ist im Multi-User-Betrieb, d.h. es kann waehrend die Daten in der Anzeige sind von einem anderen User geaendert werden - damit ist dieser Vergleich nicht moeglich.

        Das hättest du von Anfang an sagen können, dann hätte ich dir auch von Anfang an sagen können, dass du schlicht ein eigenes Locking-Verfahren implementieren musst.

        ganz banaler Ansatz zum lesen:

        LOCKFILE = "/tmp/"+ md5(REQUEST_URI)+ ".lock";

        1. prüfe ob LOCKFILE vorhanden und letzte Zugriffszeit nicht älter als $x Minuten
        1.1 LOCKFILE ist vorhanden oder zu alt: Zugriff dementsprechend gesperrt, gib entsprechende Fehlermeldung aus, Ausführung abbrechen.

        2. erstelle LOCKFILE mit Inhalt: AKTUELLE_SESSION_ID

        3. hole daten, generiere webseite

        ganz banaler Ansatz zum schreiben:

        1. prüfe ob LOCKFILE vorhanden
        1.1 LOCKFILE ist nicht vorhanden: Zugriff dementsprechend für niemanden exklusiv angefordert/gesperrt, entsprechende Fehlermeldung ausgeben, Ausführung abbrechen.

        2. öffne LOCKFILE und prüfe Inhalt gegen die AKTUELLE_SESSION_ID
        2.1 Die Prüfung ist fehlgeschlagen, Abbruch mit entsprechender Fehlermeldung

        3. hole daten aus datenbank, prüfe gegen eingaben aus formular - mache was auch sonst immer, schreibe daten in datenbank

        4. lösche LOCKFILE

        Ich würde die lebensdauer des LOCKFILEs relativ gering halten und im Formular ein wenig "AJAX" einbauen, welches in einem bestimmten Takt Kontakt zum server aufnimmt und sagt "hallo, ich bin an diesem Formular noch dran, erneuer mir mal bitte mein LOCKFILE". Das ist jedoch lediglich ein simples Beispiel, wie man sowas hinbekommen könnte.

        Jo, klar, so meinte ich das auch ... wenn das Programm durchgelaufen ist, sind auch meine Variablen/Objekte weg.

        Das ist bei einem stateless Servlet auch nicht anders. Da muss das entsprechende Servlet schon Request-übergreifend Daten speichern können.

        Ja, ich kenn Java, zu genuege- nur halt keinerlei Erfahrung mit JSP.
        Und, wissend dass HTTP ein Protokoll ist und keine Sprache, wollte ich damit ausdruecken das es ja zustandslos ist.

        Zum einen sind die meisten meiner Servlets auch "Zustandslos". Zum anderen ist JSP kein Wunderheilmittel, sondern nur eine (eklige) "Template-Engine". Mit JSP kannst du eine statische Vorlage nach ausführbarem Java interpretieren (und damit auch kompilieren) lassen.

        Was mich halt dann intersieren wuerde ist, ob sowas in JSP standardmaessig eingebunden ist.

        Ziemlich sicher nicht.

        Sprich, wenn ich Daten an den Webserver schicke, dass eine Kopie davon auch serverseitg ueber Java zugreifbar ist, sodass ich, wenn das Dokument vom User zurueck gesendet wird, verglichen werden kann.

        Du willst ja nicht die Daten zwischenspeichern, sondern verhindern, dass zwischenzeitlich ein Dritter die Daten manipuliert. Solltest du das nicht unterbinden (z.b. durch obiges Locking) ist auch die Zwischenspeicherung der Daten irgendwo im Serverkontext völlig sinnfrei.

        Klar, selbes Prinzip wie mit der Session in PHP, aber halt evtl. built-in in JSP.

        Sessions alleine bringen dir nichts, wenn du "Nebenläufigkeit" verhindern willst.

        weiterhin schönen abend...

        --
        Freundlich wie man war, hat man mir Großbuchstaben geschenkt.
        sh:( fo:# ch:# rl:| br:> n4:& ie:{ mo:} va:) de:] zu:} fl:( ss:? ls:[ js:|
        1. Hi,

          nein, das gleichzeitige Aendern will ich garnicht unterbinden, nur wenn's wirklich zu fehlerhaften Daten fuehren wuerde.

          Es is ja kein Problem wenn 2 User den gleichen Datensatz oeffnen und das Alter einer Person auf 55 bzw. der andere auf 56 setzt - welche der beiden nun wirklich richtig ist werde ich nie wissen.

          Anders ist es natuerlich z.B. bei Summensaetzen etc., aber das is ein anderes Thema.

          Ich wollte tatsaechlich nur einen einfachen Vergleich zwischen Zustand beim Laden auf der Serverseite und Zustand beim Empfangen auf der Serverseite.

          Da dass offensichtlich nicht nativ in JSP moeglich ist, interessiert es mich derweil auch nicht weiter.

          Vielen Dank jedenfalls fuer die Diskussion.

          Noch eine Frage. Hast du viel Erfahrung mit JSP? Ist es performant, gut zu programmieren ... hast du ein paar Eindruecke fuer mich diesbezueglich - evtl. auch im Vergleich zu PHP?

          Besten Dank
          Servus