Avatar billede trp79 Nybegynder
12. september 2005 - 21:56 Der er 17 kommentarer og
1 løsning

Bean egenskaber sætte ikke automatisk i formularen

Hejsa
Jeg bruger understående jsp side til at redigere brugere med (den indloggede bruger). Brugerens informationer ligger i "login" bønnen.
Men når man er logget ind, og går ind på denne side, så vises ens oplysninger ikke automatisk i formularen, håber nogen ser lidt mere klart nu end jeg gør :)



på forhånd tak, mvh
Torben







<jsp:useBean id="login" class="ausumnet.Login" scope="session"/>
<% if(!login.isLoggetInd()) response.sendRedirect("../index.jsp");%>

<%@ page import="java.text.*" %>
<jsp:setProperty name="login" property="billede"/>
<jsp:setProperty name="login" property="brugernavn"/>
<jsp:setProperty name="login" property="efternavn"/>
<jsp:setProperty name="login" property="email"/>
<jsp:setProperty name="login" property="fastnet"/>
<jsp:setProperty name="login" property="foedselsdato"/>
<jsp:setProperty name="login" property="fornavn"/>
<jsp:setProperty name="login" property="mailBanan"/>
<jsp:setProperty name="login" property="mailForum"/>
<jsp:setProperty name="login" property="mobil"/>
<%
String handling = request.getParameter("handling");
%>

<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN"
"http://www.w3.org/TR/html4/loose.dtd">
<html xmlns="http://www.w3.org/1999/xhtml" sml:lang="da" lang="da">

  <head>
    <title>Mine oplysninger</title>
    <link rel="stylesheet" type="text/css" href="../css/common.css" media="screen" />
  </head>
  <body>
   
    <jsp:include page="menu.jsp"/>
    <jsp:include page="banner.jsp"/>
    <div id="indhold">
   
      <h3 class="obs advarsel">Dine oplssninger</h3>
      <form action="rediger_bruger.jsp" method="get">
      <table>
        <tr>
          <td>Brugernavn</td>
          <td><%= login.getBrugernavn() %></td>
        </tr>
        <tr>
          <td>Email</td>
          <td><input type="text" name="email" value="<%= login.getEmail() %>"></td>
        </tr>
        <tr>
          <td>Fornavn</td>
          <td><input type="text" name="fornavn" value="<%= login.getFornavn() %>"></td>
        </tr>
        <tr>
          <td>Efternavn</td>
          <td><input type="text" name="efternavn" value="<%= login.getEfternavn() %>"></td>
        </tr>
        <tr>
          <td>Mobil tlf.nr.</td>
          <td><input type="text" name="mobil" value="<%= login.getMobil() %>"></td>
        </tr>
        <tr>
          <td>Fastnet tlf.nr.</td>
          <td><input type="text" name="fastnet" value="<%= login.getFastnet() %>"></td>
        </tr>
        <tr>
          <td>Fødselsdato(dd-mm-åååå)</td>
          <td><input type="text" name="foedselsdato" value="<%= login.getFoedselsdato() %>"></td>
        </tr>
        <tr>
          <td>Mail ved banan</td>
          <td><input type="radio" name="mailBanan" value="<%= login.getMailBanan()%>" <%=login.getMailBanan()?"checked":""%>>Ja -
          <input type="radio" name="mailBanan" value="<%= !login.getMailBanan()%>" <%=!login.getMailBanan()?"checked":""%>>Nej</td>
        </tr>
        <tr>
          <td>Mail ved forumindlæg</td>
          <td><input type="radio" name="mailForum" value="<%= login.getMailForum()%>" <%=login.getMailForum()?"checked":""%>>Ja -
          <input type="radio" name="mailForum" value="<%= !login.getMailForum()%>" <%=!login.getMailForum()?"checked":""%>>Nej</td>
        </tr>
        <tr>
          <td>Nyt password</td>
          <td><input type="password" name="nytpassword1"></td>
        </tr>
        <tr>
          <td>Gentg nyt password</td>
          <td><input type="password" name="nytpassword2"></td>
        </tr>
      </table>
        <input type="SUBMIT" name="handling" value="rediger_bruger">
      </form>
     
      <h3 class="advarsel">
      <%
      if ("rediger_bruger".equals(handling))
      {
        String nytpassword1=request.getParameter("nytpassword1");
        String nytpassword2=request.getParameter("nytpassword2");
        if(nytpassword1!=null && nytpassword2!=null )
        {
          if(nytpassword1.length()>0)
          {
            if(nytpassword1.length()>5 && nytpassword1.length()<51)
            {             
              if(nytpassword1.equals(nytpassword2))
              {
                if(login.redigerBruger(nytpassword1))
                {
                  response.sendRedirect("oversigt.jsp?handling=bruger_redigeret");
                }
              }
              else
              {
                %>De indtastede passwords var ikke identiske!<%
              }
            }
            else
            {
              %>Det nye password skal være mindst 6 karakter langt og maksimalt 50!<%
            }
          }
          else
          {
            if(login.redigerBruger(null))
            {
              response.sendRedirect("oversigt.jsp?handling=bruger_redigeret");
            }
          }
        }
      }
      %>
      <%= login.getMeddelelse() %>
      </h3>
     
      <br/>

    </div>
  </body>
</html>
Avatar billede arne_v Ekspert
12. september 2005 - 23:05 #1
hvis oplysningerne allerede er i session hvorfor så forsøge at sætte dem med

<jsp:setProperty name="login" property="billede"/>
<jsp:setProperty name="login" property="brugernavn"/>
<jsp:setProperty name="login" property="efternavn"/>
<jsp:setProperty name="login" property="email"/>
<jsp:setProperty name="login" property="fastnet"/>
<jsp:setProperty name="login" property="foedselsdato"/>
<jsp:setProperty name="login" property="fornavn"/>
<jsp:setProperty name="login" property="mailBanan"/>
<jsp:setProperty name="login" property="mailForum"/>
<jsp:setProperty name="login" property="mobil"/>

?
Avatar billede trp79 Nybegynder
13. september 2005 - 08:14 #2
Det gør jeg for at opdatere loginbønnen med de nye ændringer. Men jeg syntes ikke helt jeg kan gennemskue om det er nødvendigt. På javabog.dk/jsp står der:
"Serveren kan automatisk kalde egenskabernes set-metoder, hvis der kommer data fra en formular, hvor parameternavnene passer med bønnens egenskaber." men lidt længere nede står der så:
"Udfylder man formularen, ser man, at dens indhold kommer over i javabønnen (i serverens log kan man også se at metoden setAlder() bliver kaldt).
Det skyldes linjen, der aflæser parametrene (fornavn og alder) og kalder set-metoder i bønnen (setFornavn() og setAlder()):
<jsp:setProperty name="person" property="*" />"

Så jeg tænkte, at oplysningerne skulle sætte på denne måde....

javabogs eks er iøvrigt:
<html>
<head><title>En simpel javabønne</title></head>
<body>
<jsp:useBean id="person" class="minPakke.Person" scope="session" />
<jsp:setProperty name="person" property="*" />

<% if (person.getFornavn() == null) { %>
  Indtast dit fornavn og din alder:
  <form>
    <input type="text" name="fornavn">
    <input type="text" name="alder" size="4">
    <input type="submit" value="OK">
  </form>
<% } else { %>
  Hej <%= person.getFornavn() %>!
  Din alder er: <%= person.getAlder() %>.
<% } %>
<br>Til den <a href="en_simpel_javaboenne_2.jsp">anden side</a>.
</body>
</html>
Avatar billede arne_v Ekspert
13. september 2005 - 08:30 #3
skal du så ikke kun sætte dem ved POST men ikke ved GET ?
Avatar billede arne_v Ekspert
13. september 2005 - 08:30 #4
* laver nok ingen ulykker når parametrene ikke er der
Avatar billede trp79 Nybegynder
13. september 2005 - 09:14 #5
Jo, jeg skal kun sætte den ved POST og ikke ved GET som jeg gør pt(bruger GET under testen). Men jeg forstår stadig ikke hvorfor formularen ikke forudfyldes med brugerens eksisterende data?

Har du en ide om det? Jeg har ikke lige mulighed for at teste i dag, da jeg sidder på arbejde..
Avatar billede arne_v Ekspert
13. september 2005 - 09:33 #6
min hypotese er at

<jsp:setProperty name="login" property="fornavn"/>

ved GET uden parametre overskriver fornavn med "" elelr null
Avatar billede trp79 Nybegynder
13. september 2005 - 09:44 #7
Okay, jeg prøver lige at vende tilbage imorgen så når jeg har ændre det til POST :)
Avatar billede trp79 Nybegynder
14. september 2005 - 20:50 #8
Så har jeg kigget lidt mere på det og er nået frem til at det ikke engang hjælper, hvis jeg fjerne alle <jsp:setProperty..> tags'ene.
Den skriver fint nok Brugernavn ud i den kode jeg postede oprindeligt, men den udfylder altså ikke formularer felterne.
Har du evt. flere ideer?
Avatar billede arne_v Ekspert
14. september 2005 - 21:19 #9
kan du beskrive konteksten (GET/POST til hvilke sider) ?
Avatar billede trp79 Nybegynder
14. september 2005 - 22:19 #10
Jeg har en oversigts side, hvorfra der er et link til denne redigeringsside. Når redigeringssiden loades skal brugerens informationer så vises - de er gemt i login bønnen. Jeg kan fint foretage opdatering af brugeren og når siden så indlæses igen efter har trykke på opdateringsknappen, så vises de nye informationer fint i formular felterne. Der er ikke post nogle steder, med undtagelse af når man trykke på opdater knappen for at gemme sine ændringer. Det skal lige siges, at felterne i formularen også er udfyldt efter en opdatering, hvis der bruges GET.

Du kan se det her: http://www.ausumnet.dk/Inkasso/
login/pass: Torben/password
Man redigerer oplysninger under menupunktet: mine oplysninger
Avatar billede trp79 Nybegynder
14. september 2005 - 22:25 #11
vent vent... gad vide om det ikke er fordi jeg ikke har slettet et kald til denne metoden: setLoginBean()
Det må jeg lige tjekke imorgen tidlig når jeg kan komme til pcen igen.

Skal nok lige vende tilbage imorgen tidlig, håber ikke du har brudt hovedet for meget med det, hvis det er det som er galt!
Avatar billede arne_v Ekspert
14. september 2005 - 22:26 #12
jeg synes umiddelbart at det virker fint !?!?
Avatar billede trp79 Nybegynder
15. september 2005 - 09:05 #13
Jamen når du går ind på siden "mine oplysninger", så vises der vel ikke andet end brugernavnet du er logget ind med, altså formularfelterne er ikke udfyldt, og det vil jeg jo gerne have de er så man kan se sine oplysninger og efterfølgende opdatere dem.

Jeg har nu kigget lidt mere på det:
Når en bruger logger ind, da kaldes denne metode som ligger i Login.java:
  public void tjekLogin()
  {
    if(!tjek) return;  //er der ikke sket ændringer behøver vi ikke tjekke igen
    loggetInd = false;
    tjek = false;
    if( brugernavn.length() > 0 && password.length() > 0)
      loggetInd=db.loginOk(this, password);
      if(loggetInd)
      {
        db.setLoginBean(brugernavn, this);
        db.regLogin(this);
        loginLogger.debug("login.tjeckLogin - this.getEmail:"+this.getEmail());
       
      }       
      else
        meddelelse = "Forkert brugernavn eller adgangskode";
  }

Men desværre udskriver this.getEmail() ikke noget! altså bliver bønnen ikke tildelt værdier. Tildeleing af værdier sker i Database.java, hvor denne metode kaldes:

  public synchronized boolean setLoginBean(String brugernavn, Login login)
  {
    boolean setOk=false;
    login = null;//UserBean sættes til null
    try
      {
        connGetLoginBean =  DriverManager.getConnection("jdbc:apache:commons:dbcp:banankasse");
        pstmGetLoginBean = connGetLoginBean.prepareStatement(
          "SELECT brugernavn, password, fornavn, efternavn, email, foedselsdato, mobil, fastnet, mailBanan, mailForum, regDato, sidsteLogin, billede, antalLogin FROM BKBruger WHERE brugernavn=?");
          pstmGetLoginBean.setString(1, brugernavn);
          rsGetLoginBean = pstmGetLoginBean.executeQuery();
          if (rsGetLoginBean.next())
          {
            login = new Login();
            login.setBrugernavn(brugernavn);
            login.setPassword(rsGetLoginBean.getString("password"));
            login.setFornavn(rsGetLoginBean.getString("fornavn"));
            login.setEfternavn(rsGetLoginBean.getString("efternavn"));
            login.setEmail(rsGetLoginBean.getString("email"));
            login.setFoedselsdato(rsGetLoginBean.getString("foedselsdato"));
            login.setMobil(rsGetLoginBean.getString("mobil"));
            login.setFastnet(rsGetLoginBean.getString("fastnet"));
            login.setMailBanan(rsGetLoginBean.getInt("mailBanan")!=0);
            login.setMailForum(rsGetLoginBean.getInt("mailForum")!=0);
            login.setRegDato(rsGetLoginBean.getString("regDato"));
            login.setSidsteLogin(rsGetLoginBean.getString("sidsteLogin"));
            login.setBillede(rsGetLoginBean.getString("billede"));
            login.setAntalLogin(rsGetLoginBean.getInt("antalLogin"));
            setOk=true;
            dbLogger.debug("db.setLoginBean - login.getEmail:"+login.getEmail());
          }
      }
      catch(SQLException e)
      {
        dbLogger.error("Database.setLoginBean() - SQLException: "+e);
        setOk=false;
      }   
      finally
      {
        try
        {
          if(rsGetLoginBean!=null) rsGetLoginBean.close();
          if(pstmGetLoginBean!=null) pstmGetLoginBean.close();
          if(connGetLoginBean!=null) connGetLoginBean.close();
        }
        catch(SQLException e)
        {
          dbLogger.error("Database.setLoginBean() - Problemer i finally med rsGetLoginBean.close(), pstmGetLoginBean.close(), og/eller connGetLoginBean.close(): "+e);
        }
      }
    return setOk;
  }

Her udskriver login.getEmail() fint nok den rigtige email adresse. Har du en ide om, hvad det er for en tåbelig fejl jeg har lavet?
Avatar billede arne_v Ekspert
15. september 2005 - 22:04 #14
ah - vi har den !!!!!!!!

public synchronized boolean setLoginBean(String brugernavn, Login login)

    login = null;//UserBean sættes til null

            login = new Login();

Alle argumenter i Java overføres faktisk by value.

For ikke simple data typer er det dog en reference som overføres by value.

Da man kan ændre i et objekt som er overført som referennce by value, så
tænker man tit at det er by reference.

Men det er det ikke.

Og forskellen viser sig ved at hvis du sætter referencen til at pege på et
nyt objekt så er det glemt når man returnerer !
Avatar billede arne_v Ekspert
15. september 2005 - 22:05 #15
slet de her 2 linier:

login = null;//UserBean sættes til null

login = new Login();
Avatar billede trp79 Nybegynder
16. september 2005 - 08:46 #16
Stærkt Arne! :o)
Jeg kan ikke lige få testet det før søndag eller mandag, men mon ikke det er dette som er galt! Smid du bare et svar, så skal jeg nok vende tilbage, hvis det ikke fungerer som det skal.

Mange tak for hjælpen - det er en fornøjelse med din ekspertise!
Avatar billede arne_v Ekspert
16. september 2005 - 08:52 #17
svar
Avatar billede trp79 Nybegynder
20. september 2005 - 10:09 #18
Hov jeg glemte helt at melde tilbage! Jeg fik testet det, og det virker fint nu! Så du havde ret :)

Tak for det
Avatar billede Ny bruger Nybegynder

Din løsning...

Tilladte BB-code-tags: [b]fed[/b] [i]kursiv[/i] [u]understreget[/u] Web- og emailadresser omdannes automatisk til links. Der sættes "nofollow" på alle links.

Loading billede Opret Preview
Kategori
Kurser inden for grundlæggende programmering

Log ind eller opret profil

Hov!

For at kunne deltage på Computerworld Eksperten skal du være logget ind.

Det er heldigvis nemt at oprette en bruger: Det tager to minutter og du kan vælge at bruge enten e-mail, Facebook eller Google som login.

Du kan også logge ind via nedenstående tjenester