Toon posts:

[JAVA Servlet] String probleemptje

Pagina: 1
Acties:

Verwijderd

Topicstarter
Ik heb hetvolgende servlet weten te creeeren:
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
44
45
46
47
48
49
50
51
52
53
import java.sql.*;
import javax.servlet.*;
import javax.servlet.http.*;
import java.io.*;

public class SQLStatement extends HttpServlet {
    
    
    public void init(String args[]) {
      
      String url = "jdbc:oracle:thin@ngdwpc3:1521:oracle";
      Connection con;
      String query = "select * FROM top where id=697";
      
      try {
        Class.forName("myDriver.ClassName");
        
      } catch(java.lang.ClassNotFoundException e) {
        System.err.print("ClassNotFoundException: ");
        System.err.println(e.getMessage());
      }
      
      try {
        String results = new String();
        con = DriverManager.getConnection(url, "scott", "tiger");
        
        Statement stmt = con.createStatement();
        ResultSet rs = stmt.executeQuery(query);
        String text = rs.getString("SDO_GEOMETRY");
        
        stmt.close();
        con.close();
      }
      
      catch(SQLException ex) {
        System.err.print("SQLException: ");
        System.err.println(ex.getMessage());
      }
    }
    public void doGet(HttpServletRequest request, HttpServletResponse response)
    throws IOException, ServletException {
      response.setContentType("text/html");
      PrintWriter out = response.getWriter();
      out.println("<html>");
      out.println("<head>");
      out.println("<title>Servlet</title>");
      out.println("</head>");
      out.println("<body>");
      out.println("<h1>"+text+"</h1>");
      out.println("</body>");
      out.println("</html>");
    }
}

Het servlet maakt dus verbinding met een Oracle database (mbv JDBC), en doet een query. De query wordt getransformeert naar een String, zodat deze uiteindelijk in de HTML-output kan. Maar in de HTML-output geeft de compiler aan dat hij de string "text" niet herkent. Hoe los ik dit op?


Voor alle duidelijkheid, ik ben aardig nieuw wat betreft JAVA. Dus misschien is de hele code ontzettend brak, alle suggesties e.d. zijn dus van harte welkom!

edit: [ b ] werkt blijkbaar niet in [ code ] stukjes..

  • Bobco
  • Registratie: Januari 2001
  • Laatst online: 30-10-2023

Bobco

I used to dream about Verona.

Je declareert text in de init() method en je refereert er aan in de doGet(). Dat vind Java niet zo lekker omdat de scope van text niet groter is dan de init() method. Daarbuiten bestaat de variabele text dus niet.

Denk er ook aan dat init() alleen aangeroepen wordt door de servlet container op het moment dat de servlet geladen wordt. Een service methode als doGet wordt bij elke HTTP GET op de servlet aangeroepen. Als je de query in de init doet zal elke GET precies hetzlefde opleveren. Ik neem aan dat dat niet de uiteindelijke bedoeling is...

With the light in our eyes, it's hard to see.


  • Glimi
  • Registratie: Augustus 2000
  • Niet online

Glimi

Designer Drugs

(overleden)
Uhm ooit gehoord van een variabele scope? Ik geloof het niet :)
Als je een variabele declareed in een methode, dan is hij daarbuiten niet bereikbaar. Je kunt het dan zien als een tijdelijke variabele die je alleen dat stukje kunt gebruiken.
Dit zou je eigenlijk toch wel moeten weten hoor.

Ik zou maar eens wat tutorials gaan volgen. Ik zal er een paar voor je zoeken
http://java.sun.com/docs/books/tutorial/java/nutsandbolts/index.html
http://java.sun.com/docs/books/tutorial/servlets/index.html
en http://java.sun.com/docs/books/tutorial/ en http://search.java.sun.com/ zou ik bookmarken :)

  • Alarmnummer
  • Registratie: Juli 2001
  • Laatst online: 09-07-2024

Alarmnummer

-= Tja =-

paar algemene tips die denk ik niet de oplossing zijn voor je probleem.

1) Ik neem aan dat je bij Class.forName wel iets anders hebt ingevuld dan myDriver.ClassName?

2) als er iets misgaat bij het inladen van de driver, dan vang je die exception af en druk je hem af, en daarna ga je toch verder met het uitvoeren van een query? (dit moet je dus anders doen)

3)waarom declareer je een String results?? (die gebruik je verder niet meer) En verder is het vrij ongebruikelijk om een lege string op deze manier te creeeren. Je kan ook zeggen:
String result = "";

4)
code:
1
2
ResultSet rs = stmt.executeQuery(query);
String text = rs.getString("SDO_GEOMETRY");

is verder niet goed.. je moet zoiets gebruiken.
code:
1
2
3
4
5
Resultset rs = stmt.executeQuery(query);
String text = null;
if(rs.next()){
    text = rs.getString("SDO_GEOMETRY");
}

er vanuitgaand dat id je primare sleutel is. Je kan namelijk altijd meerdere records bij een query terug krijen en je kan een resultset daarom ook zien als een verzameling met records..

5) op het moment dat je je try lus verlaat ben je alle variablen kwijt die in de try catch zijn gedeclareerd, dus ook de waarde die je hebt opgehaald. Die kan je er dus beter buiten declareren.
code ziet er verder wel goed uit.

  • watzie
  • Registratie: Juni 2001
  • Laatst online: 07-07 16:26
Op vrijdag 19 april 2002 11:07 schreef beurdy het volgende:
Ik heb hetvolgende servlet weten te creeeren:
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
44
45
46
47
48
49
50
51
52
53
import java.sql.*;
import javax.servlet.*;
import javax.servlet.http.*;
import java.io.*;

public class SQLStatement extends HttpServlet {
    String text = null;
    
    public void init(String args[]) {
      
      String url = "jdbc:oracle:thin@ngdwpc3:1521:oracle";
      Connection con;
      String query = "select * FROM top where id=697";
      
      try {
        Class.forName("myDriver.ClassName");
        
      } catch(java.lang.ClassNotFoundException e) {
        System.err.print("ClassNotFoundException: ");
        System.err.println(e.getMessage());
      }
      
      try {
        String results = new String();
        con = DriverManager.getConnection(url, "scott", "tiger");
        
        Statement stmt = con.createStatement();
        ResultSet rs = stmt.executeQuery(query);
        text = rs.getString("SDO_GEOMETRY");
        
        stmt.close();
        con.close();
      }
      
      catch(SQLException ex) {
        System.err.print("SQLException: ");
        System.err.println(ex.getMessage());
      }
    }
    public void doGet(HttpServletRequest request, HttpServletResponse response)
    throws IOException, ServletException {
      response.setContentType("text/html");
      PrintWriter out = response.getWriter();
      out.println("<html>");
      out.println("<head>");
      out.println("<title>Servlet</title>");
      out.println("</head>");
      out.println("<body>");
      out.println("<h1>"+text+"</h1>");
      out.println("</body>");
      out.println("</html>");
    }
}
edit:
Sluit me aan bij wat hierboven al gezegd wordt

Als je het toch zo wilt doen, declareer dan text als class variabele, dan krijgt hij globale scope en kun je hem zoals je deed aanspreken. Zie aangepast stukje code :)

  • Alarmnummer
  • Registratie: Juli 2001
  • Laatst online: 09-07-2024

Alarmnummer

-= Tja =-

en als je nog meer tutorials wilt dan moet je even op mijn site kijken. Daar staan een redelijke lading online books en andere handige links.

ps: je probleem was inderdaad de scoop van de text variable.

Verwijderd

Topicstarter
great, bedankt mensen. Inderdaad dus een Scoop probleem (alleen ken ik het jargon nog niet zo ;) )

Van alle commentaren zal ik dankbaar gebruik maken!

  • Glimi
  • Registratie: Augustus 2000
  • Niet online

Glimi

Designer Drugs

(overleden)
Op vrijdag 19 april 2002 11:35 schreef beurdy het volgende:
great, bedankt mensen. Inderdaad dus een Scoop probleem (alleen ken ik het jargon nog niet zo ;) )

Van alle commentaren zal ik dankbaar gebruik maken!
[heel erg offtopic]
Heeeey! Absu dingus uit de DDS metro! :)
kennie me nog?
[/heel erg offtopic!]

Verwijderd

Topicstarter
Op vrijdag 19 april 2002 11:36 schreef Glimi het volgende:

[..]

[heel erg offtopic]
Heeeey! Absu uit de DDS metro! :)
kennie me nog?
[/heel erg offtopic!]
niet absu! Iemand anders, en ja ik ken je nog wel ;)

Verwijderd

Topicstarter
The story continues:

Na aaardig wat wijzigingen in mijn source stuit in nu op de volgende compile error:
code:
1
2
3
4
5
6
7
SQLStatement.java [26:1] cannot resolve symbol
symbol  : class OracleDriver  
location: package driver
        DriverManager.registerDriver(new oracle.jdbc.driver.OracleDriver());
                                         
1 error
Errors compiling SQLStatement.

Ik probeer dus met mijn servlet nogsteeds verbinding te krijgen met Oracle. Blijkbaar kan ie de driver niet vinden (neem ik aan). Waar moet ik dan vertellen waar de driver staat?

Ik gebruik als IDE Forte, en heb classes12.zip (file met jdbc drivers) in de /lib/ext dir. Ik kan met Forte wel een Database Schema capturen. Hieruit conludeer ik dat Forte wel begrijpt waar de driver staat (klopt dit?)

classes12.zip staat ook in mijn classpath.

ps.
Kan de titel van dit topic al veranderd worden is "beurdy's knokpartij met java/oracle" oid?? :)

  • Bobco
  • Registratie: Januari 2001
  • Laatst online: 30-10-2023

Bobco

I used to dream about Verona.

Afgaande op die eerste regel 'SQLStatement.java [26:1] cannot resolve symbol' zou ik zeggen dat je JDBC driver bezig is om het SQL statement dat je meegeeft om te batterijen naar iets wat naar Oracle gestuurd moet worden. Blijkbaar gaat daar iets niet goed. Om het probleem op te lossen moeten we dus nog even uitzoeken wat 'iets' is. Probeer anders eerst een heel eenvoudige query van het type SELECT * FROM blabla...

edit:
Hmm, bovenstaand verhaal is volgens mij toch niet zo waar asl het me eerst leek...

With the light in our eyes, it's hard to see.


  • Bobco
  • Registratie: Januari 2001
  • Laatst online: 30-10-2023

Bobco

I used to dream about Verona.

Ik heb zelf even in wat code gekeken die ik hier gebruik. Ik heb het ook niet zlef bedacht, maar op het moment dat die driver geladen moet worden gebruik ik:
code:
1
Class.forName(classname_of_driver)

Hopelijk helpt dit je verder....

With the light in our eyes, it's hard to see.


Verwijderd

Topicstarter
idd is het die class.forName die ervoor zorgt dat de driver geladen wordt. Ik vraag me nu af wat ik hier moet invullen voor een Oracle 9i thin driver. ik heb nu:
code:
1
"oracle.jdbc.driver.OracleDriver"

Dit heb ik uit een andere sourcecode getrokken, en klopt dacht ik... tenzij iemand met wat anders (beters?) komt..

  • Tomatrix
  • Registratie: Juni 1999
  • Laatst online: 27-02-2025
Op dinsdag 23 april 2002 08:03 schreef beurdy het volgende:
code:
1
"oracle.jdbc.driver.OracleDriver"

Dit heb ik uit een andere sourcecode getrokken, en klopt dacht ik... tenzij iemand met wat anders (beters?) komt..
En je moet zorgen dat deze driver in je classpath staat, zodat de classloader 'm ook kan vinden.

  • .oisyn
  • Registratie: September 2000
  • Laatst online: 22:48

.oisyn

Moderator Devschuur®

Demotivational Speaker

Op vrijdag 19 april 2002 11:17 schreef Bobco het volgende:
Je declareert text in de init() method en je refereert er aan in de doGet(). Dat vind Java niet zo lekker omdat de scope van text niet groter is dan de init() method. Daarbuiten bestaat de variabele text dus niet.
even een kleine aanvulling hierop, de scope van de variabele is niet eens de methode, maar slechts het try-block. Buiten de accolades van dat try-block is hij dus niet te benaderen

Give a man a game and he'll have fun for a day. Teach a man to make games and he'll never have fun again.


Verwijderd

Topicstarter
Geweldig mensen, het Servlet draait nu, ik kreeg net de geweldige tekst "resultaat is 521" in beeld (wat dus inhoud dat de verbinding naar Oracle gelukt was, en ook de query was uitgevoerd.)

Wat nou precies het probleem met die driver was weet ik nogsteeds niet. Hij stond al in me classpath, en vandaag werkte het oppeens wel (een van de geweldige dingen van Windows? De volgende dag werkt alles weer anders?)

Ik heb het try block met de query uit de init() gehaald en in de doGet()gezet, wat dus ook een vooruitgang zou moeten zijn.

Sja, en nu wordt het pas leuk, we gaan het Servlet verbeteren/aanpassen/nuttig maken.

Bedankt voor alle hulp tot nu toen, and I'll be back!

edit:

De Forte debugger geeft wel nog deze fout:
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
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
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
c:\PROGRA~1\JSDK13~1.1\jre\bin\java  -Xdebug -Xnoagent -Xrunjdwp:transport=dt_socket,server=y,suspend=n,address=11555  -classpath "C:\JavaFiles\WEB-INF\classes;C:\JavaFiles;
C:\Documents and Settings\administrator\Desktop;C:\JavaFiles\WEB-INF\classes;
C:\JavaFiles\beans\TimerBean.jar;C:\JavaFiles\lib\ext\jdbc20x.zip;
C:\JavaFiles\modules\ext\AbsoluteLayout.jar;
C:\JavaFiles\modules\ext\persistence-rt.jar;
C:\JavaFiles\modules\ext\rowset.jar;
C:\JavaFiles\modules\ext\sql.jar;
C:\forte4j\beans\TimerBean.jar;
C:\forte4j\lib\ext\servlet.jar;
C:\forte4j\system;c:\JavaFiles\jspwork\Tomcat+3.2\236a2e63;
c:\JavaFiles\sampledir;
c:\JavaFiles\system";
c:\JavaFiles\lib\patches\openide_patch.jar;
c:\JavaFiles\lib\patches\core_patch.jar;
c:\JavaFiles\lib\locale\updater_ja.jar;c:\JavaFiles\lib\ext\locale\rmi-ext_ja.jar;
c:\JavaFiles\lib\ext\locale\ddl_ja.jar;
c:\JavaFiles\lib\ext\idlcompilers.jar;
c:\JavaFiles\lib\ext\openorb-1.0.2.jar;c:\JavaFiles\lib\ext\flute.jar;
c:\JavaFiles\lib\ext\sac.jar;
c:\JavaFiles\lib\ext\rmi-ext.jar;c:\JavaFiles\lib\ext\ddl.jar;
c:\JavaFiles\lib\ext\jdbc20x.zip;
C:\forte4j\lib\locale\core_f4j.jar;
C:\forte4j\lib\locale\core_f4j_ce.jar;
C:\forte4j\lib\locale\core_f4j_ce_ja.jar;
C:\forte4j\lib\locale\core_f4j_ja.jar;
C:\forte4j\lib\locale\core_ja.jar;
C:\forte4j\lib\locale\openide_f4j.jar;
C:\forte4j\lib\locale\openide_ja.jar;
C:\forte4j\lib\locale\updater_ja.jar;
C:\forte4j\lib\core.jar;
C:\forte4j\lib\openide-fs.jar;
C:\forte4j\lib\openide-nodes.jar;
C:\forte4j\lib\openide-util.jar;
C:\forte4j\lib\openide.jar;
C:\forte4j\lib\ext\locale\ddl_ja.jar;
C:\forte4j\lib\ext\locale\logger_ja.jar;
C:\forte4j\lib\ext\locale\rmi-ext_ja.jar;
C:\forte4j\lib\ext\bsh-1_0-fj.jar;
C:\forte4j\lib\ext\cmd.jar;C:\forte4j\lib\ext\cosnaming.jar;
C:\forte4j\lib\ext\ddl.jar;C:\forte4j\lib\ext\fjscript.jar;
C:\forte4j\lib\ext\flute.jar;
C:\forte4j\lib\ext\fscontext.jar;
C:\forte4j\lib\ext\idlcompilers.jar;
C:\forte4j\lib\ext\jaas.jar;
C:\forte4j\lib\ext\jaxp.jar;
C:\forte4j\lib\ext\jh.jar;
C:\forte4j\lib\ext\jndi.jar;
C:\forte4j\lib\ext\ldap.jar;
C:\forte4j\lib\ext\ldapbp.jar;
C:\forte4j\lib\ext\logger.jar;
C:\forte4j\lib\ext\nis.jar;
C:\forte4j\lib\ext\openorb-1.0.2.jar;
C:\forte4j\lib\ext\parser.jar;
C:\forte4j\lib\ext\providerutil.jar;
C:\forte4j\lib\ext\regexp.jar;
C:\forte4j\lib\ext\rmi-ext.jar;
C:\forte4j\lib\ext\rmiregistry.jar;
C:\forte4j\lib\ext\sac.jar;
C:\forte4j\lib\ext\sax2.jar;
C:\forte4j\lib\ext\servlet.jar;
C:\forte4j\lib\ext\xerces.jar;
C:\forte4j\lib\ext\jdbc20x.zip;
C:\forte4j\lib\ext\classes12.zip;
c:\PROGRA~1\JSDK13~1.1\lib\dt.jar;
c:\PROGRA~1\JSDK13~1.1\lib\tools.jar;
C:\forte4j\modules\registration.jar;
C:\forte4j\modules\ant.jar;
C:\forte4j\modules\ext\ant.jar;
C:\forte4j\modules\ext\ant-optional.jar;
C:\forte4j\modules\docs\ant-manual.zip;
C:\forte4j\modules\clazz.jar;
C:\forte4j\modules\debuggerCore.jar;
C:\forte4j\modules\applet.jar;
C:\forte4j\modules\toolsDebugger.jar;
C:\forte4j\modules\filecopy.jar;
C:\forte4j\modules\ext\ftpclient.jar;
C:\forte4j\modules\html.jar;
C:\forte4j\modules\extbrowser.jar;
C:\forte4j\modules\image.jar;
C:\forte4j\modules\jarpackager.jar;
C:\forte4j\modules\beans.jar;
C:\forte4j\modules\jndi.jar;
C:\forte4j\modules\loggerModule.jar;
C:\forte4j\modules\classfile.jar;
C:\forte4j\modules\projects.jar;
C:\forte4j\modules\properties.jar;
C:\forte4j\modules\i18n-form.jar;
C:\forte4j\modules\properties-syntax.jar;
C:\forte4j\modules\text.jar;
C:\forte4j\modules\usersguide.jar;
C:\forte4j\modules\openidex.jar;
C:\forte4j\modules\j2eeserver.jar;
C:\forte4j\modules\utilities.jar;
C:\forte4j\modules\locale\utilities_f4j.jar;
C:\forte4j\modules\apisupport-lite.jar;
C:\forte4j\modules\javacvs.jar;
C:\forte4j\modules\ext\cvslib.jar;
C:\forte4j\modules\vcsgen.jar;
C:\forte4j\modules\jsp-syntax.jar;
C:\forte4j\modules\jsp-tomcat.jar;
C:\forte4j\modules\ext\tomcat-monitor.jar;
c:\JavaFiles\modules\java.jar;
c:\JavaFiles\modules\ext\javac.jar;
c:\JavaFiles\modules\ext\java-gj.jar;
c:\JavaFiles\modules\vcscore.jar;
c:\JavaFiles\modules\corba.jar;
c:\JavaFiles\modules\idl-syntax.jar;
c:\JavaFiles\modules\javadoc.jar;
c:\JavaFiles\modules\xml.jar;
c:\JavaFiles\modules\browser.jar;
c:\JavaFiles\modules\ext\infobus.jar;
c:\JavaFiles\modules\rmi.jar;
c:\JavaFiles\modules\xml-syntax.jar;
c:\JavaFiles\modules\editor.jar;
c:\JavaFiles\modules\ext\nb-editor.jar;
c:\JavaFiles\modules\persistence-ui.jar;
c:\JavaFiles\modules\ext\persistence-rt.jar;
c:\JavaFiles\modules\httpserver.jar;
c:\JavaFiles\modules\ext\webserver.jar;
c:\JavaFiles\modules\dd2beans.jar;
c:\JavaFiles\modules\form.jar;
c:\JavaFiles\modules\ext\AbsoluteLayout.jar;
c:\JavaFiles\modules\autoupdate.jar;
c:\JavaFiles\modules\cvs.jar;
c:\JavaFiles\modules\jsp.jar;
c:\JavaFiles\modules\ext\jasper.jar;
c:\JavaFiles\modules\jspie.jar;
c:\JavaFiles\modules\dbschema.jar;
c:\JavaFiles\modules\i18n.jar;
c:\JavaFiles\modules\jdbc.jar;
c:\JavaFiles\modules\ext\rowset.jar;
c:\JavaFiles\modules\ext\sql.jar;
c:\JavaFiles\modules\jpdaDebugger.jar;
c:\JavaFiles\modules\db.jar;
c:\JavaFiles\modules\j2eelib.jar org.netbeans.modules.web.tomcat.WebAppMain "c:\JavaFiles\system\tomcat\server.xml" "c:\JavaFiles\system\tomcat" 
Starting tomcat. Check logs/tomcat.log for error messages 
connecting tongdwpc3
#
# HotSpot Virtual Machine Error, Internal Error
# Please report this error at
# http://java.sun.com/cgi-bin/bugreport.cgi
#
# Error ID: 5052455345525645255843455054494F4E0E4350500024
#
# Problematic Thread: prio=5 tid=0xce9d410 nid=0x5dc runnable 
#

Lijkt me eerder dat ik een fout maak, dan dat de JVM daadwerkelijk een bug heeft. Heeft iemand een idee wat dit kan zijn (misschien eerder gezien?)

  • Bobco
  • Registratie: Januari 2001
  • Laatst online: 30-10-2023

Bobco

I used to dream about Verona.

He Beurdy, gefeliciteerd met dit succesje. Vergeet vooral niet om het boek Core Servlets and JSP even te downloaden van JavaLobby. Die PDF file staat vol met goede uitleg.

With the light in our eyes, it's hard to see.

Pagina: 1