[Java] Database connection

Pagina: 1
Acties:
  • 651 views sinds 30-01-2008

  • vegterb
  • Registratie: Juni 2001
  • Laatst online: 16-04 10:23

vegterb

[ZzZ]Vighter

Topicstarter
Ik probeer met behulp van Java een connectie te maken met een SQL-Database. Na wat consult bij de docent heb ik al wat gekregen, de compile gaat goed. Alleen als ik 'm draai gaat het fout! Dan krijg ik:

code:
1
2
Exception in thread "main" java.lang.NoSuchMethodError: main
Druk op een toets om door te gaan. . .


De code is:
Java:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
//Database connection - attempt 1

import java.sql.*;
import javax.servlet.*;
import javax.servlet.http.*;

public class SQLcon extends HttpServlet {
    private Connection connection;
    private Statement statement;

    public void init( ServletConfig config ) throws ServletException

    {
    try {
        System.setProperty( "db2j.system.home",
            config.getInitParameter( "databaseLocation" ) );

        Class.forName( config.getInitParameter( "databaseDriver" ) );
        connection = DriverManager.getConnection(
            config.getInitParameter( "mysql" ) );

        statement = connection.createStatement();
    }

    catch (Exception exception ) {
        exception.printStackTrace();
        throw new UnavailableException(exception.getMessage());
    }
}
}


Deze code komt deels uit het boek, dus misschien zie ik wat instellingen over het hoofd?

[ Voor 4% gewijzigd door vegterb op 20-10-2005 13:04 ]

My Laptop Specificaties vs My Desktop Specificaties


  • Gerco
  • Registratie: Mei 2000
  • Laatst online: 23:11

Gerco

Professional Newbie

Mijn eerste ingeving is dat je een Servlet als application probeert te draaien. Een Java application moet een "public static void main(String[] args)" method hebben in de main class.

Hoe draai je 'em? Aan je output te zien via een batchfile:
code:
1
java -cp <classpath> SQLcon

Dat is dus als application en niet als servlet, je zal Tomcat oid moeten gebruiken om servlets te draaien vziw.

[ Voor 40% gewijzigd door Gerco op 20-10-2005 13:06 ]

- "Als ik zou willen dat je het begreep, legde ik het wel beter uit!" | All number systems are base 10!


  • vegterb
  • Registratie: Juni 2001
  • Laatst online: 16-04 10:23

vegterb

[ZzZ]Vighter

Topicstarter
Gerco schreef op donderdag 20 oktober 2005 @ 13:04:
Mijn eerste ingeving is dat je een Servlet als application probeert te draaien. Een Java application moet een "public static void main(String[] args)" method hebben in de main class.

Hoe draai je 'em? Aan je output te zien via een batchfile:
code:
1
java -cp <classpath> SQLcon

Dat is dus als application en niet als servlet, je zal Tomcat oid moeten gebruiken om servlets te draaien vziw.
Tomcat ziet 'm niet omdat het geen applicatie is. Maar je hebt gelijk, misschien moet er een aparte dbcon.html komen of zo om het resultaat te bekijken?

Kan ik niet in het bestand zelf een stukje maken welke het resultaat terug geeft?

[ Voor 9% gewijzigd door vegterb op 20-10-2005 13:14 ]

My Laptop Specificaties vs My Desktop Specificaties


  • Gerco
  • Registratie: Mei 2000
  • Laatst online: 23:11

Gerco

Professional Newbie

vegterb schreef op donderdag 20 oktober 2005 @ 13:08:
Tomcat ziet 'm niet omdat het geen applicatie is. Maar je hebt gelijk, misschien moet er een aparte dbcon.html komen of zo om het resultaat te bekijken?
Ik heb geen idee, ik heb nog nooit wat met servlets of tomcat gedaan. Als Tomcat wil dat het een application is, zul je een "main" method moeten toevoegen met de signature in mijn vorige post. Dan is het op magische wijze een application geworden en kun je 'em wel draaien, hoop ik.
Kan ik niet in het bestand zelf een stukje maken welke het resultaat terug geeft?
Dat is dus je main method:
Java:
1
2
3
4
5
6
7
8
9
10
public class Foo {
  public static void main(String[] args) {
    Foo f = new Foo();
    f.bar();
  }

  public void bar() {
    System.out.println("foobar");
  }
}

[ Voor 30% gewijzigd door Gerco op 20-10-2005 13:18 . Reden: Er miste een "void" ]

- "Als ik zou willen dat je het begreep, legde ik het wel beter uit!" | All number systems are base 10!


  • Nick_S
  • Registratie: Juni 2003
  • Nu online

Nick_S

++?????++ Out of Cheese Error

Waarom probeer je om gelijk met je eerste databaseconnectie ook nog begrippen als Servlets e.d. te verwerken?

Java:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
//Database connection - attempt 1

import java.sql.*;

public class SQLcon {
    private Connection connection;
    private Statement statement;

    public static void main( final String[] args ) 
    {
    try {
        System.setProperty( "db2j.system.home",
            config.getInitParameter( "databaseLocation" ) );

        Class.forName( "VUL HIER JE DATABASEDRIVER CLASS IN" );
        connection = DriverManager.getConnection("VUL HIER JE CONNECTIONSTRING IN" );

        statement = connection.createStatement();
        ResultSet rs = statement.executeQuery("SELECT * FROM TABLE");

        //gebruik resultset

       //Sluit statement

      //Sluit connection

    }

    catch (Exception exception ) {
        exception.printStackTrace();
        throw new UnavailableException(exception.getMessage());
    }
}
}


Probeer dit eerst eens uit te breiden, te compilen en via de commandline te runnen. Als dat goed lukt, kun je het gaan verwerken in een servlet.

En alsjeblieft, laat dit de laatste keer zijn dat je catch(Exception) gebruikt. Vang alleen de excepties, die je verwacht.

'Nae King! Nae quin! Nae Laird! Nae master! We willna' be fooled agin!'


  • vegterb
  • Registratie: Juni 2001
  • Laatst online: 16-04 10:23

vegterb

[ZzZ]Vighter

Topicstarter
Even een topic de lucht in; ben weer wat verder gekomen! Zit alleen nu heel ergens anders weer met een probleempje, docenten zijn er even niet! Dus misschien dat hier iemand me zo kan helpen.

De database connectie heb ik nu:
Java:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
<%@ page import="java.sql.*" %>

<html>
<head>
<title> Blaab </title>
</head>

<body>


<%
    Connection con = null;

    try {
      Class.forName("com.mysql.jdbc.Driver").newInstance();
      con = DriverManager.getConnection("jdbc:mysql://localhost:3306/******",
        "root", "******");
                
      if(!con.isClosed())
        out.println("Successfully connected to " +
          "MySQL server using TCP/IP...");

    } catch(Exception e) {
      out.println("Exception: " + e.getMessage());
    } finally {
      try {
        if(con != null)
          con.close();
      } catch(SQLException e) {}
    }
%>

</body>
</html>


Maar nu komt dus de website, het is zo dat er eerst ingelogd moet worden. Maar iemand kan alleen inloggen natuurlijk als de gebruikersnaam/wachtwoord-combinatie.

Voor de gebruikersnaam en wachtwoordcombincatie heb ik:
Java:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
<%@ page import="java.sql.*" %>
<html>
<head><title>Type hier uw gebruikersnaam en wachtwoord</title></head>

<body>
<center><h1>Type hier uw gebruikersnaam en wachtwoord</h1></center>

<% if (request.getParameter("retry") != null) { %>
<p align=center><font color="red">
Foute gebruikersnaam/wachtwoord combinatie.
</font></p>
<% } %>

<% String username = request.getParameter("username");
    if (username == null) username = ""; 
   String password = request.getParameter("password");
    if (password == null) password = "";
    
    %>
    

<center>
<form action='<%= response.encodeURL(request.getContextPath()) %>
<table>
<tr>
    <td align="right">Gebruikersnaam:</td>
        <td align="left">
            <input type="text" name="gebruikersnaam" size="16" value"<%= username %>">
        </td>
</tr>
<tr>
    <td align="right">Wachtwoord:</td>
        <td align="left">
            <input type="wachtwoord" name="wachtwoord" size="20" value"<%= password %>">
        </td>
</tr>
</table>
    
<input type="submit" value="Log In">


Ik ben er nu al lang mee bezig en kan er niet uit komen. Volgens mij wordt de gebruikersnaam en het wachtwoord nu opgeslagen in 'username' en 'password'. Alleen hoe vergelijk ik dit dan met gegevens die in de database staan?

extra code die tussen de code van database connectie staat:
Java:
1
2
3
4
5
6
7
        Connection con = null;
    Statement statement = null;
    ResultSet rs = null;

     String query = "SELECT username, password FROM user";
     statement = con.createStatement();
     rs = statement.executeQuery(query);


Kan ik niet gewoon een <% if (username == rs.getString(1)) AND (password == rs.getString(2)) out.println("onjuiste gebruikersnaam of wachtwoord");%>

Dit bovenstaande werkt dus niet!

[ Voor 16% gewijzigd door vegterb op 09-11-2005 11:07 ]

My Laptop Specificaties vs My Desktop Specificaties


  • bigbeng
  • Registratie: Augustus 2000
  • Laatst online: 26-11-2021
Probeer het eens met een PreparedStatement.

Java:
1
2
3
4
5
6
7
8
String sql = "SELECT 'X' FROM [user] WHERE username = ? AND password = ?";
java.sql.PreparedStatement prep = connection.prepareStatement( sql );
prep.setString(1, username );
prep.setString(2, password );
java.sql.ResultSet = prep.executeQuery();
if ( rs.next() ) {
   // hoera, een record gevonden, dus username en wachtwoordcombi klopt
}


Maak er in elk geval alvast een goede gewoonte van om het wachtwoord nooit uit de database op te halen, maar middels een query te vergelijken. Dit maakt je applicatie net weer iets veiliger, omdat DBA's en programmeurs dan ook het wachtwoord niet kunnen herleiden (brute force even daargelaten natuurlijk :) )

[ Voor 30% gewijzigd door bigbeng op 09-11-2005 11:19 ]


  • Standeman
  • Registratie: November 2000
  • Laatst online: 22:26

Standeman

Prutser 1e klasse

met ^^

Trouwens is dan de kans op SQL injection wat kleiner aangezien je variabelen geparsed worden :)

Uiteraard wel eerst je POST variabelen uitlezen met request.getPararmeter(String fieldname);

[ Voor 32% gewijzigd door Standeman op 09-11-2005 11:18 ]

The ships hung in the sky in much the same way that bricks don’t.


  • -FoX-
  • Registratie: Januari 2002
  • Niet online

-FoX-

Carpe Diem!

Standeman schreef op woensdag 09 november 2005 @ 11:16:
Trouwens is dan de kans op SQL injection wat kleiner aangezien je variabelen geparsed worden :)
Uiteraard wel eerst je POST variabelen uitlezen met request.getPararmeter(String fieldname);
Kleiner? Volgens mij is het niet meer mogelijk om aan sql injection te doen als je werkt met prepared statements?

  • Standeman
  • Registratie: November 2000
  • Laatst online: 22:26

Standeman

Prutser 1e klasse

-FoX- schreef op woensdag 09 november 2005 @ 12:03:
[...]

Kleiner? Volgens mij is het niet meer mogelijk om aan sql injection te doen als je werkt met prepared statements?
0% kans is dus kleiner dan x% kans (als x > 0 is natuurlijk) :P

The ships hung in the sky in much the same way that bricks don’t.


  • vegterb
  • Registratie: Juni 2001
  • Laatst online: 16-04 10:23

vegterb

[ZzZ]Vighter

Topicstarter
Oké, ik heb het deels voor elkaar!

Bestand: login_venster.jsp
Java:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
<html>
<head><title>Type hier uw gebruikersnaam en wachtwoord</title></head>

<body>
<center><h1>Type hier uw gebruikersnaam en wachtwoord</h1></center>

<form methode = "post" action = "login_2.jsp"> 

</font></p>

<% String username = request.getParameter("username");
    if (username == null) username = ""; 
   String password = request.getParameter("password");
    if (password == null) password = "";
    
    %>
    
<center>
<table>
<tr>
    <td align="right">Gebruikersnaam:</td>
        <td align="left">
            <input type="text" name="username" size="16" value"<%= username %>">
        </td>
</tr>
<tr>
    <td align="right">Wachtwoord:</td>
        <td align="left">
            <input type="password" name="password" size="20" value"<%= password %>">
        </td>
</tr>
</table>
    
<input type="submit" value="Log In">


</form>

</center>
    
</body>
</html>


Deze verwijst weer naar een ander bestand en verstuurd dus 'username' en 'password'. Deze worden alleen overduidelijk verstuurd via de URL: http://localhost:8080/******/login_2.jsp?username=ikzelf&password=mijnwachtwoord
Dat wordt verstuurd naar dit bestand, welke dus met het resultaat komt of de combinatie gevonden is in de database.
Bestand: login_2.jsp
Java:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
<%@ page import="java.sql.*" %>

<%

String username = request.getParameter("username");
    if (username == null) username = ""; 
   String password = request.getParameter("password");
    if (password == null) password = "";
    
        Connection con = null;
    Statement statement = null;
    ResultSet rs = null;
    
    try {
            Class.forName("com.mysql.jdbc.Driver").newInstance();
            con = DriverManager.getConnection("jdbc:mysql://145.92.72.129:3306/******","root","*****");
   
    String sql = "SELECT 'username, password' FROM user WHERE username = ? AND password = ?";
    java.sql.PreparedStatement prep = con.prepareStatement( sql );
    prep.setString(1, username );
    prep.setString(2, password );
    rs = prep.executeQuery();
    if ( rs.next() ) {
        out.println("Record gevonden, Gebruikersnaam/Wachtwoord combinatie klopt");}
    else {
        out.println("Onjuiste Gebruikersnaam en/of Wachtwoord"); }
     
    } catch(Exception e) {
      out.println("Exception: " + e.getMessage());
    } finally {
      try {
        if(con != null)
          con.close();
      } catch(SQLException e) {}
    }
  
%>


Het probleem is dus dat als ik beide in 1 bestand zet dat meteen het complete bestand wordt uitgevoerd, dus dat zou met een 'postback' functie gedaan moeten worden of zo, maar kan daar weinig over vinden! Dus dat houd in dat het JSP gedeelte pas wordt uitgevoerd op het moment dat er op de knop gedrukt wordt.

[ Voor 16% gewijzigd door vegterb op 09-11-2005 13:50 ]

My Laptop Specificaties vs My Desktop Specificaties


  • Janoz
  • Registratie: Oktober 2000
  • Laatst online: 13:05

Janoz

Moderator Devschuur®

!litemod

Ik denk dat het handig is om het verschil tussen serverside en clientside eens een beetje onder de knie te gaan krijgen. Daarnaast lijkt het me ook handiger om toch eens naar servlets te gaan kijken, of alsnog een losstaande applicatie te gaan maken. Dit programmeren in JSP pagina's is natuurlijk behoorlijk ranzig.

Ken Thompson's famous line from V6 UNIX is equaly applicable to this post:
'You are not expected to understand this'


Verwijderd

@Janoz: Servlets zijn ook niet alles hoor, probeer maar eens op een fatsoenlijke manier de opmaak van je webpagina erin te verwerken. (nou moet ik hierover niet te veel zeggen, want ik ben zelf nog een behoorlijke n00b op dit gebied)

@vegterb: als je dit perse in een webapplicatie vorm wilt hebben, kijk hier eens naar:
http://www.javaworld.com/...999/jw-12-ssj-jspmvc.html

  • bigbeng
  • Registratie: Augustus 2000
  • Laatst online: 26-11-2021
Wow, een .NETter die overstapt naar jsp of niet?

Je kunt kijken of de jsp pagina bereikt wordt middels een post. Zo ja, dan de code uitvoeren:

Java:
1
2
3
4
5
6
if ( "POST".equals(request.getMethod()) {
   // doe je ding
}
else {
   // toon formulier
}

Een andere methode is controleren of een veld die in je form voorkomt wel deel uitmaakt van de request.getParameter("") collectie. (hint: vergelijken met null)

Overigens heeft Janoz gelijk dat het plaatsen van business logic in je jsp pagina niet heel erg netjes is. Je zou dit kunnen delegeren aan daarin gespecialiseerde classes. Maar goed, je begint net, dus ik zou me er nog niet al te druk over maken, gewoon onthouden voor later :)

En ook leuk om over na te denken is waarom ik "POST".equals() gebruik ipv de vergelijking andersom te doen.

  • vegterb
  • Registratie: Juni 2001
  • Laatst online: 16-04 10:23

vegterb

[ZzZ]Vighter

Topicstarter
De if/else werkt! Het is gewoon zo dat je opgeeft dat 'username' of 'password' niet leeg mag zijn (ook beide niet natuurlijk) als die wel leeg zijn wordt er niet eens verder gegaan krijg je meteen een melding dat je een van de 2 niet hebt ingevuld. Onze docent kwam er net ook mee, zijn 'postback' functie was toch niet zo handig ;)

En zo gaan we nog lekker verder spelen, volgende doelen:
- 'username' en 'password' legen bij start.
- 'username' en 'password' niet in URL weergeven.

[ Voor 24% gewijzigd door vegterb op 09-11-2005 15:22 ]

My Laptop Specificaties vs My Desktop Specificaties


  • Janoz
  • Registratie: Oktober 2000
  • Laatst online: 13:05

Janoz

Moderator Devschuur®

!litemod

@GHOst:

Fatsoenlijke opmaak van je HTML hoort net zo min in je servlet thuis als dat database connectie code in je jsp hoort ;).

Ken Thompson's famous line from V6 UNIX is equaly applicable to this post:
'You are not expected to understand this'


  • Standeman
  • Registratie: November 2000
  • Laatst online: 22:26

Standeman

Prutser 1e klasse

vegterb schreef op woensdag 09 november 2005 @ 13:45:
<form methode = "post" action = "login_2.jsp">
Deze worden alleen overduidelijk verstuurd via de URL:
http://localhost:8080/******/login_2.jsp?username=ikzelf&password=mijnwachtwoord
*knip*
code:
1
methode = "post"

moet zijn
code:
1
method="post"
Zonder de e dus. Anders wordt het niet herkend en er automatisch GET variabelen van gemaakt. (en GET variabelen worden via de querystring (URL) verstuurd

[ Voor 28% gewijzigd door Standeman op 09-11-2005 15:40 ]

The ships hung in the sky in much the same way that bricks don’t.


Verwijderd

Janoz schreef op woensdag 09 november 2005 @ 15:19:
@GHOst:

Fatsoenlijke opmaak van je HTML hoort net zo min in je servlet thuis als dat database connectie code in je jsp hoort ;).
Inderdaad, vandaar die link in mijn post ;)

  • Standeman
  • Registratie: November 2000
  • Laatst online: 22:26

Standeman

Prutser 1e klasse

Verwijderd schreef op woensdag 09 november 2005 @ 15:41:
[...]

Inderdaad, vandaar die link in mijn post ;)
Ik geloof dat de TS nog niet wilt gaan denken aan Struts & tag libraries enzo.. Dus boeit het ook niet zo :)

The ships hung in the sky in much the same way that bricks don’t.


Verwijderd

Standeman schreef op woensdag 09 november 2005 @ 15:46:
[...]


Ik geloof dat de TS nog niet wilt gaan denken aan Struts & tag libraries enzo.. Dus boeit het ook niet zo :)
/me checkt link...
volgens mij gaat dit over JSP model 2 architecture. Oftewel MVC design patterns binnen java web applicaties. Servlets als je controller, JavaBeans als je model en JSP als je view. Geen struts, geen tag libraries, gewoon standaard java.

Ik geef toe, minder interessant als je alleen een database verbinding aan de gang wilt krijgen, maar dan boeit het ook eigenlijk niet of je dat in een JSP doet of in een servlet.

  • Standeman
  • Registratie: November 2000
  • Laatst online: 22:26

Standeman

Prutser 1e klasse

Verwijderd schreef op woensdag 09 november 2005 @ 16:01:
[...]

/me checkt link...
volgens mij gaat dit over JSP model 2 architecture. Oftewel MVC design patterns binnen java web applicaties. Servlets als je controller, JavaBeans als je model en JSP als je view. Geen struts, geen tag libraries, gewoon standaard java.

Ik geef toe, minder interessant als je alleen een database verbinding aan de gang wilt krijgen, maar dan boeit het ook eigenlijk niet of je dat in een JSP doet of in een servlet.
Struts is een implementatie van (een webbased) MVC en tag libraries behoort zeker tot de JSP model 2 architecture dacht ik.. :P

Maar goed, het wordt zo een beetje offtopic

The ships hung in the sky in much the same way that bricks don’t.


  • vegterb
  • Registratie: Juni 2001
  • Laatst online: 16-04 10:23

vegterb

[ZzZ]Vighter

Topicstarter
Standeman schreef op woensdag 09 november 2005 @ 15:37:
[...]


code:
1
methode = "post"

moet zijn
code:
1
method="post"
Zonder de e dus. Anders wordt het niet herkend en er automatisch GET variabelen van gemaakt. (en GET variabelen worden via de querystring (URL) verstuurd
Ja, ik had het ook al gezien |:(
Beide problemen opgelost! :)
Natuurlijk zijn er genoeg dingen om het wat mooier te laten verlopen, dus daar ga ik nu nog ff aan werken! (d.w.z.: zorgen dat 'Gebruikersnaam EN wachtwoord invullen' niet meteen verschijnt als je begint, moet niet zo moeilijk zijn...)
Standeman schreef op woensdag 09 november 2005 @ 16:05:
[...]


Struts is een implementatie van (een webbased) MVC en tag libraries behoort zeker tot de JSP model 2 architecture dacht ik.. :P

Maar goed, het wordt zo een beetje offtopic
Beetje maar :Y)

[ Voor 25% gewijzigd door vegterb op 09-11-2005 16:23 ]

My Laptop Specificaties vs My Desktop Specificaties


Verwijderd

Ben het wel met Janoz eens. Java code in een JSP en dan met name DB stuff is wel ongelooflijk lelijk en fout. Het symboliseerd exact een PHP style, waar je met Java toch eigenlijk boven zou moeten staan.

Het mooie is dan weer wel dat het wel -kan- en dat het voor beginners makkelijker is. Dit is een praktijk voorbeeld dat je in Java eigenlijk zonder problemen net zo kan werken als in PHP en daarom dat Java dus net zo makkelijk is.

Voor hele kleine projecten of proto-typing kun je de java code dus wel in de JSP houden. Wil je toch meer in 'echte' Java style gaan werken, dan kun je ook zonder struts, jsf of consorten redelijk makkelijk een beetje het MVC principe toepassen.

Standaard MVC is dat een servlet de originele request ontvangt, wat logic uitvoert, een bean in een voor de page toegankelijke scope zet (meestal request scope) en dan forward naar een JSP. Op de JSP voer je geen enkele logica uit, maar ittereer je alleen een beetje over de data die in de bean zit. Hiervoor gebruik je dan geen java, maar JSTL en EL.

Met een kleine versimpeling kun je dit principe ook al op een enkele JSP pagina toepassen zonder een servlet. Je werkt dan met een condensed model & controller object; gewoon een bean met 1 init functie die de controller start. Op je page zet je 1 java statement helemaal bovenaan die deze functie aanroept.

Schematisch voorbeeld:

Java:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
public class BeanExample {

    // data
    int exampleInt = 0;
     
    public void init ( HttpServletRequest request ) {
                  // do or call business logic

                 // populate bean data
     }


     public int getExampleInt() {
           return exampleInt;
     }

}


Java Server Page:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
<%@ taglib uri="http://java.sun.com/jsp/jstl/core" prefix="c" %>
<jsp:usebean id="test "class="BeanExample" scope="request" />
<jsp:setProperty name=test" property="*" />


<%-- the one and only java statement --%>
<% test.init(request); %>

<%-- below here, use only HTML, JSTL and EL --%>
<html> <body>

Hi, the example integer has value: <c:out value="${test.exampleInit}" /> <br>

</body></html>


Op deze manier kun je dus kinderlijk eenvoudig, zonder moeilijk te leren concepten al heel snel een beetje speels het MVC idee toepassen. Zo ben je later mentaal beter voorbereid op het echte MVC werk.

Dat is namelijk het grote nadeel van met Java code op de JSP pagina beginnen. Zoals gezegd, het is voor de beginner wel makkelijker, maar de kans is groot dat je in deze aanpak blijft hangen en mentaal moeilijk de overstap kunt maken omdat je het op deze manier gewend bent.

Ik durf te beweren dat JSTL en EL samen zelfs makkelijker zijn dan puur java. Gewoon de core tags in JSTL zijn super makkelijker, en iedereen die ook werkende Java op een JSP pagina kan prakken zou dat binnen een half uurtje moeten kunnen oppikken.

[ Voor 19% gewijzigd door Verwijderd op 09-11-2005 22:47 ]


  • JKVA
  • Registratie: Januari 2004
  • Niet online

JKVA

Design-by-buzzword fanatic

Om een tussenoplossing te noemen (want veel mensen vinden het woord BEAN vrij eng) kun je ook eerst beginnen met klasses en functies te maken die de logica bevatten en deze alleen in de JSP aan te roepen. (Dit is in feite ongeveer hetzelfde als Henk_de_man zegt, maar dan in hele simpele taal :) )

Nogmaals, ik ben het helemaal met Henk_de_man eens, maar heb het even anders vertaald. :P

[ Voor 14% gewijzigd door JKVA op 09-11-2005 22:55 ]

Fat Pizza's pizza, they are big and they are cheezy


Verwijderd

JKVA schreef op woensdag 09 november 2005 @ 22:54:
Om een tussenoplossing te noemen (want veel mensen vinden het woord BEAN vrij eng) kun je ook eerst beginnen met klasses en functies te maken die de logica bevatten en deze alleen in de JSP aan te roepen. (Dit is in feite ongeveer hetzelfde als Henk_de_man zegt, maar dan in hele simpele taal :) )

Nogmaals, ik ben het helemaal met Henk_de_man eens, maar heb het even anders vertaald. :P
Hmmm, ok :) Ipv bean zeg je dan maak "een class waarbij je alle functies waarmee je data wilt ophalen in de jsp met get laat beginnen. De eerste letter na get moet een hoofdletter zijn."

In feite leg je dan elke keer dat je het woordje "bean" gebruik weer uit wat een bean is. Wordt alleen een beetje lastig als het woord bean zeg 5 keer in een beschrijving voorkomt.

Je kunt het dan wel de 2de keer iets afkorten met "het type class wat boven uitgelegd werd (die met de get voor de functies)"

en dan de derde keer in je verhaal met alleen "het type class wat boven uitgelegd".

Eigenlijk is het wel vrij essentieel dat zelf beginners meteen leren EL te gebruiken op JSP pages. EL is opzich makkelijker, maar je moet je java functies die data ophalen dus wel even allemaal met get laten beginnen om het maar op z'n allersimpelst te zeggen.

Wat dat betreft zijn de basic getters/setters in java eigenlijk een overbodige tussenstap. Het zou veel makkelijker zijn als je standaard via EL direct bij je fields kon, en alleen als je getters HEBT dat dan die gebruikt worden. Aangezien EL met reflection werkt zou dat enorm simpel te realiseren moeten zijn en heb je er niet eens een taal uitbreiding zoals C# voor nodig

  • vegterb
  • Registratie: Juni 2001
  • Laatst online: 16-04 10:23

vegterb

[ZzZ]Vighter

Topicstarter
Het is inderdaad JSP voor beginners en kan me voorstellen dat het er niet echt uit ziet. Ik doe dit voor een opdrachtgever, voor mijn opleiding. In de eerste instantie heb ik hier op mijn opleiding les gehad in 'normale' Java gehad. Hier was ik geen ster in, maar heb de basis nog wel een beetje onthouden.

Om deze reden heb ik bij de mediatheek van mijn school (Hoge school van Amsterdam) een boek gehaald: 'Web Development with JavaServerPages'. aan de hand hiervan heb ik ook bovenstaande bestanden opgesteld. Helaas heb ik geen tijd om het boek vanaf het begin door te werken, noem het ongeduldig, maar de tijd laat het gewoon niet toe. Nadeel is dat ik volgende periode (2006) pas les krijg in JSP. Opleiding loopt voor mij niet echt logisch, natuurlijk veranderen ze dat nu pas zodat toekomstige studenten eerst JSP leren en het dan maken ;)

Rare is dat als dit slecht/geen JSP zou zijn onze docenten er niets van zeggen en gewoon zeggen dat het er zo goed uit ziet. Maar misschien ziet het er voor Java goed uit, daarbij hebben ze misschien geen verstand van JSP en wel van Java.

Ik ben nu ook nog aan het kijken wat ik met MVC kan en of ik gebruik kan maken van die Beans, maar is dat wel handig in combinatie met SQL? Ik zie namelijk dat Beans alleen informatie onthouden en opslaan en dat je deze makkelijk in elk ander bestand kunt opvragen. Alle informatie die bij mij opgevraagd of verstuurd wordt komt van of moet naar mijn database en niet tijdelijk opgeslagen worden.

Of weten jullie een goed boek voor JSP (JSTL :?) Want ik krijg een beetje het idee dat het huidige boek een beetje te veel op Java blijft hangen en te weinig echt JSP gebruikt. Want Beans staan hier wel uitgelegd, maar niet erg lang en praktijk voorbeeld zijn natuurlijk de manier om het het beste (voor mij) om het te leren.

edit:
Ik heb nu trouwens die 2 losse bestanden samengevoegd tot 1 bestand! :P

[ Voor 5% gewijzigd door vegterb op 10-11-2005 11:42 ]

My Laptop Specificaties vs My Desktop Specificaties


Verwijderd

vegterb schreef op donderdag 10 november 2005 @ 11:35:
[..]
Ik ben nu ook nog aan het kijken wat ik met MVC kan en of ik gebruik kan maken van die Beans, maar is dat wel handig in combinatie met SQL? Ik zie namelijk dat Beans alleen informatie onthouden en opslaan en dat je deze makkelijk in elk ander bestand kunt opvragen. Alle informatie die bij mij opgevraagd of verstuurd wordt komt van of moet naar mijn database en niet tijdelijk opgeslagen worden.
[..]
Je zou iets kunnen proberen met een BeanFactory. Je maakt een klasse met een methode createBean waarin je je database logica zet. Je geeft aan deze methode door wat je bean uniek maakt (username/password?) en laat die methode uitzoeken welke gegevens in die bean komen te staan. Vervolgens geef je die bean weer terug.

  • wasigh
  • Registratie: Januari 2001
  • Niet online

wasigh

wasigh.blogspot.com

Er is nogal een verschil tussen beans en enterprise beans
Een Bean is in principe niets meer dan een POJO een Plain Old Java Object wat getters en setters en geen publieke variabelen.

Een EnterpriseBean is een Object wat kan leven in een Bean Container en wat gericht is op het J2EE platform. Om gebruik te maken van een enterprise bean heb je een application server nodig. Terwijl je voor jsp's & servlets genoeg hebt aan een tomcat.

Mijn advies: blijf nog even weg bij Enterprise Beans. En maak volgens goede OO principes een mooie applicatie waarbij de logica scheidt van de presentatie. (Wat het basis idee achter MVC is)

  • vegterb
  • Registratie: Juni 2001
  • Laatst online: 16-04 10:23

vegterb

[ZzZ]Vighter

Topicstarter
wasigh schreef op donderdag 10 november 2005 @ 13:02:
Er is nogal een verschil tussen beans en enterprise beans
Een Bean is in principe niets meer dan een POJO een Plain Old Java Object wat getters en setters en geen publieke variabelen.

Een EnterpriseBean is een Object wat kan leven in een Bean Container en wat gericht is op het J2EE platform. Om gebruik te maken van een enterprise bean heb je een application server nodig. Terwijl je voor jsp's & servlets genoeg hebt aan een tomcat.

Mijn advies: blijf nog even weg bij Enterprise Beans. En maak volgens goede OO principes een mooie applicatie waarbij de logica scheidt van de presentatie. (Wat het basis idee achter MVC is)
Oké, dat is dus wat ik nu heb OO maken? Want ik ben nu aan het verdiepen in Beans, heeft dat een beetje zin of zal ik die links laten liggen en het gewoon een Java-based applicatie maken? Want ze beginnen hier in het boek hoe je een Bean moet aanroepen, dat snap ik nu, nu nog een bean maken :X Ben een amateur-java-programmeur en een beginnende-JSP-programmeur B) Do the math... :+

My Laptop Specificaties vs My Desktop Specificaties


  • wasigh
  • Registratie: Januari 2001
  • Niet online

wasigh

wasigh.blogspot.com

Als je beginnende JSP programmeur bent zou ik me nog niet bezig gaan houden met EnterpriseJavaBeans.
Als ik jou was zou ik verder gaan met JSP's en Servlet's. En idd zorgen dat je code netjes OO is (en het liefst MVC).
Voor JSP en servlets is de flow vaak devolgende:

[JSP] ---> [SERVLET] ---> [JSP];
Oftwel, je hebt een JSP pagina voor je neus in de browser, daarop voer je een actie uit, (form submit bijv), Die actie gaat naar een servlet, die server handelt de request af. Afhankelijk van succes of failure redirect de servlet je naar een bepaalde JSP.

Hierbij wordt de JSP alleen gebruikt om data te tonen (data ophalen uit de database bijvoorbeeld) en de servlet om wijzigingen te maken (data wegschrijven, gegevens valideren etc)

Daarnaast moet je proberen je methods zoveel bij elkaar te groeperen in classes vie de OO richtlijnen, maar dat moet natuurlijk altijd!

  • Standeman
  • Registratie: November 2000
  • Laatst online: 22:26

Standeman

Prutser 1e klasse

vegterb schreef op donderdag 10 november 2005 @ 13:15:
[...]


Oké, dat is dus wat ik nu heb OO maken? Want ik ben nu aan het verdiepen in Beans, heeft dat een beetje zin of zal ik die links laten liggen en het gewoon een Java-based applicatie maken? Want ze beginnen hier in het boek hoe je een Bean moet aanroepen, dat snap ik nu, nu nog een bean maken :X Ben een amateur-java-programmeur en een beginnende-JSP-programmeur B) Do the math... :+
Beans stellen helemaal niets voor.
Voorbeeldje:

Stel je hebt een HTML pagina met een 1 textarea erop en een submit button

Dan maak je een Bean
code:
1
2
3
4
5
6
7
8
9
10
11
12
13
public class Bean {
  private String text;

  public Bean() {
  }

  public String getText() {
  }

  public void setText() {
  }

}


Daarna maak je een "Action" object (servlet) welke de bean vult.
(bijv. Struts doet dit in principe automatisch voor je dat is er dan ook zo makkelijk aan :))

Je Action object geeft de Bean door aan een Buisiness Object (bijv. Person object) welke wat waarden controleerd e.d.. Daarnaa benaderd het Business Object een DAO object (Data Access Object). Hierin staat je SQL Code, je connection object, etc) waarmee je een CRUD actie op je database uitvoerd (naar gelang je nodig hebt).

Dus de hele gang van zaken ziet er dan ongeveer zo uit:
JSP --> Action --> Business Object --> DAO

Wanneer je het MCV en DAO pattern doorleest zou het 1 en ander wat duidelijker moeten worden. (Doe dit wel wanneer je tijd over hebt. Begin er niet 2 dagen voor de deadline van een schoolopdracht (8> )

(p.s. Dit is allemaal een beetje recht door de bocht en eenvoudig gebracht. Maar het is netter dan SQL code in je JSP en is een begin naar het opdelen van functionaliteit in verschillende lagen)

[ Voor 17% gewijzigd door Standeman op 10-11-2005 15:14 ]

The ships hung in the sky in much the same way that bricks don’t.


  • vegterb
  • Registratie: Juni 2001
  • Laatst online: 16-04 10:23

vegterb

[ZzZ]Vighter

Topicstarter
Om de een of andere reden wordt:
Java:
1
2
3
4
5
6
7
8
                        if ( rst.next() )
                        {
                            %><B><%
                            out.println(name_taxonomic);
                            %></B><%
                            out.println(" Staat al in de database");
                            %><BR><%
                        }

Genegeerd tijdens het uitvoeren. Hier wordt namelijk iets ingevoerd in de database. Maar, als 1 van de 3 dingen die ingevoerd worden al bestaat dan wordt dit weergegeven en niets ingevoerd in de database. Dit werkte, toen ik iets veranderde en het weer terug zette met CTRL-Z werkte het ineens niet meer. Nu wordt (rst.next()) genegeerd, ook als ik deze verander in rsta.next of iets dergelijks blijft de applicatie 'm negeren.

De code, grotendeels:
Java:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
<%@ page import="java.sql.*" %>
<%@ taglib uri="taglib.tld" prefix="page" %>
<%! String name_taxonomic, name_english, name_dutch; %>


<%
    name_taxonomic = request.getParameter("name_taxonomic");
    name_english = request.getParameter("name_english");
        name_dutch = request.getParameter("name_dutch");
        Connection con = null;
    Statement statement = null;
    ResultSet rst = null;
    ResultSet rse = null;
    ResultSet rsd = null;
    String String_ActionStatus;
    boolean ActionStatus = false;
        PreparedStatement ps = null;
%>

//Een heleboel HTML-code...

    <page:isPostBack>
    <%
    
    
    
            if ((name_english != null && name_english != "" ) && (name_dutch != null && name_dutch != "") && (name_taxonomic != null && name_taxonomic != ""))
            {
           
             try {
            Class.forName("com.mysql.jdbc.Driver").newInstance();
            con = DriverManager.getConnection("jdbc:mysql://*******:3306/*****","root","*****");
                                    
                
                String sql_t = "SELECT 'name_taxonomic' FROM animal WHERE name_taxonomic = ?";
                        java.sql.PreparedStatement prept = con.prepareStatement( sql_t );
                        prept.setString(1, name_taxonomic );
                        rst = prept.executeQuery();
            String sql_e = "SELECT 'name_english' FROM animal WHERE name_english = ?";
                        java.sql.PreparedStatement prepe = con.prepareStatement( sql_e );
                        prepe.setString(1, name_english );
                        rse = prepe.executeQuery();
            String sql_d = "SELECT 'name_dutch' FROM animal WHERE name_dutch = ?";
                        java.sql.PreparedStatement prepd = con.prepareStatement( sql_d );
                        prepd.setString(1, name_dutch );
                        rsd = prepd.executeQuery();
                        
                        if (( rst.next() ) || ( rse.next() ) || ( rsd.next() ))
                        {
                        if ( rst.next() )
                        {
                            %><B><%
                            out.println(name_taxonomic);
                            %></B><%
                            out.println(" Staat al in de database");
                            %><BR><%
                        }
                        if ( rse.next() )
                        {
                            %><B><%
                            out.println(name_english);
                            %></B><%
                            out.println(" Staat al in de database");
                            %><BR><%
                        }
                        if ( rsd.next() )
                        {
                            %><B><%
                            out.println(name_dutch);
                            %></B><%
                            out.println(" Staat al in de database");
                        }
                        }
                        else
                        {
                                        
                String query = "INSERT INTO animal (name_taxonomic, name_english, name_dutch) VALUES (?,?,?)";
                    ps = con.prepareStatement(query);
                    statement = con.createStatement(); 
                            ps.setString(1, name_taxonomic);
                        ps.setString(2, name_english);
                        ps.setString(3, name_dutch);
                        ps.executeUpdate();
                        name_taxonomic = null;
                        name_english = null;
                        name_dutch = null;
         
                
                ActionStatus = !ActionStatus;
                
            if ( ActionStatus == true )
            {
                        String_ActionStatus = "Het invoegen van de informatie is gelukt";
            out.println(String_ActionStatus);
                    
            }
            else 
            {
                            String_ActionStatus = "Het invoegen van de informatie is niet gelukt";
            }
                             }  
                }
             catch(Exception e) {
               out.println("Exception: " + e.getMessage());
             } finally {
               try {
                 if(con != null)
                   con.close();
               } catch(SQLException e) {}
             }
            
        }
        else 
        {
        out.println("Please fill in all names");
        }
    %>
</page:isPostBack>


Ik weet dat het er lelijk uit ziet, maar het is even voor zover ik het kan B)
Alleen dit is iets wat gewoon niet logisch is! Het moet gewoon werken, de anderen die er vrijwel exact hetzelfde uitzien rse.next() en rsd.next() werken wel! ook als ik hier rst.next() van maken vallen ze weg. De name_taxonomic wordt nog wel gewoon uitgelezen.

Edit:
Ik ben erachtergekomen dat het niet bij de code ligt die ik hier als eerste gaf in deze reply, maar aan:
Java:
1
if (( rst.next() ) || ( rse.next() ) || ( rsd.next() ))

En als ik er:
Java:
1
if (( rse.next() ) || ( rst.next() ) || ( rsd.next() ))

van maak, dan valt rse.next() weg! |:(

[ Voor 19% gewijzigd door vegterb op 16-11-2005 12:45 ]

My Laptop Specificaties vs My Desktop Specificaties


Verwijderd

Hint: ResultSet.next() verplaatst de cursor naar de volgende rij, en returned true als het gelukt is. Op regel 48 roep je rst.next() aan, en op regel 50 nog een keer. Hierbij sla je dus rijen over. Iets zegt me dat dat niet helemaal de bedoeling is...

  • Robtimus
  • Registratie: November 2002
  • Laatst online: 14:06

Robtimus

me Robtimus no like you

Je weet dat rse.next() e.d. ook daadwerkelijk een record vooruit gaan in de resultset? Dat het dus niet alleen maar teruggeeft DAT er een volgend record is, maar ook meteen dat record selecteert?

Wat GHOst dus zegt.

[ Voor 6% gewijzigd door Robtimus op 16-11-2005 13:15 ]

More than meets the eye
There is no I in TEAM... but there is ME
system specs


  • vegterb
  • Registratie: Juni 2001
  • Laatst online: 16-04 10:23

vegterb

[ZzZ]Vighter

Topicstarter
Verwijderd schreef op woensdag 16 november 2005 @ 13:13:
Hint: ResultSet.next() verplaatst de cursor naar de volgende rij, en returned true als het gelukt is. Op regel 48 roep je rst.next() aan, en op regel 50 nog een keer. Hierbij sla je dus rijen over. Iets zegt me dat dat niet helemaal de bedoeling is...
Ja, die roep ik daar aan in een if-statement. Omdat als 1 van de 3 gevonden wordt in de DB de if-statement gestart moet worden. Dan wil ik dat de gene die teruggevonden zijn de DB op het scherm komen, zodat je kunt zien welke al in de DB staan. Maar waarom wordt de eerst, van de if-statement van regel 48, dan niet op het scherm gezet?

My Laptop Specificaties vs My Desktop Specificaties


  • xos
  • Registratie: Januari 2002
  • Laatst online: 26-03 10:21

xos

Je zou eventueel eens kunnen overwegen gebruik te maken van de dbcp van tomcat. Je kan op de tomcat site hier meer informatie over vinden. Je pagina ziet er dan al een stuk netter uit ;)

Voorbeeldje van mijn datasource <webapp>/WEB-INF/context.xml:
XML:
1
2
3
4
5
6
7
8
9
10
<?xml version="1.0" encoding="UTF-8"?>
<Context path="/JSFexample">
    <Resource 
    name="jdbc/postgres" 
    auth="Container"
    type="javax.sql.DataSource" 
    driverClassName="org.postgresql.Driver"
    url="jdbc:postgresql://hurricane:5432/experimental"
    username="" password="" maxActive="20" maxIdle="10" maxWait="-1"/>
</Context>

Door het in de context.xml file te plaatsen ipv in de server configuratie wordt deze connection pool niet gedeeld met andere applicaties.

Je kan dan zoiets doen:
Java Server Page:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
<%@ taglib uri="http://java.sun.com/jsp/jstl/sql" prefix="sql" %>
<%@ taglib uri="http://java.sun.com/jsp/jstl/core" prefix="c" %>

<%@page contentType="text/html"%>
<%@page pageEncoding="UTF-8"%>

<sql:query var="rs" dataSource="jdbc/postgres">
    select kolom1, kolom2 from tabel
</sql:query>

<ul class="list">
   <c:forEach var="row" items="${rs.rows}">
      <li> ${row.kolom1 ${row.kolom2} </li>
   </c:forEach>
</ul>


Waarbij jdbc/postgres de naam van je datasource is.

Overgens ben ik pas sinds gisteren hier mee bezig dus misschien is mijn aanpak ook niet erg netjes. Uiteindelijk is het plaatsen van een query op je jsp pagina niet echt de bedoeling. Dat zou beter in een class kunnen. Maar dat is voor mij ook nog een te zetten stap :Y)

[ Voor 14% gewijzigd door xos op 16-11-2005 15:04 ]


Verwijderd

vegterb schreef op woensdag 16 november 2005 @ 13:22:
[...]


Ja, die roep ik daar aan in een if-statement. Omdat als 1 van de 3 gevonden wordt in de DB de if-statement gestart moet worden. Dan wil ik dat de gene die teruggevonden zijn de DB op het scherm komen, zodat je kunt zien welke al in de DB staan. Maar waarom wordt de eerst, van de if-statement van regel 48, dan niet op het scherm gezet?
regel 47:
code:
1
2
3
4
5
ResultSet:
cursor
element 1
element 2
element 3

regel 48, na het uitvoeren van ResultSet.next():
code:
1
2
3
4
5
ResultSet:
element 1
cursor
element 2
element 3

regel 50, na het uitvoeren van ResultSet.next():
code:
1
2
3
4
5
ResultSet:
element 1
element 2
cursor
element 3

Met het 1e element heb je niets gedaan.

Wat je zou kunnen doen is het volgende:
Java:
1
2
3
4
5
6
7
8
boolean nextRst = rst.next();
boolean nextRse = rse.next();
boolean nextRsd = rsd.next();
if (nextRst || nextRse || nextRsd){
  if (nextRst){
    // handle rst...
  }
}


edit:
@xos: wtf heeft een connection pool hier nou weer mee te maken? Dit is gewoon verkeerd omgaan met een resultset, niet met connections...

[ Voor 8% gewijzigd door Verwijderd op 16-11-2005 16:48 ]


  • xos
  • Registratie: Januari 2002
  • Laatst online: 26-03 10:21

xos

@xos: wtf heeft een connection pool hier nou weer mee te maken? Dit is gewoon verkeerd omgaan met een resultset, niet met connections...
In mijn eerste paragraaf zeg ik dat hij eventueel kan overwegen gebruik te maken van de dbcp. Ik heb het gepost omdat dit de code al een stuk leesbaarder maakt. Maar het heeft idd niks te maken met het resultset probleem.

Verwijderd

vegterb schreef op woensdag 16 november 2005 @ 12:09:
Edit:
Ik ben erachtergekomen dat het niet bij de code ligt die ik hier als eerste gaf in deze reply, maar aan:
Java:
1
if (( rst.next() ) || ( rse.next() ) || ( rsd.next() ))

En als ik er:
Java:
1
if (( rse.next() ) || ( rst.next() ) || ( rsd.next() ))

van maak, dan valt rse.next() weg! |:(
Ik snap dat het nu nog allemaal hocus pocus en tovenarij voor je is, maar dat moet je maar voor lief nemen als je zomaar als totale beginner met progammeren begint zonder eerst een boek gelezen te hebben. (overigens is dat WEL een goede manier om te leren programmeren hoor; gewoon doen).

Anyway, waar je tegen op loopt heet LAZY EVALUATION of ook wel short-circuiting genoemt.

Wat hier gebeurd, is dat bij een logische IF (de ||'s ) de recherkant niet meer ge-evalueerd (bekeken) wordt als de linkerkant al true is.

In jouw geval zal in

Java:
1
if (( rse.next() ) || ( rst.next() ) || ( rsd.next() ))


rse.next() true opleveren. Blijkbaar bevat deze resultset maar 1 rij, en zal er bij het volgende if statement dus false uitkomen. Jij noemt dit 'wegvallen'. rst.next() en rsd.next() zijn na je eerste if statement nog niet aangeroepen. Als deze dus ook 1 rij bevatten, dan zullen deze de volgende keer dus true opleveren.

De les die je, als het goed is ;) , nu hebt geleerd is:

-Bij een expressie waarin je de logische || operator gebruikt, zal de evaluatie stoppen zodra de eerste operand true is. Evaluatie gaat altijd van links naar rechts. (bij && is het andersom, dan stopt de evaluatie als de eerste false is)

-ResultSet.next() is een rottige functie. In tegenstelling tot de gebruikelijke iterators, is dit een test EN een cursor beweging tegelijk.

Als je hier wat mee wilt spelen, run dan eens code zoals:

Java:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
// genereer je query zoals eerst, gebruik dan:
if ( rst.next() ) {
   out.println( "true" );
}
else {
   out.println( "false" );
}

if ( rst.next() ) {
   out.println( "true" );
}
else {
   out.println( "false" );
}


Uit jouw beschrijving maak ik op dat jouw resultset 1 rij terug geeft. Dus, met deze code krijg je eerst true, en dan false op je scherm. copy-paste dit eventueel achter elkaar (of zet het in een while loop) en aanschouw dat rst.next() niet eeuwing het zelfde blijft terug geven.

Om lazy evaluation in de praktijk te testen:

Java:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
<%! boolean test(JspWriter out) throws java.io.IOException {  out.println( "in test<br>" ); return true; } %>
<%! boolean test1(JspWriter out)throws java.io.IOException {  out.println( "in test1<br>" ); return true; } %>
        
<%
    if ( true || test(out) ) {
        out.println( "in if statement 1<br><br>" );
    }
    if ( false || test(out) ) {
        out.println( "in if statement 2<br><br>" );
    }
    if ( false || test(out) || test1(out) ) {
        out.println( "in if statement 3<br><br>" );
    }
%>


Je zult hier zien dat bij de eerste if, er geen output van de test functie komt. Deze wordt nooit aangeroepen omdat de linker kant al true is.
Bij de 2de if wordt de test functie wel aangeroepen, omdat de linker kant nog niet true is (namelijk false)
Bij de 3de if wordt de test functie wel aangeroepen, maar test1 niet. Dit omdat test al true terug geeft en de gehele expressie dus al true is.

  • vegterb
  • Registratie: Juni 2001
  • Laatst online: 16-04 10:23

vegterb

[ZzZ]Vighter

Topicstarter
Ik weet dat het officieel niet mag (volgens mij), maar GoT'ers bedankt! Mij op de goede weg helpen heeft erg geholpen en is zeer leerzaam, door het gewoon te doen leer je toch het meeste.

Nadeel, vind ik, nog wel dat op Internet overal Servlets en Beans gewerkt wordt en dat krijg ik nog niet echt aan de praat. Zo krijg ik nu weer een:
code:
1
javax.servlet.ServletException: Incompatible magic value 1886741100 in class file UserData

Ik ben er nog niet helemaal achter hoe dit komt! Ik wil namelijk een sessie starten, zo wordt ook het HTML en JSP netjes gescheiden in bestanden. In 1e bestand krijg je gewoon de vraag om een gebruikersnaam en wachtwoord in te voeren, vervolgens wordt dit in een JSP bestand gecontroleerd en wordt je weer doorgestuurd naar een ander bestand. Natuurlijk is het niet helemaal netjes als je het bestand (waarin je gebruikersnaam/wachtwoord wordt vergeleken met wat er in de database staat) nog even 1 sec. te zien krijg in de adresbalk. Om deze reden wilde ik gebruik gaan maken van Beans.

Niet erg makkelijk begrijp ik, maar niet onmogelijk! Het wil mij echter nog niet helemaal duidelijk worden hoe ik nou om moet springen met zo'n Bean. Ik heb dus de volgende bestanden:
  • inlog.jsp = HTML/JSP (Opgeven gebruikersnaam en wachtwoord)
  • inlog_dbcon.jsp = JSP (Database connectie)
  • NextPage.jsp = JSP (Uiteindelijke te bereiken pagina)
  • UserData.class = Bean :? (Locatie waar username/password opgeslagen worden in de sessie)
Als iemand mij even een duwtje in de goede richting kan geven ;)

Ik zit er nu namelijk mee dat als je iets invoert in inlog.jsp, je daar dus de Bean declareerd als:
Java:
1
<jsp:useBean id="user" scope="session" class="UserData"/>

Vervolgens moet je dus de waarde username en password opslaan in deze bean, ik dacht dus dat dat ging d.m.v.:
Java:
1
2
3
4
<%
user.setUsername(username);
user.setPassword(password);
%>

Maar dit gaat dus niet goed anders zou ik die foutmelding nooit krijgen, want volgens mij wijst die erop dat er niks in de Bean staat

Deze moeten dan eerst nog gecontroleerd worden in inlog_dbcon.jsp om te kijken of de gebruikersnaam en het wachtwoord wel goed is. Dus dan zou ik bij dit een resultaat moeten toevoegen, wat ook weer wordt opgeslagen in de Bean? Zodat dat resultaat aangeroepen kan worden om te bepalen of er toegang verkregen wordt tot een pagina. Daarnaast kan de gebruikersnaam vervolgens weer gebruikt worden om de hele naam van de gebruiker uit de DB te halen en op de pagina te zetten als zijnde: 'Hallo ......".

Nu krijg ik het (waarschijnlijk) niet zo ver dat er een waarde in de Bean wordt gezet. Tutorials op internet laten wel leuk zien hoe het zou moeten, maar zo werkt het bij mij niet, ik heb iets meer nodig!

edit:

Oh, ik wil henk_DE_man en GHOst. nog bedanken voor hun uitleg!



Ik deed iets helemaal fout, op het moment dat het inlogscherm te zien is werd er al een waarde uit de Bean/class gehaald. Terwijl de waardes er nog ingezet moeten worden, dus moet je de Bean eerst aanmaken en waardes er naartoe sturen. Maar volgens mijn boek B) moet dat als volgt:
Java:
1
2
3
4
5
6
7
8
9
10
<%
public UserData makeUser(resultSet rs)
{
    UserData user = new UserData();
    user.setUsername(rs.getString("username"));
    user.setPassword(rs.getString("password"));

return bean;
}
%>

Omdat ik een UserData.class heb waar dus de gebruikersnaam en het wachtwoord ingezet wordt. Of is het handiger om het resultaat van de gebr/ww-controlle hierin te zetten? |:(


Oké, ik dacht: "Als het niet met een Bean lukt, dan zet ik het in een cookie". Maar ik heb aan het begin van de applicatie besloten om geen gebruik te maken van Servlets en heb me daar ook niet in verdiept. Ik programmeer nu Java in JSP en dat geeft waarschijnlijk problemen. Ik ben nu ff het spoor bijster, ik denk dat een Bean toch beter/makkelijker is, dus toch daar maar weer mee verder.

Als iemand nog suggesties heeft... _/-\o_

[ Voor 29% gewijzigd door vegterb op 23-11-2005 14:52 ]

My Laptop Specificaties vs My Desktop Specificaties


Verwijderd

vegterb schreef op woensdag 23 november 2005 @ 10:42:
code:
1
javax.servlet.ServletException: Incompatible magic value 1886741100 in class file UserData
Is dat niet de melding die je krijgt als je gecompileerde class een andere major JDK release heeft gebruikt dan de JRE waarmee je het runt? Mischien dat je compiled in Java 5.0 format en probeerd te draaien met een 1.4.2 VM?
Ik ben er nog niet helemaal achter hoe dit komt! Ik wil namelijk een sessie starten, zo wordt ook het HTML en JSP netjes gescheiden in bestanden.
Mischien dat je nu een beetje bij het punt bent aangekomen dat je toch eens wat theorie moet gaan lezen, zodat je een beetje weet wat je aan het doen bent. Lees eens de hoofdstukken goed door van core servlets and jsp's op bijvoorbeeld: http://pdf.coreservlets.com/

Ik merk heel duidelijk in je posting dat je heel veel termen en begrippen echt door elkaar haalt. Een sessie start je niet expliciet, die maakt de application server/servlet container (bv Tomcat) automatisch voor je. Een session is feitelijk een hashmap waar je objecten in kunt stoppen. Beans, maar ook gewoon Strings of Integers, etc.

Vervolgens is er geen sprake van dat je HTML en JSP netjes gescheiden moet houden. Een JSP pagina IS een HTML pagina, met daartussen taglib tags, EL, en eventueel een beetje scriptlets (=java).
Niet erg makkelijk begrijp ik, maar niet onmogelijk! Het wil mij echter nog niet helemaal duidelijk worden hoe ik nou om moet springen met zo'n Bean.
Het is juist erg makkelijk. Een bean is gewoon een java class, waarbij je de fields benader door middel van zogenaamde getters en setters. Ook in 'gewone' java classes heb je al bijna altijd de conventie (gebruik) om getters en setters te gebruiken. Bv getPassWord(), of getUserName(). Etc.
  • inlog.jsp = HTML/JSP (Opgeven gebruikersnaam en wachtwoord)
  • inlog_dbcon.jsp = JSP (Database connectie)
  • NextPage.jsp = JSP (Uiteindelijke te bereiken pagina)
  • UserData.class = Bean :? (Locatie waar username/password opgeslagen worden in de sessie)
Dit gaat kwa structuur al niet helemaal lekker. Een aparte JSP page voor een DB connection?

Vervolgens begrijp je ook niet 100% wat nou precies een session is. Het is niet perse zo dat je alleen via de bean iets in de session kan zetten. In jouw voorbeeld staat een object van type UserData wel in de session, dus zal die set functies calls inderdaad wat in de session zetten, maar het is niet zo dat je die bean daar perse voor nodig hebt.

Niet dat je nu zo moet doen, maar even voor het begrip, zet je met de volgende code ook iets in de session:

<%
String user = "joop!";
session.setAttribute("user", user); %>
%>

Gebruikelijker is echter dat je toch de bean gebruikt. Als je aan de pagina waarop de useBean tag staat de page parameters username en password meegeeft (bv in de browser aanroepen met mypage.jsp?username=piet&password=bla), dan zet je met de tag:

Java:
1
<jsp:setProperty name="user" property="*"/>


Meteen alles tegelijk. Feitelijk is dit een afkorting van ongeveer iets als:

Java:
1
2
3
4
5
6
<%
String username = request.getParameter("username");
if (username != null && username.length() > 0 ) {
    user.setUsername(username);
}
%>
Ik zit er nu namelijk mee dat als je iets invoert in inlog.jsp, je daar dus de Bean declareerd als:
Java:
1
<jsp:useBean id="user" scope="session" class="UserData"/>
Volgens mij is het ook niet (meer) legaal om een class uit de unnamed package te gebruiken. Zet je class UserData dus in een package. Bv maak een directory beginner aan in je source tree, en zet dan boven in je UserData.java, package beginner; Vervolgens gebruik je in de useBean tag, class="beginner.UserData".
Java:
1
2
3
4
<%
user.setUsername(username);
user.setPassword(password);
%>

Maar dit gaat dus niet goed anders zou ik die foutmelding nooit krijgen, want volgens mij wijst die erop dat er niks in de Bean staat
??? Als de variable user naar "niks' zou verwijzen, dan zou je een nullpointer exception krijgen. Een setter zal geen foutmelding opleveren omdat er nog "niks" in de bean staat (wat dat in jouw terminologie dan ook precies mag betekenen ;) ).

Normaal zou dit wel moeten werken opzich. Ik zou het eerst eens gaan zoeken in het gebruik van een package en gezien de magic number melding in het gebruik van de zelfde compiler en runtime versie.
Deze moeten dan eerst nog gecontroleerd worden in inlog_dbcon.jsp om te kijken of de gebruikersnaam en het wachtwoord wel goed is. Dus dan zou ik bij dit een resultaat moeten toevoegen, wat ook weer wordt opgeslagen in de Bean?
Eigenlijk is dit typisch servlet werk, maar goed als je die persie niet wilt gebruiken zou ik eerder op je inlog pagina 1 functie van bean aanroepen die checked of de name and password kloppen.

bv:

Java:
1
<% user.doLogin(); %>


Vervolgens staat AL je DB code in deze doLogin functie. Als je via de DB gecontroleerd hebt of de inlog klopt, dan zet je een boolean op true. Voor deze boolean maak je dan een getter in je bean, bijvoorbeeld boolean getLogin(); // (isLogin() mag ook)

Op de pagina zelf zet je dan iets van:
Java:
1
2
3
4
5
6
7
8
9
<c:choose>
   <c:when test="$ { user.login == true }" >
      <jsp:forward page="NextPage.jsp" />
   </c:when>
   
   <c:otherwise>
       <HTML> <body> Inlog klopt niet... bla bla... inlog form hier enz </body> </html>
   </c:otherwise>
</c:choose>
Java:
1
2
3
4
5
6
7
8
9
10
<%
public UserData makeUser(resultSet rs)
{
    UserData user = new UserData();
    user.setUsername(rs.getString("username"));
    user.setPassword(rs.getString("password"));

return bean;
}
%>
In deze situatie lijkt me dit niet de manier. username en password komen van via een form van de user. Deze zet je in je bean. Dan controlleer je of een record met die combinatie in de DB voorkomt. Is er tenminste 1 rij met die combinatie? Dan zet je de boolean op true, anders op false.

Verwijderd

Hej JSP :) daar zijn we bij mij op de opleiding ook mee bezig op het moment en het gaat me wel redelijk af mischien kan ik je af en toe helpen via MSN (bram AT pouwelse PUNT be) ik heb voor een klasgenoot ook een voorbeeldje gemaakt met wat beans en een database connectie dit kan ik je evt ook wel sturen via MSN

  • vegterb
  • Registratie: Juni 2001
  • Laatst online: 16-04 10:23

vegterb

[ZzZ]Vighter

Topicstarter
Nu krijg ik alleen weer de foutmelding:
Java:
1
org.apache.jasper.JasperException: /inlog.jsp(1,1) The value for the useBean class attribute begin.UserData is invalid.
|:(

Ik heb dus het UserData.class staan in: C:\Program Files\Apache Software Foundation\Tomcat 5.5\webapps\*****\web-inf\classes\begin

inlog.jsp bevat dus het HTML, daar zie je dus het inlogvenster en het bevat de databaseconnectie waarmee dus de gebruikersnaam en wachtwoord vergeleken wordt. Bovenaan inlog.jsp staat, waar de foutmelding vandaan komt:
Java:
1
<jsp:useBean id="user" scope="session" class="UserData"/>


Ik zie dan alleen nog niet helemaal voor me hoe dat met dat <% user.doLogin(); %> werkt, want mijn UserData.class ziet er nou zo uit:
Java:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
import java.beans.*;

public class UserData

{

    String username;
    String password;
    boolean Login;

    public void setUsername( String value )
    {
        username = value;
    }

    public void setPassword( String value )
    {
        password = value;
    }

    public void setLogin (boolean value)
    {

        Login = value;

    }

    public String getUsername() { return username; }

    public String getPassword() { return password; }

    public boolean getLogin() { return Login; }
}

Ookal is dat misschien fout, ik blijf die fout van die Bean krijgen, en die krijg ik dus niet weg!

My Laptop Specificaties vs My Desktop Specificaties


Verwijderd

vegterb schreef op donderdag 24 november 2005 @ 15:56:
Nu krijg ik alleen weer de foutmelding:
Java:
1
org.apache.jasper.JasperException: /inlog.jsp(1,1) The value for the useBean class attribute begin.UserData is invalid.
|:(

Ik heb dus het UserData.class staan in: C:\Program Files\Apache Software Foundation\Tomcat 5.5\webapps\*****\web-inf\classes\begin

[...]

Java:
1
<jsp:useBean id="user" scope="session" class="UserData"/>
Dat is toch een makkelijke fout? Je zegt nu alleen dat ie de bean UserData moet gebruiken zonder package prefixes. Dat slaat dus op de default package. Je bean staat nu echter in de package "begin".

Je moet dus gebruiken:

Java:
1
<jsp:useBean id="user" scope="session" class="begin.UserData"/>


Dit is toch wel erg basic stuff hoor...
Ik zie dan alleen nog niet helemaal voor me hoe dat met dat <% user.doLogin(); %> werkt, want mijn UserData.class ziet er nou zo uit:
Gewoon die functie aan je class toevoegen mischien? Die setLogin kun je ook weghalen, want je zal die boolean JUIST NIET vanaf buiten willen zetten! Alleen een getLogin is nodig.

  • vegterb
  • Registratie: Juni 2001
  • Laatst online: 16-04 10:23

vegterb

[ZzZ]Vighter

Topicstarter
Verwijderd schreef op donderdag 24 november 2005 @ 16:46:
[...]


Dat is toch een makkelijke fout? Je zegt nu alleen dat ie de bean UserData moet gebruiken zonder package prefixes. Dat slaat dus op de default package. Je bean staat nu echter in de package "begin".

Je moet dus gebruiken:

Java:
1
<jsp:useBean id="user" scope="session" class="begin.UserData"/>
Ja, dat had ik eerst ook staan, maar dan verdwijnt de foutmelding dus niet! Staat UserData wel op de goede plek? Of moet ik die in een andere dir zetten? Want waar zoekt JSP naar de .class bestanden? In de web-inf\classes\-dir?

Dat was inderdaad wel erg basic! Maar ik ga aan het werk, nu eerst ff studeren... :+

edit:
Wel super dat je zo uit wil leggen, henk_DE_man

[ Voor 9% gewijzigd door vegterb op 25-11-2005 10:42 ]

My Laptop Specificaties vs My Desktop Specificaties


  • bigbeng
  • Registratie: Augustus 2000
  • Laatst online: 26-11-2021
Je moet ook de regel code:
Java:
1
package begin;

opnemen in je java file (zag ik in je laatste source niet staan).
Bovendien moet je .class file dan ook in een subfolder ' begin' staan t.o.v. je classpath (of in een subfolder van een jar-file die in je class-path voorkomt, maar zover ben je vast nog niet ;) )...

Bij Tomcat behoort (normaalgesproken) WEB-INF/classes van je webapplicatie tot je classpath en dus moet je bovenstaande doen en dan je gecompileerde file in WEB-INF/classes/begin neerzetten.

Duidelijk?

Wat ik trouwens zou aanraden is dat je de werking van classpaths voor Java verder onderzoekt, dit kan een heleboel raadsels voor je oplossen, in elk geval ten aanzien van ClassNotFound exceptions.

  • vegterb
  • Registratie: Juni 2001
  • Laatst online: 16-04 10:23

vegterb

[ZzZ]Vighter

Topicstarter
bigbeng schreef op vrijdag 25 november 2005 @ 13:41:
Je moet ook de regel code:
Java:
1
package begin;

opnemen in je java file (zag ik in je laatste source niet staan).
Bovendien moet je .class file dan ook in een subfolder ' begin' staan t.o.v. je classpath (of in een subfolder van een jar-file die in je class-path voorkomt, maar zover ben je vast nog niet ;) )...

Bij Tomcat behoort (normaalgesproken) WEB-INF/classes van je webapplicatie tot je classpath en dus moet je bovenstaande doen en dan je gecompileerde file in WEB-INF/classes/begin neerzetten.

Duidelijk?

Wat ik trouwens zou aanraden is dat je de werking van classpaths voor Java verder onderzoekt, dit kan een heleboel raadsels voor je oplossen, in elk geval ten aanzien van ClassNotFound exceptions.
Misschien neem ik nu 1 stap te veel, door te blijven vragen maar ik kom er dus niet uit. Ik blijf deze foutmelding krijgen:

code:
1
org.apache.jasper.JasperException: /inlog.jsp(5,0) The value for the useBean class attribute begin.Userdata is invalid.


login.jsp

Java:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
<%@ page import="java.sql.*" %>
<%@ taglib uri="taglib.tld" prefix="page" %>

package begin;
<jsp:useBean class="begin.Userdata" id="Userdata" scope="session" />

<HTML>
    <head><title>Type hier uw gebruikersnaam en wachtwoord</title>
    <LINK REL="STYLESHEET" type="text/css" href="opmaak.css"></head>
        <body>

<%
String username = request.getParameter("username");
    if (username == null) username = "";
String password = request.getParameter("password");
    if (password == null) password = "";
%>

           <center><h1>Type hier uw gebruikersnaam en wachtwoord</h1></center>

           <form method = "post" action = "inlog_dbcon.jsp">

           </font></p>

           <center>

           <table>
           <tr>
            <td align="right">Gebruikersnaam:</td>
                <td align="left">
                    <input type="text" name="username" size="16" value"<%= username %>">
                </td>
           </tr>
           <tr>
            <td align="right">Wachtwoord:</td>
                <td align="left">
                    <input type="password" name="password" size="20" value"<%= password %>">
                </td>
           </tr>
           </table>

           <input type="submit" value="Log In">

           </form>
        </body>
</HTML>


Ik heb een map staan waar dit bestand dus in staat, inlog.jsp. Dan heb ik dus /classes/begin. Daarin staat mijn Userdata.class.

My Laptop Specificaties vs My Desktop Specificaties


  • bigbeng
  • Registratie: Augustus 2000
  • Laatst online: 26-11-2021
Het feit dat je class file in de map begin staat zorgt er niet automatisch voor dat hij ook tot de package begin behoort. Heb je het eerste stuk van mijn antwoord wel uitgevoerd?

  • vegterb
  • Registratie: Juni 2001
  • Laatst online: 16-04 10:23

vegterb

[ZzZ]Vighter

Topicstarter
bigbeng schreef op dinsdag 29 november 2005 @ 15:52:
Het feit dat je class file in de map begin staat zorgt er niet automatisch voor dat hij ook tot de package begin behoort. Heb je het eerste stuk van mijn antwoord wel uitgevoerd?
Ja, nu zit het dus zo:
Userdata.class (staat in \WEB-INF\classes\begin\)
Userdata.java (staat in \WEB-INF\classes\)
login.jsp (Staat in de root (van de applicatie))

In de Userdata.java heb ik het 'package begin' ingevoerd, gecompileerd en de .class in de map begin gezet. Maar hij blijft met dezelfde foutmelding komen! Ik speel nog ff en als je wat weet hoor ik het wel.. :+

Staat het in inlog.jsp wel goed? Want die info die daarin staat moet dus naar de Bean toe!

[ Voor 8% gewijzigd door vegterb op 29-11-2005 17:48 ]

My Laptop Specificaties vs My Desktop Specificaties


Verwijderd

[quote]vegterb schreef op dinsdag 29 november 2005 @ 15:48:
[...]


Misschien neem ik nu 1 stap te veel, door te blijven vragen maar ik kom er dus niet uit. Ik blijf deze foutmelding krijgen:

code:
1
org.apache.jasper.JasperException: /inlog.jsp(5,0) The value for the useBean class attribute begin.Userdata is invalid.


login.jsp

Java:
1
2
3
<%@ page import="java.sql.*" %>
package begin;
<jsp:useBean class="begin.Userdata" id="Userdata" scope="session" />


Waarom staat die "package begin;" nu boven je useBean? Dat zijn nu gewoon chars die naar je client gaan :)

Je noemt je class nu Userdata, maar in de definitie die je eerder gaf was het nog UserData. Programmeertalen zijn over het algemeen hoofdletter gevoelig. Userdata en UserData zijn dus niet hetzelfde.

Geef ons anders nog maar eens de complete definitie van je UserData.java file.

Overigens is het de conventie om je id niet dezelfde naam als je class te geven. Gebruik liever "userData", of "userdata".

  • vegterb
  • Registratie: Juni 2001
  • Laatst online: 16-04 10:23

vegterb

[ZzZ]Vighter

Topicstarter
login.jsp:
Java:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
<%@ page import="java.sql.*" %>
<%@ taglib uri="taglib.tld" prefix="page" %>

<HTML>
    <head><title>Type hier uw gebruikersnaam en wachtwoord</title>
    <LINK REL="STYLESHEET" type="text/css" href="opmaak.css"></head>
        <body>

<jsp:useBean id="userdata" scope="session" class="begin.UserData"/>

<%  String username = request.getParameter("username");
    if (username == null) username = "";
    String password = request.getParameter("password");
    if (password == null) password = "";
    %>

           <center><h1>Type hier uw gebruikersnaam en wachtwoord</h1></center>

           <form method = "post" action = "inlog.jsp">

           </font></p>

           <center>

           <table>
           <tr>
            <td align="right">Gebruikersnaam:</td>
                <td align="left">
                    <input type="text" name="username" size="16" value"<%= username %>">
                </td>
           </tr>
           <tr>
            <td align="right">Wachtwoord:</td>
                <td align="left">
                    <input type="password" name="password" size="20" value"<%= password %>">
                </td>
           </tr>
           </table>

           <input type="submit" value="Log In">

           </form>
        </body>
</HTML>


<page:isPostBack>

<center>
<%
    Connection con = null;
    Statement statement = null;
    ResultSet rs = null;

if (username != "" && password != "") {
    try {
            Class.forName("com.mysql.jdbc.Driver").newInstance();
            con = DriverManager.getConnection("jdbc:mysql://localhost:3306/******","root","******");

    String sql = "SELECT 'username, password' FROM user WHERE username = ? AND password = ?";
    java.sql.PreparedStatement prep = con.prepareStatement( sql );
    prep.setString(1, username );
    prep.setString(2, password );
    rs = prep.executeQuery();
    if ( rs.next() )
    {
            userdata.setUsername(username);
            userdata.setPassword(password);

            %>
        <jsp:forward page="NextPage.jsp" />
            <%
    }
    else {
        out.println("<BR><BR>Onjuiste Gebruikersnaam en/of Wachtwoord"); }

    }
    catch(Exception e) {
      out.println("Exception: " + e.getMessage());
    } finally {
      try {
        if(con != null)
          con.close();
      } catch(SQLException e) {}
    }
  }

else out.println("<BR><BR>Gebruikersnaam EN wachtwoord invullen AUB");
%></page:isPostBack></center>


UserData.class

code:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
package begin;
public class UserData

{

    String username;
    String password;

    public void setUsername( String value )
    {
        username = value;
    }

    public void setPassword( String value )
    {
        password = value;
    }

    public String getUsername() { return username; }

    public String getPassword() { return password; }


login.jsp verwijst dan door naar NextPage.jsp
Java:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
<HTML>
<BODY>

<%@ page import="java.sql.*" %>
<%@ taglib uri="taglib.tld" prefix="page" %>

<jsp:useBean id="userdata" scope="session" class="begin.UserData"/>

Name is: <%= userdata.getUsername() %> <br>
Pass is: <%= userdata.getPassword() %>


</BODY>
</HTML>

Hier staat beetje veel in, het is een rommeltje geworden in dit bestand en ben ik nog ff aan het uitzoeken.

Edit:
Of ik moet me nu diep schamen of iets anders, maar ik had web-inf en meta-inf in mijn map niet in hoofdletters gedaan en om de een of andere reden werkt het nu deels. bovenstaande bestanden pas ik aan naarmate ik vorder


Nu moet het dus zover komen dat ik wel kan zien wat er in de Bean staat. (of er uberhaupt iets in staat)

Edit 2:
Het werkt! Zoals het hier boven staat wordt de info succesvol uitgelezen! :D

Of ziet het er nou heel lelijk uit?

[ Voor 246% gewijzigd door vegterb op 30-11-2005 12:54 ]

My Laptop Specificaties vs My Desktop Specificaties


Verwijderd

vegterb schreef op woensdag 30 november 2005 @ 10:41:
Het werkt! Zoals het hier boven staat wordt de info succesvol uitgelezen! :D[/b]
Zie je nu wel. Zo moeilijk is het allemaal niet :)

Soms is het voor zulke dingen makkelijker om Eclipse (of andere IDE zoals NetBeans) te gebruiken. Je krijgt dan meldingen als je classes op een JSP page gebruikt die niet bestaan. Voor Eclipse moet je dan nog wel een plug-in downloaden voor J2EE dingen (bv WTP of MyEclipse).
Of ziet het er nou heel lelijk uit?
Tsja, voor een professional die met J2EE z'n brood verdient zou het erg lelijk zijn, maar voor een absolute beginner is het best aardig en een goede start om mee te beginnen.

Een 2de stap zou zijn om zoveel mogelijk Java code van je JSP page zelf weg te halen.

Zo kun je op je login.jsp

Java:
1
2
3
4
String username = request.getParameter("username");
    if (username == null) username = "";
    String password = request.getParameter("password");
       if (password == null) password = ""; 


weghalen, en daarvoor in de plaats:

Java:
1
<jsp:setProperty name="userdata" property="*"/>


, bijna helemaal boven in je page zetten (zie zometeen beneden voor de juiste plaats).

Vervolgens voeg je 1 field toe aan je class, die je bijvoorbeeld "Action" noemt:

Java:
1
2
3
4
5
String action = "";

public void setAction(String value) {
    action = value;
}


Hierna zet je zo ongeveer al je code die nu op je login.page tussen de page:isPostBack tag staan in een functie die je doLogin() noemt ofzo. Op je page voeg je een hidden input toe die het login commando gaat geven:

HTML:
1
<input type="hidden" name="action" value="">


Als je verschillende "actions" op je page kunt uitvoeren kun je hier met javascript handlers telkens een andere waarde in zetten, maar voor nu kun je makkelijkst een vaste waarde erin zetten. Bv "login" :

HTML:
1
<input type="hidden" name="action" value="login">


Aan je class voeg je nu nog een functie toe:

Java:
1
2
3
4
5
6
public void handleAction() {
   if (action.equals("login") {
      doLogin();
   }
   action=""; 
}


In de doLogin verander je if ( rs.next() ) { ...} van je oude code in if ( rs.next() ) { logedIn = true };
Waarbij je dan voor logedIn natuurlijk weer een field aanmaakt en een getter.
Als er geen rij is zet je een error boolean op true waarvoor je ook weer een field en een getter aangemaakt had op de bekende wijze.

Op je pagina zet je nu boven <HTML> iets van:

Java:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
<%@ taglib uri="http://java.sun.com/jsp/jstl/core" prefix="c" %>
<jsp:setProperty name="userdata" property="*"/>
<%userdata.handleAction();%>

<c:choose>
   
   <c:when test="${userdata.logedIn}">
      <jsp:forward page="NextPage.jsp" />
   </c:when>
   
   <c:when test="${userdata.error}">
      <BR><BR>Onjuiste Gebruikersnaam en/of Wachtwoord
   </c:when>

   <c:otherwise>   
      <html>
       rest van het html inlog form hier
   </c:otherwise>
</c:choose>


Letop dat de jsp:setproperty dezelfde is die je eerder had neergezet. Deze moet dus niet 2x op de page komen te staan.

Alhoewel het voor mij nog makkelijker was geweest, geef ik je dus niet een complete listing maar moet je zelf nog even wat stappen volgen en nadenken. Bovenstaande is echter wel de algemene structuur zoals "profesionele" oplossingen ook werken. Natuurlijk is dit -veel- simpelder, maar mocht je door gaan met programmeren dan zul je een dergelijk structuur nog wel vaker gaan tegenkomen.

Iniedergeval hoef je natuurlijk niet deze structuur perse over te nemen om het werkend te krijgen maar is het wel aan te raden.

suc6!

  • vegterb
  • Registratie: Juni 2001
  • Laatst online: 16-04 10:23

vegterb

[ZzZ]Vighter

Topicstarter
Wow, dat wordt ingewikkeld! (Voor mij B))

Ik heb even geprobeerd uit te voeren en te snappen wat ik moest doen, maar als ik het goed begrijp krijg definieer je username, password en restriction dan als volgt:
Java:
1
2
3
<jsp:setProperty name="userdata" property="username"/>
<jsp:setProperty name="userdata" property="password"/>
<jsp:setProperty name="userdata" property="restriction"/>

Of hoeft dat niet? Kun je echt puur gebruik maken van:
Java:
1
<jsp:setProperty name="userdata" property="*"/>

Zodat die met behulp van de Bean username,password en restriction definieerd?
Misschien kijk ik er vanuit een iets te basic oogpunt tegenaan, ben voorlopig nog een beginner die te veel wil! B)

Oké, dan het volgende in je UserData.class:
HTML:
1
2
3
4
5
String action = "";

public void setAction(String value) {
    action = value;
}

Deze definieerd action, action voort de login uit? Op het moment dat:
Java:
1
<input type="hidden" name="action" value="login">

wordt uitgevoerd start de functie doLogin() (Hier kom ik zo nog ff op terug) welke dan dus de hele database connectie uitvoert en gebruikersnaam en wachtwoord controleerd en de Bean gezet. Dat gebeurd dus hierin:
HTML:
1
2
3
4
5
6
public void handleAction() {
   if (action.equals("login") {
      doLogin();
   }
   action=""; 
}

Wordt dan daarna action weer leeg gehaald of is dat als action leeg is?

Dan kom ik dus terug op een vraag die ik eerder gesteld had, ik weet nog niet hoe ik de code die nu op de login.page tussen de page:isPostBack tag staat in een functie zet, de werking en locatie van een functie is mij nog niet duidelijk. Moet ik de code die tussen de page:isPostBack staat dan gewoon door laten staan, maar dan dus de <% %> en de page:isPostBack weghalen en daarvoor in de plaats zetten:
Java:
1
2
3
4
5
6
7
8
9
<script language="JavaScript">
 
    function doLogin()
    {
<%
//Database Connectie Code
%>
    }
</script>

Dan moet er dus alleen nog een logedIn in de .class gezet worden, zodat deze op TRUE gezet kan worden. Kan ik deze dan standaard op FALSE zetten? Zodat als er nog niet is ingelogd er een actie uitgevoerd kan worden?

Dan zou ik dit erin moeten zetten:
Java:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
<%@ taglib uri="http://java.sun.com/jsp/jstl/core" prefix="c" %>
<jsp:setProperty name="userdata" property="*"/>
<%userdata.handleAction();%>

<c:choose>
   
   <c:when test="${userdata.logedIn}">
      <jsp:forward page="NextPage.jsp" />
   </c:when>
   
   <c:when test="${userdata.error}">
      <BR><BR>Onjuiste Gebruikersnaam en/of Wachtwoord
   </c:when>

   <c:otherwise>   
      <html>
       rest van het html inlog form hier
   </c:otherwise>
</c:choose>

Maar dat werkt niet, omdat 'c' niet herkend wordt, dit moet dan toch vervangen worden door een lokaal bestand: taglib uri="http://java.sun.com/jsp/jstl/core", dit zou dan vervangen moeten worden door iets als: <%@ taglib uri="taglib.tld" prefix="page" %> maar ik zou geen idee hebben welk bestand ik ervoor nodig heb om van 'c' gebruik te kunnen maken. Want wat is 'c' precies? (Kan ik ook wel ff uitzoeken trouwens O-) )

Edit 1:
Ik heb nu een c.tld gevonden, maar dan krijg ik dit:
code:
1
org.apache.jasper.JasperException: Failed to load or instantiate TagLibraryValidator class: org.apache.taglibs.standard.tlv.JstlCoreTLV


Edit 2:
Oké, daarvoor moet ik JSTL geïnstalleerd hebben?

Edit 3:
JSTL werkt nu, maar ik kan onderstaande niet verwijderen, want dan zijn ze niet gedefinieerd:
Java:
1
2
3
4
String username = request.getParameter("username");
    if (username == null) username = "";
    String password = request.getParameter("password");
       if (password == null) password = "";


Vervolgens krijg ik nog foutmelding:
code:
1
javax.servlet.ServletException: javax.servlet.jsp.JspException: An error occurred while evaluating custom action attribute "test" with value "${userdata.logedIn}": Unable to find a value for "logedIn" in object of class "begin.UserData" using operator "." (null)


Ik heb namelijk dit toegevoegd in de .class:
code:
1
2
3
4
5
6
Boolean logedIn;

    public void setlogedIn(Boolean value)
        {
            logedIn = value;
        }

[ Voor 49% gewijzigd door vegterb op 01-12-2005 13:51 ]

My Laptop Specificaties vs My Desktop Specificaties


  • vegterb
  • Registratie: Juni 2001
  • Laatst online: 16-04 10:23

vegterb

[ZzZ]Vighter

Topicstarter
Oké,

Alles werkt nu bijna heb weer een aantal andere functies toegevoegd en wil nu nog 1 dingetjes werkend hebben. Dat als ik inlog dat het menu (links in een ander frame) vernieuwd. In menu.jsp staat het menu namelijk zo dat, afhankelijk van je restrictie, je keuzes te zien krijgt. Hiervoor is echter wel een refresh nodig, zodat opnieuw gekeken wordt of je wel ingelogd bent en welke restrictie je hebt.

Nu heb ik het op het moment zo staan:
code:
1
                <input type="submit" value="Log In" onclick="parent.leftFrame.location.href='menu.jsp'">

Alleen werkt dat natuurlijk niet, omdat op het moment dat je op 'log in' klikt je nog niet ingelogd bent 8)7.

Dan zijn er nog een tal van andere mogelijkheden, Java-sriptje:
code:
1
2
3
4
5
<script type="text/javascript">
<!--
parent.framenaam.location.href="teladenpagina.php";
//-->
</script>

Ook weer op vele verschillende manieren, maar ik krijg dit niet werkend!

My Laptop Specificaties vs My Desktop Specificaties


  • bigbeng
  • Registratie: Augustus 2000
  • Laatst online: 26-11-2021
parent.framenaam.document.location.href = 'blabla.html'

  • vegterb
  • Registratie: Juni 2001
  • Laatst online: 16-04 10:23

vegterb

[ZzZ]Vighter

Topicstarter
bigbeng schreef op woensdag 07 december 2005 @ 14:14:
parent.framenaam.document.location.href = 'blabla.html'
Het bestaan daarvan had ik zelf ook al gevonden, alleen wil dat dus niet werken!
Of ik zet het op een verkeerde plek neer...

My Laptop Specificaties vs My Desktop Specificaties


  • bvp
  • Registratie: Maart 2005
  • Laatst online: 16-04 19:03

bvp

vegterb schreef op woensdag 07 december 2005 @ 14:22:
[...]


Het bestaan daarvan had ik zelf ook al gevonden, alleen wil dat dus niet werken!
Of ik zet het op een verkeerde plek neer...
Ik denk het wel.
Je zou bij een onLoad van de pagina "NextPage.jsp" deze refresh aan kunnen roepen...

  • bigbeng
  • Registratie: Augustus 2000
  • Laatst online: 26-11-2021
Overigens, als (let op als, want ik vind het ondingen) ik met frames werk pak ik inloggen en dergelijke meestal anders aan. Ik zorg ervoor dat de inlogpagina controleert of hij in de top geladen is, zo niet, dan zet hij de locatie van de top naar de inlogpagina. Dus dan is er geen menu meer in beeld, alleen nog de inlogpagina. De verwerkpagina van het inloggen laat ik na succes doorverwijzen naar de frameset pagina.
voorbeeld van login.jsp:
HTML:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
<html>
<head>
<title>blabla</title>
<script type="text/javascript">
  function doCheckTopFrame() {
    if ( parent.frames[0] != null )
      top.location.href="login.jsp";
  }
</script>
</head>
<body onload="doCheckTopFrame()">
<form action="verwerkLogin.jsp">
....
</form>
</body>
</html>

[ Voor 30% gewijzigd door bigbeng op 07-12-2005 15:17 ]


Verwijderd

vegterb schreef op donderdag 01 december 2005 @ 12:28:
Java:
1
2
3
<jsp:setProperty name="userdata" property="username"/>
<jsp:setProperty name="userdata" property="password"/>
<jsp:setProperty name="userdata" property="restriction"/>

Of hoeft dat niet? Kun je echt puur gebruik maken van:
Java:
1
<jsp:setProperty name="userdata" property="*"/>
Je kunt puur gebruik maken van dat laatste. De * staat voor "Alle properties" . Je zou alleen die eerste expliciete syntax gebruiken als je:

-2 of meer beans op je pagina gebruikt met dezelfde property names
-Er parameters met de request meekomen die 'toevallig' dezelfde naam hebben als properties van je bean, maar die niet gezet mogen worden.

Aangezien beide niet het geval zijn zou ik gewoon voor de enkele regel gaan. Dat is veel makkelijker.
Deze definieerd action, action voort de login uit? Op het moment dat:
Java:
1
<input type="hidden" name="action" value="login">

wordt uitgevoerd start de functie doLogin() (Hier kom ik zo nog ff op terug) welke dan dus de hele database connectie uitvoert [...]
Nee, op die manier kan het (helaas) niet. Er is namelijk geen garantie in welke volgorde je page parameters verstuurd worden en gezet worden als properties in je bean. Je doLogin() mag pas beginnen als alle parameters gezet zijn. Je 'zou' dit met een truukje kunnen doen; toch de properties stuk voor stuk zetten en dan bij de laatste property (bv cmd) als zij-effect de doLogin() functie aanroepen. Over het algemeen is dit bad-practice omdat andere mensen (en jij zelf na een tijdje ook niet meer) verwachten dat er zoiets gebeurd. Beter niet doen dus.

De enigste manier is om dan gewoon een enkele regel scriptlet (java code) op je pagina te zetten die de handleAction() aanroept:

Java:
1
<% userBean.handleAction(); %>
Wordt dan daarna action weer leeg gehaald of is dat als action leeg is?
Staat toch in de code? Cmd wordt in de handleAction op het laatst weer op de lege string gezet. Dit om te voorkomen dat als je page gewoon zo wordt aangeroepen (zonder cmd's of parameters) je bean toch gaat proberen in te loggen.
de werking en locatie van een functie is mij nog niet duidelijk.
Dan moet je eigenlijk toch eerst wat meer programmeer kennis gaan opdoen door een basis cursus te kopen of te lezen. Functies zijn in bijna iedere programmeer taal een basis concept. Of het nu Java, C++, C#, PHP, Javascript, visual basic, of whatever is.
Maar dat werkt niet, omdat 'c' niet herkend wordt, dit moet dan toch vervangen worden door een lokaal bestand: taglib uri="http://java.sun.com/jsp/jstl/core", dit zou dan vervangen moeten worden door iets als: <%@ taglib uri="taglib.tld" prefix="page" %>
Nee :) Zo werkt het helemaal niet. Maar het is een begrijpelijke fout. Zelfs zogenaamde experts maken hem. "http://java.sun.com/jsp/jstl/core" is alleen maar een key, GEEN URL. Op het moment dat je de JSTL libs aan je project toevoegd wordt deze 'key' gewoon bij de container (bv tomcat) geregistreerd. Je kunt dan refereren naar de lib dmv deze key. Voor het zelfde geldt hadden ze hem genoemd "vegterb_moet_beter_leren_proggen" oid ;)
JSTL werkt nu, maar ik kan onderstaande niet verwijderen, want dan zijn ze niet gedefinieerd:
Java:
1
2
3
4
String username = request.getParameter("username");
    if (username == null) username = "";
    String password = request.getParameter("password");
       if (password == null) password = "";
Als je het goed doet heb je ze niet meer nodig. Overal waar je username wilt afdrukken gebruik je ${userBean.username}. Als je JSTL inderdaad werkend hebt kun je iets beter gebruik maken van <c:out value="${userBean.username}" />. Deze doet namelijk automatisch XML escaping, zodat je niet (minder) bang hoeft te zijn voor cross-site script injection.
Vervolgens krijg ik nog foutmelding:
code:
1
javax.servlet.ServletException: javax.servlet.jsp.JspException: An error occurred while evaluating custom action attribute "test" with value "${userdata.logedIn}": Unable to find a value for "logedIn" in object of class "begin.UserData" using operator "." (null)
Dit is waarschijnlijk makkelijk, je hebt alleen een setter gemaakt en geen getter. Voor Java is de property logedIn nu write-only. Met alleen een getter zou ie read-only zijn en dat is wat je hier wilt. Een setter MAG dus niet eens, anders zou iemand met een request als mypage.jsp?logedIn=true zichzelf kunnen inloggen en alle security omzeilen!

  • vegterb
  • Registratie: Juni 2001
  • Laatst online: 16-04 10:23

vegterb

[ZzZ]Vighter

Topicstarter
Verwijderd schreef op woensdag 07 december 2005 @ 21:01:
Voor het zelfde geldt hadden ze hem genoemd "vegterb_moet_beter_leren_proggen" oid ;)
O-)

Bedankt, ik kan voorlopig weer ff verder! _/-\o_
Alleen wil het niet op elke computer hetzelfde werken als ik het overzet, zoals de bean waar nog niks mee gedaan is niet gebruikt kan worden en er een JSP foutmelding komt. Maar dat ga ik natuurlijk eerst ff zelf zien op te lossen voordat ik jullie lastig val }:O

My Laptop Specificaties vs My Desktop Specificaties


  • vegterb
  • Registratie: Juni 2001
  • Laatst online: 16-04 10:23

vegterb

[ZzZ]Vighter

Topicstarter
Om het aantal topics op GoT niet te vergroten zet ik het even hier bij, omdat dit topic eigenlijk al vrij algemeen was en op een gegeven moment al niet meer over de database connectie ging.

Nu zit echt weer muurvast, website is bijna af, maar er moet nog wat in gerekend worden. Dat wil zeggen dat ik een waarde/variabele wil vergelijken met een getal. Simpel geschreven:
Java:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
**SQL commando**

quantitycount = rs.getString(1);

        double b = Double.valueOf(quantitycount);

        if (b => 1000 && =< 999999)
            {
                b / 1000
                out.println( "<tr valign='top'><td>" + rs.getString(2) + "</td><td>" + b + "</td> gr");
            }
        if (b => 1000000)
            {
                b / 1000000
                out.println( "<tr valign='top'><td>" + rs.getString(2) + "</td><td>" + b + "</td> Kg");
            }
        else
            {
                out.println( "<tr valign='top'><td>" + rs.getString(2) + "</td><td>" + b + "</td>");
            }

Wat ik dus wil weten is, als b groter is dan 1000, maar kleiner dan 999999 dan moet het gedeeld worden door 1000. Maar als ik dit zo doe als hierboven staat krijg ik onderstaande. Wat te doen, ik kan er dus niks over vinden op Internet of GoT, helemaal niemand schijnt dit te doen? (Het vergelijken van een variabele met 1000) :/

Rege 76 is dus het beginan de code zoals die hierboven staat.
code:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
An error occurred at line: 76 in the jsp file: /add_diet3.jsp
Generated servlet error:
Syntax error on token ">", delete this token

An error occurred at line: 76 in the jsp file: /add_diet3.jsp
Generated servlet error:
Syntax error on token "=", invalid Expression

An error occurred at line: 76 in the jsp file: /add_diet3.jsp
Generated servlet error:
Syntax error on token "{", ( expected

An error occurred at line: 76 in the jsp file: /add_diet3.jsp
Generated servlet error:
Syntax error, insert "AssignmentOperator ArrayInitializer" to complete ArrayInitializerAssignement

An error occurred at line: 76 in the jsp file: /add_diet3.jsp
Generated servlet error:
Syntax error, insert ")" to complete Expression

An error occurred at line: 76 in the jsp file: /add_diet3.jsp
Generated servlet error:
Syntax error, insert ";" to complete BlockStatements

An error occurred at line: 76 in the jsp file: /add_diet3.jsp
Generated servlet error:
Syntax error on token ">", delete this token

An error occurred at line: 76 in the jsp file: /add_diet3.jsp
Generated servlet error:
Syntax error on token "{", ( expected

An error occurred at line: 76 in the jsp file: /add_diet3.jsp
Generated servlet error:
Syntax error, insert "AssignmentOperator ArrayInitializer" to complete ArrayInitializerAssignement

An error occurred at line: 76 in the jsp file: /add_diet3.jsp
Generated servlet error:
Syntax error, insert ")" to complete Expression

An error occurred at line: 76 in the jsp file: /add_diet3.jsp
Generated servlet error:
Syntax error, insert ";" to complete BlockStatements


Ik heb er ook al aan gedacht om de 1000 en de 1000000 in een variabele te zetten, maar dat maakt natuurlijk niks uit. Want daar looptie niet op vast. Moet ik mischien iets importeren waardoor er omgegaan kan worden met de => en =< tekens? (of hoe ze dan ook precies moeten, maar geen enkele combinatie werkt)

[ Voor 23% gewijzigd door vegterb op 04-01-2006 14:22 ]

My Laptop Specificaties vs My Desktop Specificaties


  • RSchellhorn
  • Registratie: Augustus 2001
  • Laatst online: 16-04 20:49
Ik zou op regel 7 je kleiner-gelijk-teken goed zetten.

EDIT: En er ook nog een b aan toevoegen :Y)
EDIT2: En een paar puntkomma's .... :/

[ Voor 48% gewijzigd door RSchellhorn op 04-01-2006 14:40 ]

"Ik heb zo veel soep gegeten, dat kan een mens niet aan. Ik heb zo veel soep gegeten, kan bijna niet meer staan. Ik zat daar maar te slurpen achter die grote kop en als ik bijna klaar was, dan schepten ze weer op!" (Hans Teeuwen)


  • whoami
  • Registratie: December 2000
  • Laatst online: 17-04 23:42
Tja, dit is niets meer of niets minder dan het oplossen van syntax errors; dat moet je zelf ook wel kunnen doen adhv de error messages die de compiler je geeft.
Daarnaast is het ook niet nodig om een oud topic hiervoor omhoog te schoppen. Men moet nu eerst 58 replies doorworstelen alvorens men bij jouw probleem komt. Niet echt hadnig.

https://fgheysels.github.io/

Pagina: 1

Dit topic is gesloten.