Avatar billede cogitans Nybegynder
10. marts 2003 - 15:43 Der er 31 kommentarer og
1 løsning

Eksempel på JSP og database.

Jeg har kraftigt brug for et eksempel på, hvordan man i et client/server-miljø får adgang til en database. Altså hvad der skal stå i clientsidens HTML-fil, og hvad der skal stå i serversidens JSP-fil, så clienten kan foretage forespørgsler (SQL f.eks.) på databasen ved serveren.
Jeg vil selvfølgelig også gerne have noget forklarende tekst ;-)

Hvis der evt. findes nogle steder på nettet, hvor man kan downloade nogle eksempler på løsninger til denne problemstilling, så vil jeg også sætte umådelig stor pris på det.

På forhånd tak!
Avatar billede arne_v Ekspert
10. marts 2003 - 15:49 #1
Først skal du vælge om du vil:
1)  lade dine JSP sider lave direkte JDBC
2)  bruge EJB's

Hvis #1, så bør du skribe nogle klasser der laver database
adgangen via det almindelige JDBC kald.

Hvis #2 skal du vælge mellem direkte brug af entity beans,
brug af sessions beans eller brug af session bean som frontend
til entity beans.
Avatar billede arne_v Ekspert
10. marts 2003 - 15:50 #2
Der er en beskrivelse af JDBC på:
  http://java.sun.com/docs/books/tutorial/jdbc/
Avatar billede arne_v Ekspert
10. marts 2003 - 15:51 #3
Du kan finde EJB tutorials her:
  http://java.sun.com/j2ee/tutorial/

En lille advarsel: EJB er en meget nyttig teknologi at kunne,
men der er meget at skulle sætte sig ind i.
Avatar billede arne_v Ekspert
10. marts 2003 - 15:52 #4
Udover de 2 muligheder er der også de mere eksotiske: JDO og diverse
special O/R mapping tools.

Men de fleste holder sig til de 2.
Avatar billede cogitans Nybegynder
10. marts 2003 - 15:53 #5
Det er JSP-siderne, som laver/har databaseadgangen. Ellers kan jeg vel også lave selve adgangen i alm. java-classer?
Avatar billede arne_v Ekspert
10. marts 2003 - 16:05 #6
Hvis du vælger løsning #1 (direkte JDBC), så kan du godt lave JDBC kald
direkte i selve JSP siderne, men det anses for god stil at flytte
selve JDBC kaldene over i separate Java klasser, som så kun kaldes
fra dine JSP sider.
Avatar billede cogitans Nybegynder
10. marts 2003 - 16:06 #7
Ja, det tænkte jeg nok :-)
Findes der nogle eksempler på det? Evt. gerne med client/server inde i billedet???
Avatar billede arne_v Ekspert
10. marts 2003 - 16:25 #8
Den JDBC tutorial jeg linkede til ovenfor har udmærkede eksempler
på hvordan man bruger JDBC.

En af pointerne med at separarere JDBC koden ud i separate klasser
er at den ikke er afhængig af konteksten.

Du skriver dine database klasser. Du kan teste dem som en
standalone java applikation. Og så kan du bruge dem i din JSP
server applikation. Og virker de standalone så virker de også
i en server applikation.
Avatar billede cogitans Nybegynder
11. marts 2003 - 10:14 #9
Okay; det vil jeg så lige se, om jeg kan få til at fungere...eller om jeg kan finde et eksempel på det online (da dette ville være MEGET gavnligt for min situation pt).
Avatar billede cogitans Nybegynder
11. marts 2003 - 13:49 #10
Okay; jeg har nu lavet 2 classer:

import java.sql.*;

public class dbHandler {
    private Connection con=null;
    public dbHandler() {
    }
   
    public boolean open(String dbDriverName, String dbClassName, String user, String pass){
        try{
            if(con==null) {
                System.out.println("1");
                Class.forName(dbDriverName).newInstance();
                System.out.println("2");
                con=DriverManager.getConnection(dbClassName, user, pass);
                System.out.println("3");
                System.out.println("Con ="+con);
            }
        }
        catch(SQLException e)
        {e.printStackTrace(System.out);
        return false;
        }
        catch(ClassNotFoundException e) {
            e.printStackTrace(System.out);
            return false;
        }
        catch(InstantiationException e) {
            e.printStackTrace(System.out);
            return false;
        }
        catch(IllegalAccessException e) {
            e.printStackTrace(System.out);
            return false;
        }
        return true;
    }
   
    public void close()
    {if(con!=null)
    {try {
          con.close();
          con=null;
      }
      catch(SQLException e) {
          e.printStackTrace(System.out);
      }
    }
    }
   
    public int doUpdate(String sql) {
        if(con!=null) {
            try {
                long time=System.currentTimeMillis();
                Statement stat=con.createStatement();
                System.out.println("SQL Update="+(System.currentTimeMillis()-time)+"ms"+sql);
                return stat.executeUpdate(sql);
            }
            catch(SQLException e) {
                e.printStackTrace(System.out);
            }
        }
        return 0;
    }
   
    public ResultSet doQuery(String sql) {
        if(con!=null) {
            try {
                long time=System.currentTimeMillis();
                Statement stat=con.createStatement();
                System.out.println("SQL Update="+(System.currentTimeMillis()-time)+"ms"+sql);
                return stat.executeQuery(sql);
            }
            catch(SQLException e) {
                e.printStackTrace(System.out);
            }
        }
        return null;
    }
}

OG

public class dbHandlerTest {
    public static void main(String[] args){
      dbHandlerTest();
    }
   
    public static void dbHandlerTest() {
        dbHandler database=new dbHandler();
        database.open("sun.jdbc.odbc.JdbcOdbcDriver", "jdbc:odbc:OCSDB", "", "");
        database.doUpdate("CREATE TABLE a");
        database.close();
    }
}

Men når jeg kører testen, så skrives der:
"
1
2
java.sql.SQLException: [Microsoft][ODBC Driver Manager] Data source name not found and no default driver specified
        at sun.jdbc.odbc.JdbcOdbc.createSQLException(JdbcOdbc.java:6879)
        at sun.jdbc.odbc.JdbcOdbc.standardError(JdbcOdbc.java:7036)
        at sun.jdbc.odbc.JdbcOdbc.SQLDriverConnect(JdbcOdbc.java:3028)
        at sun.jdbc.odbc.JdbcOdbcConnection.initialize(JdbcOdbcConnection.java:323)
        at sun.jdbc.odbc.JdbcOdbcDriver.connect(JdbcOdbcDriver.java:174)
        at java.sql.DriverManager.getConnection(DriverManager.java:512)
        at java.sql.DriverManager.getConnection(DriverManager.java:171)
        at dbHandler.open(dbHandler.java:14)
        at dbHandlerTest.dbHandlerTest(dbHandlerTest.java:8)
        at dbHandlerTest.main(dbHandlerTest.java:3)
"

Hvad gør jeg forkert? Databasen hedder "OCSDB.mdb" og ligger i c:\HelloJavaServerSide". Kan det være stien til databasen, som ikke er rigtig angivet?
Avatar billede arne_v Ekspert
11. marts 2003 - 13:55 #11
JDBC ODBC bridgen bruger ODBC DSN !

D.v.s. at du skal ind i:
  control panel
  administration
  ODBC
og definere navnet OCSDB til at pege på C:\HelloeJavaServerSide\OCSDB.mdb
med en Access ODBC driver.
Avatar billede cogitans Nybegynder
11. marts 2003 - 14:00 #12
Ja, altså når jeg er inde i "ODBC", så vælger jeg fanen "System DSN", "add", "Microsoft Access Driver (*.mdb). Data Source Name:"OCSDB", I rammen "Database" finder jeg stien til databasen. Dette hjælper ikke rigtig...?
Avatar billede arne_v Ekspert
11. marts 2003 - 14:13 #13
Når du har defineret ODBC DSN, så burde du ikke kunne få den fejl:
"Data source name not found".

Har du genstarter din JSP server ?
Avatar billede cogitans Nybegynder
11. marts 2003 - 14:29 #14
Server og server. Jeg bruger "Sun ONE Studio 4" og vælger hver gang "Force reload".

Men man kan vist vælge flere forskellige Access-drivere inde i ODBC???
Avatar billede cogitans Nybegynder
11. marts 2003 - 14:32 #15
men, altså, det er jo bare ganske alm. java-filer, som burde kunne køre ganske uden problemer...så mon ikke det er en systemindstilling et-eller-andet sted?
Avatar billede arne_v Ekspert
11. marts 2003 - 14:33 #16
Det er rigtigt men det er faktisk samme driver bare i forskellige
sprog (hvis man nu skulle have lyst til at få det hele på tysk
eller spansk).
Avatar billede arne_v Ekspert
11. marts 2003 - 14:36 #17
Sun ONE Studio 4 bruger Tomcat som JSP (og servlet) server.

Men jeg opdager jo lige nu at du faktisk har et test program
og så er Tomcat jo slet ikke inde i billedet, så glem alt om
restart af den.

Du kører jo bare dbHandlerTest.
Avatar billede arne_v Ekspert
11. marts 2003 - 14:37 #18
Ingen fejlnår du rebuilder ?

Præcis samme fejl når du kører ?
Avatar billede cogitans Nybegynder
11. marts 2003 - 14:38 #19
yep...jeg kom lige til at rette i koden, så jeg nu IKKE skriver "database.mdb" - men derimod "database". Og det ser ud somom, at det kører nu...
Avatar billede arne_v Ekspert
11. marts 2003 - 14:38 #20
Nej man behøver ikke at lave noget som helst specielt for at
lave JDBC via JDBC ODBC bridge.
Avatar billede cogitans Nybegynder
11. marts 2003 - 14:45 #21
...men det var jo kun databaseadgangen, som virker nu. Nu kommer det virkelige problem så: hvordan laver man en clientside, som gennem HTML får adgang til en JSP-baseret server, som svarer med output fra en database?
Avatar billede arne_v Ekspert
11. marts 2003 - 14:50 #22
"Vis":

Du laver en JSP side som:

åbner databasen
udfører en SELECT statement
viser hver række f.eks. i en HTML TABLE
lukker
Avatar billede arne_v Ekspert
11. marts 2003 - 14:52 #23
"Opdater":

Du laver en JSP side som har en HTML form med diverse input felter.
Du har så en POST action som kalder en anden JSP eller en servlet.

Den anden:
  åbner databasen
  udfører UPDATE/INSERT/DELETE statement baseret på form input
  lukker
  skriver et eller andet passende til brugeren a la "Opdatering OK"
Avatar billede arne_v Ekspert
11. marts 2003 - 14:59 #24
Jeg kan godt hjælpe lidt med:
  JDBC ResultSet -> HTML table
eller:
  input felter -> dynamisk SQL statement
Avatar billede cogitans Nybegynder
11. marts 2003 - 15:03 #25
:-) jo tak, jeg vil da gerne have så meget hjælp som muligt.

Jeg havde nu mere tænkt mig, at jeg inde fra JSP-siden kaldte en java-classe på serversiden, som herefter udfører de ønskede handlinger inde fra JSP-siden (som jo bliver bestemt af clienten). Er det muligt?
Avatar billede cogitans Nybegynder
11. marts 2003 - 15:06 #26
Er det muligt, at JSP-siden får noget input vha. en FORM, sender requesten ned til nogle javaClasser, får resultattet tilbage og så viser outputtet i nogle andre tabeldatafelter i den oprindelige JSP-side?
Avatar billede arne_v Ekspert
11. marts 2003 - 15:17 #27
En simpel SQL SELECT til HTML TABLE i JSP vil være:

<TABLE>
<%
ResultSet = stmt.executeUpdate("SELECT * FROM tablename");
while(rs.next()) {
%>
  <TR>
  <TH><%=rs.getInt("intfieldname")%></TH>
  <TH><%=rs.getString("stringfieldname")%></TH>
  </TR>
<%
}
%>
</TABLE>
Avatar billede arne_v Ekspert
11. marts 2003 - 15:18 #28
Du kan sagtens (det er endda anbefalelses værdigt) putte så meget
funktionalitet ned i separate klasser.
Avatar billede arne_v Ekspert
11. marts 2003 - 15:21 #29
Hvis du har:

<INPUT TYPE="TEXT" NAME="ABC" LENGTH="10">

og submitter den form til en JSP side kan du:

<P>
You entered <%=request.getParameter("ABC")%>.
</P>
<%
ResultSet rs = stmt.executeQuery("SELECT * FROM tabelname WHERE fieldname = '" + request.getParameter("ABC") + "'");
%>
Avatar billede arne_v Ekspert
11. marts 2003 - 15:22 #30
Hov i mit TABLE eksempel skal det naturligvis være executeQuery og
ikke executeUpdate !

:-)
Avatar billede arne_v Ekspert
19. marts 2003 - 20:02 #31
Nu ved jeg jo, at du er kommet videre jævnfør spørgsmål i anden kategori.

Måske var det tid at lukke dette spørgsmål.
Avatar billede cogitans Nybegynder
20. marts 2003 - 10:35 #32
så sandt, så sandt...
Avatar billede Ny bruger Nybegynder

Din løsning...

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

Loading billede Opret Preview
Kategori
Dyk ned i databasernes verden på et af vores praksisnære Access-kurser

Log ind eller opret profil

Hov!

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

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

Du kan også logge ind via nedenstående tjenester