Tomcat/JSP, MySQL & JDBC

Tråden skapades och har fått 16 svar. Det senaste inlägget skrevs .
1
  • Oregistrerad
  • 2003-09-04 00:07

Jag har installerat Complete MySQL och Complete Tomcat. Tomcat funkar och MySQL funkar. Jag har tidigare använt PHP tillsammans med MySQL, men ska nu lära mig JSP.

Har för mig att det kom en JDBC med på disken (dmg) för Complete MySQL. Den installerade jag, för jag misstänkte att jag i framtiden skulle använda den. Och nu ska jag alltså börja köra JSP som hämtar information ur MySQL.

Jag kör allt på samma dator (127.0.0.1/localhost).

Hur gör jag en "connection" till MySQL och hämtar ett värde ur ett record i en tabell i en databas?

Vore kanon om någon kunde skriva ihop ett generellt exempel så man kan lista ut hur det funkar.

Ett exempel är jag för lat för och dessutom är jag inte tillräckligt bra på JSP.

Men Apple har en bra artikelserie om Java och Tomcat (jag har bara läst en första delen) på sina utvecklingssidor.

Här är första delen: Java och Tomcat del 1, och den andra delen som behandlar JDBC bl.a: Java och Tomcat del 2

Joakim

  • Medlem
  • Göteborg
  • 2003-09-05 15:00

Jag ska precis oxå lära mig JSP hade jag tänkt.

WebStudio har en liten nybörjargenomogång har jag märkt. Kika upp den.

Var laddar man ner Complete TomCat och Complete MySQL, jag kör PHP/MYSQL distro från den där killen Marc L någonting i Schweiz (ch), det här verkar intressant...

  • Medlem
  • International user
  • 2003-09-06 05:10

Hej!

Först måste du se till att du har en fungerande MySQL driver, antingen JDBC.

Förutsatt att du har en fungerande MySQL databas samt driver:

Kod-exempel:

Connection con;
	Statement stmt;
	ResultSet result;
	
	String url = "jdbc:mysql://localhost/databas"; // här engiver du host samt namnet på databasen
	
	Class.forname("com.mysql.jdbc.Driver"); // här skriver du in drivrutinen till MySQL
	
	con = DriverManager.getConnection(url, "username", "password"); // här skapas en uppkoppling till databasen med angivet användarnamn samt lösenord
	
	stmt = con.createStatement(); // Statement objekt lagrar senare själva SQL-satsen som vi skall anropa MySQL-servern med
	
	
	/*
	det finns två typer av SQL-satser:
	
	- de som uppdaterar databasen(UPDATE, DELETE, INSERT)
	- de som enbart hämtar information(SELECT)

	vill man t ex lägga till en post i databasen så kan man göra det på söljande sätt:	
	
	stmt.executeUpdate("INSERT INTO TABLE_NAME VALUES ( "olle", "pettersson", 24);
	
	vill man däremot få fram information:
	
	result = stmt.executeQuery("SELECT * FROM TABLE_NAME");
		
	
	Låt oss nu ta reda på alla persone som är under 18 år.
	Vi vill även samla all information om verje individ.
	*/
	
	result = stmt.executeQuery("SELECT * FROM TABLE_NAME WHERE age < 18"); // förutsatt att det finns en kolumn med namnet "age"
	ResultSetMetadata metaData = result.getMetaData();
	int columnCount = metaData.getColumnCount();	// vi vill veta hur många kolumner det finns i tabellen frö att snart kunna komma åt varje kolumn
	
	
	// nu måste vi se om vi fick några resultat
	
	while(result.next() ) // result.next() flyttar positionsmarkören till nästa post och så länge det finns nya poster så rulalr vi vidare i loopen
	{
		for(int i = 1; i <= columnCount; ++i)	// observera att i börjar på 1, kör du med 0 så komem du att få ett fel som hänvisar till felaktig position på positionsmarkören
		{
			/* nu måste du veta vilken datatyp varje kolumn består av, så att du kan anropa varje kolumn med en passande metod:
			
			getString(i);
			getInt(i);
			getByte(int);
			
			om vi tänke att tabellen innehåller två kolumner "name" och "age" och då "name" är av typen CHAR och "age" av typen INT (Observera att dessa är MySQL datatyper).
			*/
			
			
			System.out.println(result.getString(i);
			System.out.println(result.getInt(i);
			
			// nu kommer det skrivas ut namnet och åldern på varje person som är under 18 år.
			
			
		}
		
	}
	
	// när man är klar med sin SQL-sats så bör man frigöra resurserna(även om detta görs automatikst).
	
	stmt.close();
	result.close();
	con.close();
	
	// observera att du måste ha all denna kod inom en try-catch sats eller så kan du låta hela metoden kasta undantaget genom att ange "throws Exception" direct efter metoden/konstuktören
	

Jag skrev detta hastigt innan jag rusade till jobbet så vissa saker kan vara felaktiga. Får du detta inte att fungera elleer om du har fler frågor så hjälper jag gärna till ifall jag bara kan.

  • Oregistrerad
  • 2003-09-08 21:24

Grymt!

Precis vad jag ville ha

Dock får jag det inte att funka :-/ Skulle gissa att det har nåt med JDBC att göra...

Jag har inte hållt på med ODBC och JDBC förut, utan bara använt PHP tillsammans med MySQL.

Jag har kört pkg-installern av MySQL Connector/J, inget mer. Jag gissar att det inte räcker utan att man måste göra några inställningar också, eller?

Ska man in i ODBC Administrator å mecka?

MySQL-servern funkar, tomcat funkar (det visar en sida på 127.0.0.1:8080 som säger att det funkar).

  • Medlem
  • International user
  • 2003-09-08 21:38

Vilket OS kör du?

Jag gissar att tomcat inte hittar drivisarna.

Under windows så kan man lägga .jar-filen(där drivisarna finns) i tomcat_root/common/lib och då hittar tomcat drivisarna.

Titta i tomcat katalogen om du hittar common/lib och pröva placera filen där. Starta sedan om servern.

Iaf när man pillar med Windows samt ODBC (dvs JDBC-ODBC med Java) så måste man lägga till en koppling till databasen. Kör man med JDBC istället så blir det lite annorlunda.

Du säger att du installerade MySQL Connector/J. Vad jag vet så är det en JDBC-drivrutin. Dvs inte ODBC och då behöver du nog inte pilla i ODBC Administrator:n.

Vad är det du har problem med? Hittas drivrutinerna? Du bör få en ClassNotFoundException ifall de inte hittas.

  • Oregistrerad
  • 2003-09-08 21:49

Kör OS X 10.2.6

Får följande exception report:

org.apache.jasper.JasperException: Unable to compile class for JSP

An error occurred at line: 8 in the jsp file: /untitled.jsp

Generated servlet error:
    [javac] Since fork is true, ignoring compiler setting.
    [javac] Compiling 1 source file
    [javac] Since fork is true, ignoring compiler setting.
    [javac] /Library/Tomcat/work/Standalone/localhost/_/untitled_jsp.java:57: cannot resolve symbol
    [javac] symbol  : method forname (java.lang.String)
    [javac] location: class java.lang.Class
    [javac]         Class.forname("com.mysql.jdbc.Driver"); // h?§r skriver du in drivrutinen till MySQL
    [javac]              ^



An error occurred at line: 8 in the jsp file: /untitled.jsp

Generated servlet error:
    [javac] /Library/Tomcat/work/Standalone/localhost/_/untitled_jsp.java:84: cannot resolve symbol
    [javac] symbol  : class ResultSetMetadata 
    [javac] location: class org.apache.jsp.untitled_jsp
    [javac]         ResultSetMetadata metaData = result.getMetaData();
    [javac]         ^
    [javac] 2 errors
  • Medlem
  • International user
  • 2003-09-08 21:53

Ahh.

Ser ut som om jag ahr skrivt lite fel.

Class.forname("com.mysql.jdbc.Driver");

skall vara:

Class.forName("com.mysql.jdbc.Driver");

dvs n:et skall vara stor.

sen

ResultSetMetadata metaData = result.getMetaData();

skall vara:

ResultSetMetaData metaData = result.getMetaData();

Tråkigt med dessa stavfel. Jag skrev det där från huvudet oc hahr således inte testat det men kan göra det.

Får du

"cannot resolve symbol" som en del av felmeddelandet så betyder det ofta att metoden, variabeln eller klassen inte hittas, antingen pga att du har skrivit namnet fel eller så har du inte "importerat" rätt paket med import satsen.

Jag rekommenderar att du har Java API:t nära till hands. Där är det rätt så enkelt att kolla upp klasserna samt dess metoder; hur de stavas (om man är osäker) samt diverse information såsom vilka paremetrar en viss metod vill ha etc etc...

En sak till(blir en massa ändrande av inlägget):

Se till att du har

import java.sql.*;

i början av filen.

Hittade ännu fler fel:

stmt.executeUpdate("INSERT INTO TABLE_NAME VALUES ( "olle", "pettersson", 24);

skall givetvis vara:

stmt.executeUpdate("INSERT INTO TABLE_NAME VALUES ( 'olle', 'pettersson', 24);

  • Oregistrerad
  • 2003-09-08 22:07

Jag har ändrat filerna men det är ingen skillnad. Det verkar som om servern cachar sidorna. Har laddat om å laddat om, och startat om servern. Men det är fortfarande samma små bokstäver :-/

  • Medlem
  • International user
  • 2003-09-08 22:16

Hmm, pröva med att gå in på http://localhost:8080 och välj sedan "Tomcat manager" länken.
Där kan man sedan administrera dina web-applikationer.

Lokalisera din web-applikation och uppdatera den genom länken "Reload". Detta bör räcka.

  • Oregistrerad
  • 2003-09-08 23:23

Sådärja

Nu funkar det, efter lite pill. Att det verkade som att den cachade var skit bakom spakarna :rolleyes:

Ändringarna av stora å små bokstäver var en av detaljerna för att det skulle funka. Då blev jag av med de felen, fast det kom inte upp nån text ändå.

För tydligen gillades det inte att man använde System.out.println, kom på det efter lite felsökning. Testade med out.write istället, och då hände det grejer

Sen tog jag bort for-satsen för att skriva ut, eftersom den gjorde att det upprepades onödigt (liten tankevurpa där tror jag?). Jag körde så här istället:

while(result.next() )
        {
        		int i = 1;
        		
        		out.write(result.getInt(i) + " ");
        		i++;
        		
        		out.write(result.getString(i) + " ");
        		i++;
        		
        		out.write(result.getString(i) + "<br>");
        }

Inte lika snyggt, men det kom upp grejer.

Finns det nån skön funktion för att i förväg kolla vad det är för datatyp kolumnen man hämtar från är? Då kanske man kan skriva en for-loop.

  • Medlem
  • International user
  • 2003-09-08 23:49

Japp.

Kika lite på klassen ResultSetMeataData

Där finns bl a metoder som getColumnType() och getColumnName();

Sen kan man genom att använda sig utav if-satser för att bestämma vilken metod man skall använda:

hmm...du bör nog köra med for-satsen ändå. Du kör med upprepade i++ och det är inte ett bra sätt. Tänk om du har 56 kolumner i varje fält i tabellen. Skall du ha 55 i++ satser då?

for satsen itererar genom varje kolumn i ett "record" i tabellen medan result.next() itererar genom varje "record".

Jag vet inte hur din tabell ser ut i databasen men mitt exempel antog att det fanns name och age. Då kommer columnCount att vara 2.

Du kan också ta fram datan genom att skriva

result.getString(kolumnens_namn);

Du måste dock veta vilken metod som skall användas mot vilken datatyp.

Ta fram Java API:t och kika på SQL-klasserna.

  • Oregistrerad
  • 2003-09-08 23:57

Ok. Tack för all hjälp

Lite offtopic kanske men tänkte bara tala om att jag använder MySQL med JDBC tillsammans med WebObjects.

Med EOModeler ställer man bl.a. in hur JDBC-kopplingen ska fungera. Sedan definierar man upp en s.k. EOModel och där görs kopplingar mellan Java-klasserna som representerar databasen och själva tabellerna i databasen. Vill man kan man skapa alla tabeller i databasen med EOModeler också.

Brukar annars använda CocoaMySQL för att kolla vad databasen har för sig. Utmärkt verktyg.

  • Oregistrerad
  • 2003-09-13 18:49

Nu funkar allt som det ska, men jag vill köra tomcat som en modul i den inbyggda apache-servern i Mac OS X 10.2.6.

Har letat runt på nätet, men bara hittat how-to's för OS X Server och gamla system som 10.1.

Nån som vet någon sida som beskriver hur man gör med 10.2.6 Klient? Eller kan någon skriva en bra how-to-guide här på 99mac?

  • Oregistrerad
  • 2003-09-13 23:05

Jag hittade nåt som kallas "mod_webapp 1.2.0 for Apache 1.3.27" hos ServerLogistics (http://www.serverlogistics.com/tomcat.php), men det verkar vara problem med att köra jsp-filer som ligger i http://localhost/~username/

1
Bevaka tråden