17. marts 2003 - 09:34Der er
134 kommentarer og 1 løsning
JSP & database
Er det muligt, at lave JSP-sider, som kalder nogle javaklasser, som modificerer en database, og sender information tilbage til brugeren af JSP-siderne?
Findes der nogle eksempler på, hvordan dette gøres?
public class dbGennemfoer { dbHandlerServer database=null; /** Creates a new instance of dbGennemfoer */ public dbGennemfoer() { database=new dbHandlerServer(); database.open("sun.jdbc.odbc.JdbcOdbcDriver", "jdbc:odbc:OCSDB", "", ""); System.out.println("Databasen er åbnet!"); }
public ResultSet beregn(String sql) { System.out.println("Begyndt på beregn i dbGennemfoer"); ResultSet rs; StringTokenizer opdel=new StringTokenizer(sql); String foersteOrd=opdel.nextToken(); System.out.println("Foerste ord er: "+foersteOrd); if(foersteOrd=="INSERT"){ database.doUpdate(sql); } if(foersteOrd=="UPDATE"){ database.doUpdate(sql); } if(foersteOrd.equalsIgnoreCase("SELECT")){ System.out.println("Gået ind i SELECT i dbGennemfoer"); rs=database.doQuery(sql); System.out.println("Har fået RS tilbage i beregn!"); return rs; }
Jeg synes måske at det er lidt mindre pænt at returnere et ResultSet null ved update.
Du er naturligvis opmærksom på at at System.out.println ikke nødvendigvis er optimalt i server-side kode da det går ud over performance.
Hvis du skal have rigtig god performance skal du ikke open/close connection for hver gang en side kaldes. Det kan du enten selv kode eller du kan hente connection fra en DataSource i.s.f. via DriverManager.
Men når jeg nu har nogle forms på mine JSP-sider, hvordan kalder jeg så databasen med f.eks. en SELECT gennem metoder i mine klasser ovenfor? Altså selvfølgelig kalder jeg "beregn", men hvordan kalder jeg "beregn" gennem koden i JSP-siden?
Næh nej, du snakker skam ikke sort - jeg påskønner det skam! Men på min JSP-side har jeg flere FORMs - 3 stks vel. Og det er først i den nederste FORM, at databasequery'en skal gennemføres. Det har jeg tænkt mig at gøre noget lign. dette: <TR> <TD colspan='2'> <CENTER> <FORM method='get' name='find' onSubmit=''> <% String sql=""; sql="SELECT alleAttributNavne FROM doktorTabel WHERE ..."; ResultSet rs=dbGennemfoer.beregn(sql);
dbGennemfoer dbg = new dbGennemfoer(); dbg.beregn("INSERT IN tabelnavn VALUES(1,2,3)");
%> <INPUT type='submit' value='Alle læger'> Find operatører </FORM> </CENTER> </TD> </TR> Men min javaclasse returnerer et RESULTSET, som jeg gerne skulle udfylde mine andre FORMfelter i de 2 første FORMs. Kan dette lade sig gøre?
Skal jeg så bruge "request.getParameter("felt1")" for at henvise til de andre FORMfelter? For det er vel ikke en request...kan jeg ikke bare inde i selve FORMen give hvert felt et navn som f.eks. "name='1'", og så bruge "1" inde i sql'en?
Det, du har skrevet som side 2.jsp, det er javaclassen, som skal udføre den funktionalitet. Men ellers er det rigtigt nok...dog med den undtagelse, at på nogle af mine JSP-sider skal der også udfyldes data i de resterende FORMfelter efter kaldet til javaclassen, som returnerer et ResultSet. (?)
:-) nej, det vil jeg nu heller ikke...det skrev jeg bare i fartens forvirring...
Men tilbage til mit spørgsmål: kan man godt i bunden af siden kalde javaclasser, som returnerer et resultSet, som bruges til at udfylde de tomme felter i starten af sidens FORMs?
En JSP side bliver compilet til en servlet som udføres to down.
Men husk på at JSP'ere jo udføres på server d.v.s. at det altid er: browser beder om side server kører JSP og genererer HTML browser viser side browser submitter form server kører JSP og genererer HTML browser viser side
Og du kan godt have en side med en form nederst og når du submitter den form requests samme side, men øverst sættes der nu data ind udfra form input.
Jeg tror vi er enige. Situationen er den, at brugeren udfylder nogle, og kun NOGLE, af en FORMs inputfelter. Så trykker han på en submitknap, som sender data fra felterne ind i en database. Herfra kommer der så svar tilbage (i form af et resultSet), som så gerne skulle kunne udfylde de resterende felter i FORMen. Kan det lade sig gøre? Det lyder til det. Også selvom submitFORMen står nederst på siden, da de resterende felter i FORMen jo først udfyldes, når der er trykket på submitknappen.
Men hvor på siden (og hvordan) fortoldes det ResultSet, som databasen sender tilbage, så outputtet kan sættes ind i de tomme FORMfelter??
Nu kalder jeg jo javaclasserne vha. action='dbConnection.class', som så returnerer det berømte resultSet. Hvordan skal jeg så håndtere det? Jeg mener, når siden også bliver hentet på ny?
Næh, ikke vha. action='dbConnection.class', men derimod vha. dbg.beregn(sql);. Men det giver en fejl, når jeg prøver at køre det. Fejlen ser sådan ud: javax.servlet.ServletException: DatabaseSearch/dbGennemfoer at org.apache.jasper.runtime.PageContextImpl.handlePageException(PageContextImpl.java:457) at org.apache.jsp.addDoktor$jsp._jspService(addDoktor$jsp.java:138) at org.apache.jasper.runtime.HttpJspBase.service(HttpJspBase.java:107) at javax.servlet.http.HttpServlet.service(HttpServlet.java:853) at org.netbeans.modules.tomcat.tomcat40.runtime.IDEJspServlet$JspServletWrapper.service(IDEJspServlet.java:173) at org.netbeans.modules.tomcat.tomcat40.runtime.IDEJspServlet.serviceJspFile(IDEJspServlet.java:246) at org.netbeans.modules.tomcat.tomcat40.runtime.IDEJspServlet.service(IDEJspServlet.java:339) at javax.servlet.http.HttpServlet.service(HttpServlet.java:853) at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:247) at org.apache.catalina.core.ApplicationFilterChain...... OSV!!!!
inde i Forte ser fejlen således ud: 03-03-17 12:31:09 WebappLoader[]: Deploying class repositories to work directory C:\javaclasses\tomcat401_base\work\localhost\_ 2003-03-17 12:31:09 StandardManager[]: Seeding random number generator class java.security.SecureRandom 2003-03-17 12:31:10 StandardManager[]: Seeding of random number generator has been completed 2003-03-17 12:31:11 ContextConfig[]: Added certificates -> request attribute Valve 2003-03-17 12:31:11 StandardWrapper[:default]: Loading container servlet default 2003-03-17 12:31:11 default: init 2003-03-17 12:31:11 jsp: init 2003-03-17 12:31:14 jsp: init 2003-03-17 12:31:14 StandardWrapperValve[jsp]: Servlet.service() for servlet jsp threw exception javax.servlet.ServletException: DatabaseSearch/dbGennemfoer at org.apache.jasper.runtime.PageContextImpl.handlePageException(PageContextImpl.java:457) at org.apache.jsp.addDoktor$jsp._jspService(addDoktor$jsp.java:136) at org.apache.jasper.runtime.HttpJspBase.service(HttpJspBase.java:107) at javax.servlet.http.HttpServlet.service(HttpServlet.java:853) at org.netbeans.modules.tomcat.tomcat40.runtime.IDEJspServlet$JspServletWrapper.service(IDEJspServlet.java:173) at org.netbeans.modules.tomcat.tomcat40.runtime.IDEJspServlet.serviceJspFile(IDEJspServlet.java:246) at org.netbeans.modules.tomcat.tomcat40.runtime.IDEJspServlet.service(IDEJspServlet.java:339) at javax.servlet.http.HttpServlet.service(HttpServlet.jav.... OSV!!!
Ja, jeg tror vi er enige om situtionen så... Nu kan jeg da få den kompileret. Jeg fandt ud af, at hvis jeg laver en metode i JSP-kode, så skal det begynde med "<%!" - dette forårsagede store problemer for mig. Så nu skal der testes...
Hmmm - nu er jeg ved at være ret desperat (men vist ret tæt på løsningen).
Jeg har 2 javaclasser og 1 JSP-side. Men de vil ikke arbejde sammen ordentligt. Når jeg trykker på noget på JSP-siden, så genereres der en exception. Det gør der også, hvis jeg blot reloader den.
Mit kode ser således ud:
"dbHandlerServer" package test;
import java.sql.*;
public class dbHandlerServer extends Thread{ private Connection con=null; Statement stat=null; public dbHandlerServer() { }
public ResultSet doQuery(String sql) { if(con!=null) { try { long time=System.currentTimeMillis(); stat=con.createStatement(); System.out.println("Foer SQL bliver returneret. Stedet er: doQuery i dbHandlerServer. SQL'en er: "+sql); return stat.executeQuery(sql); } catch(SQLException e) { e.printStackTrace(System.out); } } return null; } } ------------------------ dbGennemfoer: package test; import java.util.*; import java.sql.*;
public class dbGennemfoer{ dbHandlerServer database=null; /** Creates a new instance of dbGennemfoer */ public dbGennemfoer(){ database=new dbHandlerServer(); database.open("sun.jdbc.odbc.JdbcOdbcDriver", "jdbc:odbc:OCSDB", "", ""); System.out.println("Databasen er åbnet!"); }
public ResultSet beregn(String sql) { //for static contents skyld dbHandlerServer database=null; //indtil for static content skyld System.out.println("Begyndt på beregn i dbGennemfoer"); ResultSet rs; StringTokenizer opdel=new StringTokenizer(sql); String foersteOrd=opdel.nextToken(); System.out.println("Foerste ord er: "+foersteOrd); if(foersteOrd.equalsIgnoreCase("INSERT")){ System.out.println("Gået ind i INSERT i dbGennemfoer"); database.doUpdate(sql); } if(foersteOrd.equalsIgnoreCase("UPDATE")){ System.out.println("Gået ind i UPDATE i dbGennemfoer"); database.doUpdate(sql); } if(foersteOrd.equalsIgnoreCase("SELECT")){ System.out.println("Gået ind i SELECT i dbGennemfoer"); rs=database.doQuery(sql); System.out.println("Har fået RS tilbage i beregn!"); return rs; }
Når jeg starter databasen op i Access nu, så er der godt nok ikke sat noget data ind i den. Men der er vist lavet flere attributværdier (kolloner) end der var i begyndelsen. Antallet af kolonner passer i hvert fald med antallet af FORM-elementer, som skulle sættes ind i databasen..?
Hmm...jeg prøvede lige at slette de kolonner, som der allerede var i databasetabellen. Men når jeg så kører JSP-siden nu, så bliver der godt nok oprettet nogle nye kolonner - men ikke nok. Ahhh - det er alle felterne fra første FORM, som har oprettet nye kolonner i databasen. Men hvorfor gør den nu det?
Servletten/JSP skal kalde en nogle (én) klasse på serveren (hvilket jeg jo ikke kan få til at fungere). Når den har gemt data i databasen, så skal den vise de ændringer/opdateringer, som den har udført - på samme JSP-side. Insert()-metoden var mit forsøg på at lave et kald til serverens javaclasser. Men det skal jo foregå på serversiden selvfølgelig...jeg kunne bare ikke få det til at virke, og ville så teste, om jeg kunne få det til at virke på clientsiden.
Så - nu har jeg lavet den sidst nye version af JSP'en. Den kommer her:
<%@page contentType="text/html"%> <%@page import="DatabaseSearch.*"%> // <%@page import="javax.servlet.*"%> <%@page import="java.util.*"%> <%@page import="java.sql.*"%> // <%! public void a(String navn){ dbGennemfoer database=null; try{ database=new dbGennemfoer(); } catch(Exception e){System.out.println("dbGennemfoer kunne ikke kaldes!");}
//database.beregn("SELECT * FROM doktorTabel"); // database.beregn("SELECT * FROM tabel"); database.beregn("UPDATE doktorTabel SET B=navn WHERE A='HANS'"); //database.beregn("UPDATE doktorTabel SET B='Lars' WHERE A='HANS'"); } /*dbGennemfoer dbg = new dbGennemfoer(); if(request.getMethod().equals("POST")) { dbg.beregn("UPDATE doktorTabel SET A = " + request.getParameter("felt2")); } ResultSet rs = dbg.beregn("SELECT * FROM tabel"); */ %> <html> <head><title>JSP Page</title>
Kan du se, hvad der er forkert med den? F.eks. vil compileren ikke acceptere, at der i action-tag'et til "opdater"-knappen står: "<% a(felt1); %>". Hvorfor vil den ikke det?
Helt enig - men bliver den specifike metode/funktion "a()" så kaldt? Hvad så hvis man her flere metoder/funktioner? Bliver de så også alle sammen kaldt ved tryk på "submit"?
forresten: den linie du skrev 13:39:19 giver kompileringsfejl. "felt1" vil den ikke rigtig godtage. Og jeg tror faktisk, at det er denne løsning, som ville passe bedst....hvis altså den kan lade sig gøre?
a() er:
<%! public void a(String navn){ dbGennemfoer database=null; try{ database=new dbGennemfoer(); } catch(Exception e){System.out.println("dbGennemfoer kunne ikke kaldes!");}
database.beregn("UPDATE doktorTabel SET B=navn WHERE A='HANS'"); } %>
tja, det tror jeg nu også. Jeg har bare nogle problemer med at kalde de aktuelle klasser. Men det kan være, at jeg kan få det til at virke med dit eksempel.
Så prøver jeg med javaclasser nu. Jeg kan godt få det compileret og det hele. Men når jeg kører det, og trykker på submit-knappen, så kommer fejlmeddelelsen:"type Exception report
message Internal Server Error
description The server encountered an internal error (Internal Server Error) that prevented it from fulfilling this request.
exception
javax.servlet.ServletException: DatabaseSearch/dbGennemfoer at org.apache.jasper.runtime.PageContextImpl.handlePageException(PageContextImpl.java:457) at org.apache.jsp.addDoktorJavaTest$jsp._jspService(addDoktorJavaTest$jsp.java:151) at org.apache.jasper.runtime.HttpJspBase.service(HttpJspBase.java:107) at javax.servlet.http.HttpServlet.service(HttpServlet.java:853) at org.netbeans.modules.tomcat.tomcat40.runtime.IDEJspServlet$JspServletWrapper.service(IDEJspServlet.java:173) at org.netbeans.modules.tomcat.tomcat40.runtime.IDEJspServlet.serviceJspFile(IDEJspServlet.java:246) at org.netbeans.modules.tomcat.tomcat40.runtime.IDEJspServlet.service(IDEJspServlet.java:339) at javax.servlet.http.HttpServlet.service(HttpServlet.java:853) at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:247) at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:193) at org.netbeans.modules.web.monitor.server.MonitorFilter.doFilter(MonitorFilter.java:223) at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:213) at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:193) at org.apache.catalina.core.StandardWrapperValve.invoke(StandardWrapperValve.java:243) at org.apache.catalina.core.StandardPipeline.invokeNext(StandardPipeline.java:566) at org.apache.catalina.core.StandardPipeline.invoke(StandardPipeline.java:472) at org.apache.catalina.core.ContainerBase.invoke(ContainerBase.java:943) at org.apache.catalina.core.StandardContextValve.invoke(StandardContextValve.java:201) at org.apache.catalina.core.StandardPipeline.invokeNext(StandardPipeline.java:566) at org.apache.catalina.valves.CertificatesValve.invoke(CertificatesValve.java:246) at org.apache.catalina.core.StandardPipeline.invokeNext(StandardPipeline.java:564) at org.netbeans.modules.web.monitor.catalina.MonitorValve.invoke(MonitorValve.java:142) at org.apache.catalina.core.StandardPipeline.invokeNext(StandardPipeline.java:564) at org.apache.catalina.core.StandardPipeline.invoke(StandardPipeline.java:472) at org.apache.catalina.core.ContainerBase.invoke(ContainerBase.java:943) at org.apache.catalina.core.StandardContext.invoke(StandardContext.java:2344) at org.apache.catalina.core.StandardHostValve.invoke(StandardHostValve.java:164) at org.apache.catalina.core.StandardPipeline.invokeNext(StandardPipeline.java:566) at org.apache.catalina.valves.ErrorDispatcherValve.invoke(ErrorDispatcherValve.java:170) at org.apache.catalina.core.StandardPipeline.invokeNext(StandardPipeline.java:564) at org.apache.catalina.valves.ErrorReportValve.invoke(ErrorReportValve.java:170) at org.apache.catalina.core.StandardPipeline.invokeNext(StandardPipeline.java:564) at org.apache.catalina.valves.AccessLogValve.invoke(AccessLogValve.java:462) at org.apache.catalina.core.StandardPipeline.invokeNext(StandardPipeline.java:564) at org.apache.catalina.core.StandardPipeline.invoke(StandardPipeline.java:472) at org.apache.catalina.core.ContainerBase.invoke(ContainerBase.java:943) at org.apache.catalina.core.StandardEngineValve.invoke(StandardEngineValve.java:163) at org.apache.catalina.core.StandardPipeline.invokeNext(StandardPipeline.java:566) at org.apache.catalina.core.StandardPipeline.invoke(StandardPipeline.java:472) at org.apache.catalina.core.ContainerBase.invoke(ContainerBase.java:943) at org.apache.catalina.connector.http.HttpProcessor.process(HttpProcessor.java:1011) at org.apache.catalina.connector.http.HttpProcessor.run(HttpProcessor.java:1106) at java.lang.Thread.run(Thread.java:536)
root cause
java.lang.NoClassDefFoundError: DatabaseSearch/dbGennemfoer at org.apache.jsp.addDoktorJavaTest$jsp._jspService(addDoktorJavaTest$jsp.java:70) at org.apache.jasper.runtime.HttpJspBase.service(HttpJspBase.java:107) at javax.servlet.http.HttpServlet.service(HttpServlet.java:853) at org.netbeans.modules.tomcat.tomcat40.runtime.IDEJspServlet$JspServletWrapper.service(IDEJspServlet.java:173) at org.netbeans.modules.tomcat.tomcat40.runtime.IDEJspServlet.serviceJspFile(IDEJspServlet.java:246) at org.netbeans.modules.tomcat.tomcat40.runtime.IDEJspServlet.service(IDEJspServlet.java:339) at javax.servlet.http.HttpServlet.service(HttpServlet.java:853) at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:247) at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:193) at org.netbeans.modules.web.monitor.server.MonitorFilter.doFilter(MonitorFilter.java:223) at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:213) at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:193) at org.apache.catalina.core.StandardWrapperValve.invoke(StandardWrapperValve.java:243) at org.apache.catalina.core.StandardPipeline.invokeNext(StandardPipeline.java:566) at org.apache.catalina.core.StandardPipeline.invoke(StandardPipeline.java:472) at org.apache.catalina.core.ContainerBase.invoke(ContainerBase.java:943) at org.apache.catalina.core.StandardContextValve.invoke(StandardContextValve.java:201) at org.apache.catalina.core.StandardPipeline.invokeNext(StandardPipeline.java:566) at org.apache.catalina.valves.CertificatesValve.invoke(CertificatesValve.java:246) at org.apache.catalina.core.StandardPipeline.invokeNext(StandardPipeline.java:564) at org.netbeans.modules.web.monitor.catalina.MonitorValve.invoke(MonitorValve.java:142) at org.apache.catalina.core.StandardPipeline.invokeNext(StandardPipeline.java:564) at org.apache.catalina.core.StandardPipeline.invoke(StandardPipeline.java:472) at org.apache.catalina.core.ContainerBase.invoke(ContainerBase.java:943) at org.apache.catalina.core.StandardContext.invoke(StandardContext.java:2344) at org.apache.catalina.core.StandardHostValve.invoke(StandardHostValve.java:164) at org.apache.catalina.core.StandardPipeline.invokeNext(StandardPipeline.java:566) at org.apache.catalina.valves.ErrorDispatcherValve.invoke(ErrorDispatcherValve.java:170) at org.apache.catalina.core.StandardPipeline.invokeNext(StandardPipeline.java:564) at org.apache.catalina.valves.ErrorReportValve.invoke(ErrorReportValve.java:170) at org.apache.catalina.core.StandardPipeline.invokeNext(StandardPipeline.java:564) at org.apache.catalina.valves.AccessLogValve.invoke(AccessLogValve.java:462) at org.apache.catalina.core.StandardPipeline.invokeNext(StandardPipeline.java:564) at org.apache.catalina.core.StandardPipeline.invoke(StandardPipeline.java:472) at org.apache.catalina.core.ContainerBase.invoke(ContainerBase.java:943) at org.apache.catalina.core.StandardEngineValve.invoke(StandardEngineValve.java:163) at org.apache.catalina.core.StandardPipeline.invokeNext(StandardPipeline.java:566) at org.apache.catalina.core.StandardPipeline.invoke(StandardPipeline.java:472) at org.apache.catalina.core.ContainerBase.invoke(ContainerBase.java:943) at org.apache.catalina.connector.http.HttpProcessor.process(HttpProcessor.java:1011) at org.apache.catalina.connector.http.HttpProcessor.run(HttpProcessor.java:1106) at java.lang.Thread.run(Thread.java:536)
"
...har du nogen ide om, hvad denne fejlmeddelse betyder?
Hvis der er 13 felter i doktorTabel (ellers skal der feltnavne i separate parenteser) og værdierne er tal (ellers så skal der sættes '' omkring tekst variablene) så bør det virke.
Ja, tabellerne er lavet som ORDER BY, så recorden bliver sat ind på dens retmæssige plads. Hvis man vil sætte data ind i flere tabeller, hvordan gør man så?
Her er et lille udpluk af JSP-siden. Den vil kun gennemføre den første SQL. Hvis jeg dernæst bytter om på rækkefølgen, så vil den også gerne gennemføre den næste - hvis altså den første ER oprettet (noget primærnøglepjat sikkert).
<% if(request.getMethod().equals("POST")) { classes.dbKald dbMod=null; try{ dbMod=new classes.dbKald(); } catch(Exception e){} String fornavn = request.getParameter("fornavn"); String efternavn = request.getParameter("efternavn"); String adr = request.getParameter("adr"); int privatnr = Integer.parseInt(request.getParameter("privatnr").trim()); int lokalnr = Integer.parseInt(request.getParameter("lokalnr").trim()); int mobilnr = Integer.parseInt(request.getParameter("mobilnr").trim()); String by = request.getParameter("by"); String initialer = request.getParameter("initialer"); int Operationsvalg = Integer.parseInt(request.getParameter("Operationsvalg").trim()); dbMod.eksekver("INSERT INTO Operatør VALUES ('"+fornavn+"', '"+efternavn+"', '"+adr+"', '"+privatnr+"', '"+lokalnr+"', '"+mobilnr+"', '"+by+"', '"+initialer+"')"); dbMod.eksekver("INSERT INTO Opvalg VALUES ("+Operationsvalg+")"); } %>
"Den vil kun gennemføre den første SQL. Hvis jeg dernæst bytter om på rækkefølgen, så vil den også gerne gennemføre den næste - hvis altså den første ER oprettet"
Problemet var, at det var kun det første SQL-statement, som blev udført. Alle efterfølgende statements blev ikke udført. Hvis man så kørte testen igen med de ikke-gennemførte statements først, så virkede de også. Men jeg har selv fundet ud af, hvorfor det ikke virkede. Jeg benytter jo en metode i javaklasser ved hvert sql-statement. Og inde i den metode bliver databaseforbindelsen lukket ned i slutningen, mens databsen bliver åbnet i en anden metode. Så problemet var, at forbindelsen var lukket ned.
Næsten. Når jeg nu på samme JSP-side har 2 forskellige (submit)-knapper, hvordan får jeg så dem til at virke? Den ene skal gemme data i databasen, mens den anden skal foretage en SELECT fra databasen udfra et felt i FORMen...og derefter vise de aktuelle data i de resterende FORM-felter. Hvordan gøres dette?
Sådan ser det ud indtil videre:
<%@page contentType="text/html"%> <%@page import="java.sql.*"%> <% if(request.getMethod().equals("POST")) { classes.dbKald dbMod1=null; classes.dbKald dbMod2=null; try{ dbMod1=new classes.dbKald(); dbMod2=new classes.dbKald(); } catch(Exception e){} String fornavn = request.getParameter("fornavn"); String efternavn = request.getParameter("efternavn"); String adr = request.getParameter("adr"); int privatnr = Integer.parseInt(request.getParameter("privatnr").trim()); int lokalnr = Integer.parseInt(request.getParameter("lokalnr").trim()); int mobilnr = Integer.parseInt(request.getParameter("mobilnr").trim()); String by = request.getParameter("by"); String initialer = request.getParameter("initialer"); int Operationsvalg = Integer.parseInt(request.getParameter("Operationsvalg").trim()); dbMod1.eksekver("INSERT INTO Operatør VALUES ('"+fornavn+"', '"+efternavn+"', '"+adr+"', '"+privatnr+"', '"+lokalnr+"', '"+mobilnr+"', '"+by+"', '"+initialer+"')"); dbMod2.eksekver("INSERT INTO Opvalg VALUES ('"+initialer+"', "+Operationsvalg+")"); } if(request.getMethod().equals("POST2")) { classes.dbKald dbMod3=null; try{ dbMod3=new classes.dbKald(); } catch(Exception e){} String initialer = request.getParameter("initialer"); ResultSet result; result=dbMod3.eksekver("SELECT fornavn FROM Operator WHERE OpInitialer="+initialer); //result=dbMod3.eksekver("SELECT * FROM Operator WHERE OpInitialer="+initialer); } %> <html> <head><title>Operator</title>
1) Du kan lave 2 forme med et skjult felt i hver der angiver hvad det er 2) Du kan lave 1 form med et felt hvor man angiver om det er det ene eller det andet
Og så en logik i JSP som:
if(method.equals("POST")) { if(request.getParameter("mode").equals("UPD")) { executeUpdate("INSERT INTO tabel VALUES (" + request.getParameter("felt") + ")"); } else if(request.getParameter("mode").equals("SEL")) { executeQuery("SELECT * FROM tabel WHERE felt = " + request.getParameter("felt")); } } else { executeQuery("SELECT * FROM tabel"); }
Jeg har en tabel (Operatør), som jeg gerne vil ændre data i. Altså skal jeg bruge UPDATE. Men tabellen er forbundet med en anden tabel (Operationsvalg), og vil derfor ikke acceptere, at jeg kun ændrer i den første tabel. Hvis jeg i samme metode prøver at lave lændringer inde i tabel 2, så siger den, at den kun har null-værdier at arbejde med. Jeg har så fundet ud af, at det sikkert skyldes, at jeg aktiverer metoden ved et tryk på en anden knap. Tryk på denne knap skulle gerne sende data fra felterne i FORMen med over til den nye metode - data i felterne er desuden fremkommet ved en SELECT ved et tryk på en 3 knap. Hvordan får jeg disse data med ved den nye knap?
Du skal have data til begge tabeller i samme form og så lave en submit, JSP skal processe POST og hente felterne til variable og lave de 2 INSERT/UPDATE i den rigtige rækkefølge.
Hvis du vil sætte en værdi i et felt i JSP, så mener jeg det er:
Næh, jeg tror, at jeg har set mig blind på et problem. Jeg kan ikke oprette en patient i databasen nu. Access siger, at det er "type mismatch". Men jeg kan ikke se, hvor problemet er. Desuden fungerer resten i "patient"-jsp'en heller ikke ordentligt.
Databasetabellen ser sådan ud: Patientnr text fornavn text efternavn text Adresse Number Privat tlf Number Arb tlf Number Mobil Number By text Tilmeldt text
Patientnr text pling fornavn text pling efternavn text pling Adresse Number pling <---------------- Privat tlf Number no pling Arb tlf Number no pling Mobil Number no pling By text pling Tilmeldt text pling
Number og no pling matcher ikke !
Umiddelbart vil jeg da også tro at adresse skal være tekst !?
Ja, jeg tænkte nok, at problemet var mere end som så. Fejlen, som du har fundet, er nemlig en skrivefejl fra min side af. Databasen ser nemlig således ud:
Patientnr - text fornavn - text efternavn - text adresse - text Privat tlf - Number Arb tlf - Number Mobil - Number By - text Tilmeldt - text
"Plinger"??? øh, nej, det er der ikke (hvis det betyder, at Access godtager inputtet).
hehe...jeg prøvede det lige af. Lavede "afbudbog" om...det blev sendt som "felt16" i stedet for "afbudsbog" - og nu fungerer det. Jaja - nogle gange gør det godt med en nats søvn ;-)
Hehe - jeg tror ikke helt, at det er pointtid endnu. Jeg skal lige have hele systemet til at virke først. Og der kan jo godt være mange spørgsmål inden den tid oprender.
Men bare rolig Arve_v - du er HELT sikker på, at du får point i massevis. Du har sgu været en stor hjælp!
Ja, så opstod der et nyt problem. Hvordan får man adskillige værdier ud af et ResultSet? ResultSettet har taget * ud fra en tabel, som har 5 attributer og et uvist antal records. I det aktuelle tilfælde er det kun den sidste attributs værdi, som er interessant. Der skal findes den højeste værdi i hele tabellen, da den nye record, som skal sættes ind, får sit 5 felt (attribut) til det højeste i tabellen+1 (attributen i tabellen er Autonumber, som derfor skal inkrementeres med 1). Hvordan får jeg ledt ALLE records igennem, får det sidste felt ud ved alle, som jeg så kan checke på, og derefter kan sætte den nye record ind???
dbMod.eksekver("UPDATE Vagtskema SET Ugevagtnr='"+Ugevagtnr+"' WHERE OpInitialer='"+OpInitialer+"' AND IDVagtskema="IDVagtskema""); dbMod.eksekver("UPDATE Vagtskema SET Ugedag='"+Ugedag+"' WHERE OpInitialer='"+OpInitialer+"' AND IDVagtskema="IDVagtskema""); dbMod.eksekver("UPDATE Vagtskema SET Årstal='"+Årstal+"' WHERE OpInitialer='"+OpInitialer+"' AND IDVagtskema="IDVagtskema"");
Den mener, at der skal være parantes-slut ved [AND IDVagtskema="IDVagtskema"");] på dette sted =")"
Altså OpInitialer, Ugedag o.s.v.. De komike ud. Jeg har så fundet ud af, at submitknappen ikke var i samme form. Det har jeg løst vha. onClick-tricket, som du fortalte mig...men det fungerer stadig ikke.
Tak for hjælpen Arve_V. Du har sgu været en god støtte/hjælp. Du fortjener fuldt ud de 200 point...hvis ikke mere (uvist for hvilke grunde eksperten har sat et loft i pointgivelse).
:-) nu da jeg har hul igennem til dig...gidder du så ikke at se på http://www.eksperten.dk/spm/337355 ? Det er et spørgsmåljeg har oprettet, som relaterer til de problemer, som vi/du har løst her...
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.