Announcement

Collapse
No announcement yet.

JSF 2.0: InputText-Element

Collapse
X
  • Filter
  • Time
  • Show
Clear All
new posts

  • JSF 2.0: InputText-Element

    Wunderschönen Guten Tag!

    Bin leider schon wieder am verzweifeln und weiß mir nicht anders zu helfen als nochmal hier um Hilfe zu bitten.

    Ich habe ein InputText-Element vom Typ Integer, dass mir beim Laden des Eingabe-Formulars das entsprechende Eingabefeld mit einer 0 vorbelegt. Dies ist aber von mir nicht erwünscht und würde das gerne unterbinden. Nur weiß ich einfach nicht wie...

    Vielleicht noch ein wenig Code:

    HTML Code:
    <h:inputText id="field" value="#{customerBean.field}" converter="javax.faces.Integer" validator="#{validatorBean.validateField}" />

    Code:
    @ManagedBean(name = "customerBean")
    public class Customer
    {
       private int field;
    
       public int getfield()
       {
          return field;
       }
    
       public void setfield(int field)
       {
          this.field = field;
       }
    }
    Code:
    @ManagedBean(name = "validatorBean")
    public class Validator
    {
      public void validateField(FacesContext ctx, UIComponent comp, Object inValue) throws ValidatorException
      {		
         int value = (Integer) inValue;
    		
         if (!(value >= 0 && value <= 100) && !(value == -9))
         {
            throw new ValidatorException(new FacesMessage("Illegal entry! Legal values are: '0' to '400', '-9'.", null));
         }
      }
    }
    Wenn ich nun die Seite bzw. das Formular welches das inputText-Element enthält lade, dann erhalte ich folgendes Bild:

    [IMG=http://img155.imageshack.us/img155/9759/nullc.png][/IMG]

    Also ein Eingabefeld, das mit einer 0 vorbelegt ist. Ich weiß natürlich, dass wenn in Java eine Integer-Variable deklariert wird, diese default-mäßig mit 0 initialisiert wird. Kann ich ja auch schlecht verhindern... und genau dieser Wert wird mir dann beim Laden des Formulars auch angezeigt. Wie kann ich das verhindern?


    Vielen lieben Dank für jede Hilfestellung.
    Zuletzt editiert von Fools; 05.09.2010, 19:24.

  • #2
    Hallo,

    Leider ist mir beim Threadnamen ein Fehler unterlaufen,
    Geh auf Editieren und ändere den Titel.

    mfG Gü
    "Any fool can write code that a computer can understand. Good programmers write code that humans can understand". - Martin Fowler

    Comment


    • #3
      Mit was soll es denn vorbelegt sein?

      Definiere diesen Wert in der Bean

      Weiterer Weg:

      Kein int nehmen, sondern ein String und dies dann bei der Validierung berücksichtigen. Also den String in eine int wandeln und dann validieren
      Christian

      Comment


      • #4
        @gfoidl

        Hab ich jetzt auch gemacht. Hab's anfangs nicht gesehen (man muss dann nämlich auch noch auf den "Erweitert-Button" klicken.

        Originally posted by Christian Marquardt View Post
        Mit was soll es denn vorbelegt sein?
        Wenn die Seite bzw. das Formular geladen wird, dann möchte ich dass das entsprechende Eingabefeld leer ist und nicht mit einer 0 vorbelegt. Mehr will ich gar nicht.


        Originally posted by Christian Marquardt View Post
        Definiere diesen Wert in der Bean
        Sorry, ich steh auf den Schlauch. Wie genau meinst du das bezogen auf meinen Code?

        Originally posted by Christian Marquardt View Post
        Weiterer Weg:

        Kein int nehmen, sondern ein String und dies dann bei der Validierung berücksichtigen. Also den String in ein int wandeln und dann validieren
        Aber ich nehme ja bewusst ein int, da der Wert des Feldes in die Datenbank gespeichert werden soll und dieser in der Datenbank als Integer-Feld korrespondiert. Wenn ich also statt int von vornherein ein String nehme, dann müsste ich in meiner Java-Bean bevor ich den Wert in meine Datenbank abfeuere auch noch mal von einem String in ein int umwandeln. D.h. ich bräuchte zwei Variablen: einmal die String-Variable, und einmal eine Integer-Variable, für den umgewandelten String-Wert . Ist das nicht etwas umständlich oder besser gesagt kontraproduktiv was die Speicherverwendung im Hintergrund anbetrifft? Ich mein all das, nur um zu verhindern, dass mein Eingabefeld nicht mit einer Null (0) vorbelegt wird?

        PS: Ich habe mehr als ein Dutzend solcher Int-Felder...

        Comment


        • #5
          Integer statt int

          Hallo,
          das Problem ist, dass int ein primitiver Datentyp ist, der nicht null sein kann. Er wird bei der Instanzierung des Customer Objekts defaultmäßig mit 0 vorbelegt und das siehst Du im Formular. Ändere den Datenyp in Integer. Dann klappts. Das ist der Code:
          Code:
          @ManagedBean(name = "customerBean")
          public class Customer
          {
             private Integer field;
          
             public Integer getField()
             {
                return field;
             }
          
             public void setField(Integer field)
             {
                this.field = field;
             }
          }
          Übrigens, ich habe in dem Code die Namen des getters und setters der Bean-Konvention angepasst (Großbuchstabe nacht get/set). Solltest Du auch so machen. Sonst kommen einige Frameworks nicht mit dem Code zurecht.
          Gruß ngomo
          http://www.winfonet.eu

          Comment


          • #6
            Originally posted by ngomo View Post
            Hallo,
            das Problem ist, dass int ein primitiver Datentyp ist, der nicht null sein kann. Er wird bei der Instanzierung des Customer Objekts defaultmäßig mit 0 vorbelegt und das siehst Du im Formular.
            Richtig.

            Originally posted by ngomo View Post
            Ändere den Datenyp in Integer. Dann klappts.
            Wow! Es klappt, es klappt!

            Natürlich ist mir das etwas peinlich, aber jetzt wo die Katze aus'm Sack ist:
            Ich wusste gar nicht, dass es zu jedem primitiven Datentyp auch noch ein korrespondierendes Pendant in Form eines Objektes gibt. Vielen Dank!


            Originally posted by ngomo View Post
            Übrigens, ich habe in dem Code die Namen des getters und setters der Bean-Konvention angepasst (Großbuchstabe nacht get/set). Solltest Du auch so machen. Sonst kommen einige Frameworks nicht mit dem Code zurecht.
            Gruß ngomo
            Danke für den Hinweis. Normalerweise mach ich das natürlich auch, vor allen Dingen aber auch, weil man sich die "getters/setters" meistens mit einer anständigen IDE automatisch generieren lässt. Nur für den Post hier habe ich schnell alles per Hand nochmal neu geschrieben...

            Aber an dieser Stelle hätte ich dann doch eine Frage, weil du darauf hinweist, dass sonst einige Frameworks nicht mit dem Code zurecht kommen könnten. Was ist, wenn ich Variablennamen in Java komplett in Großbuchstaben deklariere (ich weiß: auch das spricht eigentlich gegen die empfohlenen Java-Namenskonventionen). Doch in meinem Fall habe ich es mit Variablennamen (z. B. mit 'CDRCP01') zu tun, die einfach durchgehend in Großbuchstaben geschrieben sind (in den schriftlichen Formularen, in der Datenbank etc.). Gibt es da Probleme wenn ich dann z. B. folgenden getter schreibe:
            public Integer getCDRCP01
            { return CDRCP01 }

            Was empfiehlst du mir an dieser Stelle? Besser alle Variablen in Kleinbuchstaben, denn letztlich ist es ja nur eine empfohlene Namenskonvention, an der man sich aber nicht zwangsläufig halten muss...

            Comment


            • #7
              Großsbuchstaben für Konstanten

              Hallo Fools,
              Doch in meinem Fall habe ich es mit Variablennamen (z. B. mit 'CDRCP01') zu tun, die einfach durchgehend in Großbuchstaben geschrieben sind (in den schriftlichen Formularen, in der Datenbank etc.). Gibt es da Probleme wenn ich dann z. B. folgenden getter schreibe:
              public Integer getCDRCP01
              { return CDRCP01 }
              Probleme wirds da nicht geben. Aber prinzipiell wirst Du ja nicht gezwungen, den Namen einer Datenbank-Spalte eins zu eins auch in der Java Klasse groß zu schreiben. In Java werden durchgehend groß geschriebene Namen für Konstanten (static final ...) benutzt. Ist natürlich auch nur eine Konvention. Letztlich geht es darum, Deinen Code etwas leichter lesbar zu machen. Für andere und für Dich, wenn Du in 2 Jahren nochmal reinschaust. Also, wenn's nicht zu viel Arbeit macht, würd ich die Konventionen schon einhalten.

              Gruß ngomo
              http://www.winfonet.eu

              Comment

              Working...
              X