Avatar billede cogitans Nybegynder
17. marts 2003 - 09:34 Der 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?
Avatar billede arne_v Ekspert
17. marts 2003 - 09:48 #1
Sagtens.

Dine JSP sider kalder nogle Java klasser som henter data via JDBC.

Det er gjordt masser af gange.

Man kan også bruge EJB'er.

Men jeg formoder at du har nogle specielle krav siden du vil give så mange point ??
Avatar billede cogitans Nybegynder
17. marts 2003 - 10:04 #3
:-) tjoeh...mit eneste "krav" er sådan set et eksempel på det...
Avatar billede arne_v Ekspert
17. marts 2003 - 10:13 #4
Hvad med eksemplerne i ovenstående 2 links ?
Avatar billede cogitans Nybegynder
17. marts 2003 - 10:18 #5
Tjo, jeg har da fundet lidt eksempler...så nu skal jeg lige teste, om de virker...
Avatar billede cogitans Nybegynder
17. marts 2003 - 10:24 #6
Hmm, jeg synes ikke, at de eksempler jeg kunne finde bruger javaclasser til at udføre databaseforespørgslen? Det foregår bare i rene JSP-tags?
Avatar billede arne_v Ekspert
17. marts 2003 - 10:27 #7
Men ellers er det altså meget simpelt.

Lad os sige at du bruger følgende minimalistiske database
wrapper klasse:

import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.ResultSet;
import java.sql.SQLException;


public class DatabaseWrapper {
    private Connection con;
    public DatabaseWrapper(String driver, String url, String un, String pw) throws ClassNotFoundException, SQLException {
        Class.forName(driver);
        con = DriverManager.getConnection(url, un, pw);
    }
    public int update(String sql) throws SQLException {
        return con.createStatement().executeUpdate(sql);
    }
    public ResultSet query(String sql) throws SQLException {
        return con.createStatement().executeQuery(sql);
    }
}

så kan din JSP indeholde:

<%@ page import="java.sql.*" %">
...
<%
try {
  DatabaseWrapper dbw = new DatabaseWrapper("en.jdbc.driver", "brugernavn", "kodeord");
  dbw.update("UPDATE tabelnavn SET felt1=" + request.getParameter("felt1") + " WHERE felt2=" + request.getParameter("felt2"));
%>
felt3<br>
-----<br>
<%
  ResultSet rs = dbw.query(SELECT felt3 FROM tabelnavn");
  while(rs.next()) {
%>
<%=rs.getInt("felt3")%><br>
<%
  }
catch (Exception e) {
%>
<em>Database error: <%=e%></em>
<%
}
%>
...
Avatar billede arne_v Ekspert
17. marts 2003 - 10:32 #8
Faktisk bruger taglib eksemplet klasser som ligger i tag librariet.

Men ellers se eksempel ovenfor.

Der er ikke noget magisk ved at bruge en database wrapper klasse
fremfor at bruge java.sql.* klasserne direkte.

Man bare muligvis gøre det en anelse pænere.
Avatar billede cogitans Nybegynder
17. marts 2003 - 10:33 #9
Okay.
Jeg har lavet de 2 efterfølgende klasser. Jeg synes, at de ser ud som om, at de godt kan bruges???

package DatabaseSearch;

import java.sql.*;

public class dbHandlerServer extends Thread{
    private Connection con=null;
    Statement stat=null;
    public dbHandlerServer() {
    }
   
    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 void doUpdate(String sql) {
        if(con!=null) {
            try {
                long time=System.currentTimeMillis();
                System.out.println("SQL Update = "+sql);
                stat=con.prepareStatement(sql);
                stat.executeUpdate();
            }
            catch(SQLException e) {
                e.printStackTrace(System.out);
            }
        }
    }
   
    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;
    }
}

package DatabaseSearch;
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)
    {
        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;
        }
       
        database.close();
        return null;
    }
}
Avatar billede arne_v Ekspert
17. marts 2003 - 10:46 #10
Umiddelbart ser de OK ud.

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.
Avatar billede arne_v Ekspert
17. marts 2003 - 10:47 #11
Og det burde ikke være svært at bruge de klasser fra JSP.

JSP er ekstremt simpelt. Put din java kode ind mellem <% %> og
så kører det.
Avatar billede cogitans Nybegynder
17. marts 2003 - 10:48 #12
Ja, println er der kun for debug'ens skyld.

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?
Avatar billede cogitans Nybegynder
17. marts 2003 - 10:58 #13
Hvordan kommer jeg omkring dette problem:

seDoktor$jsp.java [117:1] non-static method beregn(java.lang.String) cannot be referenced from a static context
                          ResultSet rs=dbGennemfoer.beregn(sql);
                                                  ^
1 error
Errors compiling seDoktor.
Avatar billede arne_v Ekspert
17. marts 2003 - 11:00 #14
Fuldstændigt ligesom du vil en normal Java kode !

<%
dbGennemfoer dbg = new dbGennemfoer();
dbg.beregn("INSERT IN tabelnavn VALUES(1,2,3)");
%>
Avatar billede arne_v Ekspert
17. marts 2003 - 11:01 #15
med hensyn til compile fejl, så er det fordi beren er en ikke static
metode og derfor er du nødt til at instantiere et objekt.

Se mit 11:00:27 eksempel.
Avatar billede arne_v Ekspert
17. marts 2003 - 11:03 #16
I praksis skal din SQL vel konstrueres udfra diverse form felter.

F.eks.:

String sql = "INSERT INTO tabelnavn VALUES (" + request.getParameter("felt1") + "," + request.getParameter("felt2" + "," + request.getParameter("felt3") + ")";
Avatar billede arne_v Ekspert
17. marts 2003 - 11:03 #17
Jeg håber ikke jeg snakker sort.
Avatar billede cogitans Nybegynder
17. marts 2003 - 11:07 #18
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?
Avatar billede arne_v Ekspert
17. marts 2003 - 11:14 #19
Nu er jeg lidt forvirret.

Normalt vil du have 2 sider:

side1.jsp:

<form method="post" action="side2.jsp">
<input type="text" name="felt1">
<input type="text" name="felt2">
<input type="submit" value="OK">
</form>

side2.jsp:

<%
String felt1 = request.getParameter("felt1");
String felt2 = request.getParameter("felt2");
// lav SQL udfra felt1 og felt2
%>
Avatar billede cogitans Nybegynder
17. marts 2003 - 11:14 #20
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?
Avatar billede arne_v Ekspert
17. marts 2003 - 11:16 #21
Altså man udfylder form i side1 og får man vist side2 med de
valgte data.

Man kan dog godt kombinere dem !

side.jsp:

<form method="post" action="side.jsp">
<input type="text" name="felt1">
<input type="text" name="felt2">
<input type="submit" value="OK">
</form>
<%
String felt1 = request.getParameter("felt1");
if(felt1==null) felt1=DEFAULT1;
String felt2 = request.getParameter("felt2");
if(felt2==null) felt1=DEFAULT2;
// lav SQL udfra felt1 og felt2
%>

eller noget i den stil - der er mange variations muligheder.
Avatar billede cogitans Nybegynder
17. marts 2003 - 11:17 #22
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. (?)
Avatar billede arne_v Ekspert
17. marts 2003 - 11:18 #23
request.getParameter("felt1") i den side der er submittet til
returnerer værdien af feltet felt1 i den side der er submittet
fra.

Returnerer null hvis ikke defineret.

Se evt. mine 2 sidste kommentarer.
Avatar billede arne_v Ekspert
17. marts 2003 - 11:19 #24
side2.jsp er også en JSP side som viser data. Den bruger så Java kode
(mellen <% %>).
Avatar billede cogitans Nybegynder
17. marts 2003 - 11:19 #25
Nåh - okay. Jeg er med igen nu. Men er det ikke det samme som hvis man kalder felterne et navn, og henviser til dem, som jeg skrev før?
Avatar billede arne_v Ekspert
17. marts 2003 - 11:19 #26
Og side1.jsp og side2.jsp kan godt kombineres hvis man vil det.
Avatar billede arne_v Ekspert
17. marts 2003 - 11:21 #27
Felterne skal have navne og der skal henvises til dem.

PS: Jeg vill aldrig give et felt et navn som startede med et tal.
Avatar billede cogitans Nybegynder
17. marts 2003 - 11:24 #28
:-) 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?
Avatar billede arne_v Ekspert
17. marts 2003 - 11:28 #29
Nej.

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.
Avatar billede arne_v Ekspert
17. marts 2003 - 11:28 #30
Men altså i 2 omgange.
Avatar billede cogitans Nybegynder
17. marts 2003 - 12:00 #31
"nej" - "ja"?

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??
Avatar billede arne_v Ekspert
17. marts 2003 - 12:08 #32
Du bliver nødt til at hente siden 2 gange.

Første gang tomn fordi felter ikke udfyldt.

Anden gang fylder du siden ud med database data.
Avatar billede cogitans Nybegynder
17. marts 2003 - 12:32 #33
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?
Avatar billede cogitans Nybegynder
17. marts 2003 - 12:44 #34
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!!!

Hvad er der gjort forkert???
Avatar billede cogitans Nybegynder
17. marts 2003 - 12:55 #35
...det er vist en pageException...er det ikke?
Avatar billede arne_v Ekspert
17. marts 2003 - 13:28 #36
????

Du kan ikke lave action="klasse".

Du skal have en action="side" og side skal så kalde klasse.
Avatar billede arne_v Ekspert
17. marts 2003 - 13:29 #37
action angiver den URL som browseren requester når man klikker
submit.

Java klasserne kan kun køres på server inden i en JSP side (eller
en servlet).
Avatar billede cogitans Nybegynder
17. marts 2003 - 13:46 #38
Jo, men nu vil den ikke engang køre JSP-siden (den vil godt kompileres).
Siden ser således ud:

<%@page contentType="text/html"%>
<%@page import="DatabaseSearch.test.*"%>
<%-- --%>
<%@page import="javax.servlet.*"%>
<%@page import="java.util.*"%>
<%@page import="test.*"%>
<%-- --%>
<html>
<head><title>JSP Page</title>

</head>
<body>

<%-- <jsp:useBean id="beanInstanceName" scope="session" class="package.class" /> --%>
<%-- <jsp:getProperty name="beanInstanceName"  property="propertyName" /> --%>
<TABLE width='100%' height='100%' border='1'>
  <TR>
    <TD colspan='2'><CENTER><B>Tilføj doktor</B></CENTER></TD>
  </TR>
  <TR>
    <TD align='right'>
      <FORM method='get' name='laegeinfo' onSubmit=''>
        Oprettelse af læge:<BR>
        Cpr-nr:<INPUT type='text' value='' name='felt1'>*<BR>
        Navn:<INPUT type='text' value='' name='felt2'>*<BR>
        Adresse:<INPUT type='text' value='' name='felt3'>*<BR>
        Postnummer:<INPUT type='text' value='' name='felt4'>*<BR>
        By:<INPUT type='text' value='' name='felt5'>*<BR>
        E-mail:<INPUT type='text' value='' name='felt6'><BR>
        Privat tlf:<INPUT type='text' value='' name='felt7'><BR>
        Arb.tlf:<INPUT type='text' value='' name='felt8'><BR>
        Mobil tlf:<INPUT type='text' value='' name='felt9'>
      </FORM>
    </TD>
  <TD align='right'>
      Udfyldes af sekretær:
      <FORM method='get' name='speciLaege' onSubmit=''>
      Specificering af speciallæge:<BR>
      Lægetype:<INPUT type='text' value='' name='felt10'>*<BR>
      Speciale:<INPUT type='text' value='' name='felt11'>*<BR>
      Operationsvalg:<INPUT type='text' value='' name='felt12'>*<BR>
      Lægens initialer:<INPUT type='text' value='' name='felt13'>*<BR>
      </FORM>
    </TD>
  </TR>
  <TR>
    <TD colspan='2'>
    <CENTER>
      <FORM action='POST' method='get' name='opretLaege'>
        <%
          try{
          String sql="";
          sql="INSERT INTO doktorTabel Value (felt1, felt2, felt3, felt4, felt5, felt6, felt7, felt8, felt9, felt10, felt11, felt12, felt13)";
         
          dbGennemfoer dbg = new dbGennemfoer();
          dbg.beregn(sql);}
          catch(Exception e){}
        %>
        <INPUT type='submit' value='Annuller'>Annuller <INPUT type='submit' value='Gem'>Opret læge
      </FORM>
    </CENTER>
    </TD>
    <TD>
    </TD>
  </TR>
</TABLE>
</body>
</html>

..og her kalder jeg da ikke nogle classer gennem et action-tag...?
Avatar billede arne_v Ekspert
17. marts 2003 - 14:46 #39
Hmm.

Et JSP problem altså ?

Prøv lige og ændre dine imports til:

<%@page import="DatabaseSearch.test.*,javax.servlet.*,java.util.*,test.*"%>
Avatar billede arne_v Ekspert
17. marts 2003 - 14:49 #40
Du bør kunne få siden med de 3 forme op.

Men submit vil ikke virke.
Avatar billede arne_v Ekspert
17. marts 2003 - 14:51 #41
1)  Jeg tror du vil have alle 3 forme merget sammen til 1 form - du
    kan godt stadigvæk adskille de 2.

2)  Så skal der submittes til noget der udfører evt. opdateringer.

3)  Og så skal input felterne have værdier fra query.
Avatar billede cogitans Nybegynder
17. marts 2003 - 14:58 #42
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...
Avatar billede cogitans Nybegynder
17. marts 2003 - 15:07 #43
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 boolean open(String dbDriverName, String dbClassName, String user, String pass){
        try{
            if(con==null) {
                System.out.println("Databsen åbnes");
                Class.forName(dbDriverName).newInstance();
                System.out.println("NewInstance kaldt");
                con=DriverManager.getConnection(dbClassName, user, pass);
                System.out.println("Forbindelse oprettet");
                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 void doUpdate(String sql) {
        if(con!=null) {
            try {
                long time=System.currentTimeMillis();
                System.out.println("SQL Update = "+sql);
                //stat=con.prepareStatement(sql);
                stat=con.createStatement();
                stat.executeUpdate(sql);
            }
            catch(SQLException e) {
                e.printStackTrace(System.out);
            }
        }
    }
   
    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;
        }
       
        database.close();
        return null;
    }
}
--------------
addDoktor.jsp
<%@page contentType="text/html"%>
<%@page import="test.*"%>
<%@page import="java.sql.*"%>
<%@page import="javax.servlet.*"%>
<%@page import="java.util.*"%>
<%@page import="test.*"%>
<%-- --%>
<%@page import="java.io.*"%>
<%@page import="java.net.*"%>
<%@page import="java.text.*"%>
<%-- --%>
<%!
public void insert(){
          try{
          String sql="";
          sql="INSERT INTO doktorTabel Values (felt1, felt2, felt3, felt4, felt5, felt6, felt7, felt8, felt9, felt10, felt11, felt12, felt13)";
         
          dbGennemfoer dbg = new dbGennemfoer();
       
          //ResultSet rs=dbg.beregn(sql);
          dbg.beregn(sql);
          }
          catch(Exception e){e.printStackTrace();}
        }; %>
<html>
<head><title>JSP Page</title>

</head>
<body>

<%-- <jsp:useBean id="beanInstanceName" scope="session" class="package.class" /> --%>
<%-- <jsp:getProperty name="beanInstanceName"  property="propertyName" /> --%>
<TABLE width='100%' height='100%' border='1'>
  <TR>
    <TD colspan='2'><CENTER><B>Tilføj doktor</B></CENTER></TD>
  </TR>
  <TR>
    <TD align='right'>
      <FORM method='get' name='laegeinfo' onSubmit=''>
        Oprettelse af læge:<BR>
        Cpr-nr:<INPUT type='text' value='' name='felt1'>*<BR>
        Navn:<INPUT type='text' value='' name='felt2'>*<BR>
        Adresse:<INPUT type='text' value='' name='felt3'>*<BR>
        Postnummer:<INPUT type='text' value='' name='felt4'>*<BR>
        By:<INPUT type='text' value='' name='felt5'>*<BR>
        E-mail:<INPUT type='text' value='' name='felt6'><BR>
        Privat tlf:<INPUT type='text' value='' name='felt7'><BR>
        Arb.tlf:<INPUT type='text' value='' name='felt8'><BR>
        Mobil tlf:<INPUT type='text' value='' name='felt9'>
      </FORM>
    </TD>
  <TD align='right'>
      Udfyldes af sekretær:
      <FORM method='get' name='speciLaege' onSubmit=''>
      Specificering af speciallæge:<BR>
      Lægetype:<INPUT type='text' value='' name='felt10'>*<BR>
      Speciale:<INPUT type='text' value='' name='felt11'>*<BR>
      Operationsvalg:<INPUT type='text' value='' name='felt12'>*<BR>
      Lægens initialer:<INPUT type='text' value='' name='felt13'>*<BR>
      </FORM>
    </TD>
  </TR>
  <TR>
    <TD colspan='2'>
    <CENTER>
      <FORM action='' method='post' name='opretLaege' onsubmit='insert();'>
        <INPUT type='submit' value='Annuller'>Annuller <INPUT type='submit' value='Gem' onClick='insert()'>Opret læge
      </FORM>
    </CENTER>
    </TD>
    <TD>
    </TD>
  </TR>
</TABLE>
</body>
</html>
----------------

Kan du se, hvad jeg har gjort forkert?
(databasen ligger i samme mappe som de andre filer)
Avatar billede cogitans Nybegynder
17. marts 2003 - 15:13 #44
HOVSA!!!

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..?
Avatar billede cogitans Nybegynder
17. marts 2003 - 15:18 #45
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?
Avatar billede arne_v Ekspert
17. marts 2003 - 15:47 #46
Jeg forstår ikke din HTML !

insert metode er Java og skal udføres server-side.

onsubmit og onclick er client-side.
Avatar billede arne_v Ekspert
17. marts 2003 - 15:57 #47
<form method="POST" action="servlet">
<form method="GET" action="servlet">
<form method="POST" action="side.jsp">
<form method="GET" action="side.jsp">

hvis det er en servlet laver den så en redirect eller en forward til en
JSP side når den har gemt.
Avatar billede cogitans Nybegynder
18. marts 2003 - 10:03 #48
Det er jo nok mig, som ikke helt forstår det så.

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.
Avatar billede arne_v Ekspert
18. marts 2003 - 11:05 #49
Et af problemerne er at der er så mange måder at gøre det på.

Hvis jeg skal gætte lidt så tror jeg at det er følgende du vil
lave:

du har en database wrapper klasse

du har en JSP side

man kalder JSP side og får vist data

så kan man rette i data og klikke submit

rettelserne udføres i databasen

man ser samme side med de rettede data

Er det korrekt forstået ?
Avatar billede cogitans Nybegynder
18. marts 2003 - 11:07 #50
Ja, det er helt rigtig forstået. (?)
Avatar billede arne_v Ekspert
18. marts 2003 - 11:12 #51
Så skal din JSP groft sagt have følgende struktur:

<%
dbGennemfoer dbg = new dBGennemfoer();
if(request.getMethod().equals("POST")) {
  dbg.beregn("UPDATE tabel SET felt2 = " + request.getParameter("felt2") + WHERE felt1 = " + request.getParameter("felt1"));
}
ResultSet rs = dbg.beregn("SELECT * FROM tabel");
%>

<form method="POST" action="sigselv.jsp">
<input type="text" name="felt1" value="<%=rs.getInt("felt1")%>">
<input type="text" name="felt2" value="<%=rs.getInt("felt2")%>">
<input type="submit" value="opdater">
</form>

[simpelt eksempel med 2 integer felter hvoraf det sidste kan opdateres]
Avatar billede arne_v Ekspert
18. marts 2003 - 11:14 #52
Prøv og kig lidt på det eksmepel.

Første gang man henter er det bare en GET.

Så sker der:
  SELECT
  en form vises med data

Når man klikker opdater så er det en POST.

Så sker der:
  UPDATE
  SELECT
  en form vises med data (som altså er opdateret)
Avatar billede arne_v Ekspert
18. marts 2003 - 11:15 #53
Dte er muligt at jeg ikke er god til at forklare.

Men jeg ved det virker, fordi jeg har selv lavet
noget tilsvarende.
Avatar billede cogitans Nybegynder
18. marts 2003 - 13:26 #54
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>

</head>
<body>

<%-- <jsp:useBean id="beanInstanceName" scope="session" class="package.class" /> --%>
<%-- <jsp:getProperty name="beanInstanceName"  property="propertyName" /> --%>
<TABLE width='100%' height='100%' border='1'>
  <TR>
    <TD colspan='2'><CENTER><B>Tilføj doktor</B></CENTER></TD>
  </TR>
  <TR>
    <TD align='right'>
      <FORM method='get' name='laegeinfo' onSubmit=''>
        Oprettelse af læge:<BR>
        Cpr-nr:<INPUT type='text' value='' name='felt1'>*<BR>
        Navn:<INPUT type='text' value='' name='felt2'>*<BR>
        Adresse:<INPUT type='text' value='' name='felt3'>*<BR>
        Postnummer:<INPUT type='text' value='' name='felt4'>*<BR>
        By:<INPUT type='text' value='' name='felt5'>*<BR>
        E-mail:<INPUT type='text' value='' name='felt6'><BR>
        Privat tlf:<INPUT type='text' value='' name='felt7'><BR>
        Arb.tlf:<INPUT type='text' value='' name='felt8'><BR>
        Mobil tlf:<INPUT type='text' value='' name='felt9'>
      </FORM>
    </TD>
  <TD align='right'>
      Udfyldes af sekretær:
      <FORM method='get' name='speciLaege' onSubmit=''>
      Specificering af speciallæge:<BR>
      Lægetype:<INPUT type='text' value='' name='felt10'>*<BR>
      Speciale:<INPUT type='text' value='' name='felt11'>*<BR>
      Operationsvalg:<INPUT type='text' value='' name='felt12'>*<BR>
      Lægens initialer:<INPUT type='text' value='' name='felt13'>*<BR>
      </FORM>
    </TD>
  </TR>
  <TR>
    <TD colspan='2'>
    <CENTER>

      <form method="POST" action="addDoktorTest.jsp">
        <input type="text" name="felt1" value="<%/*=rs.getInt("felt1")*/%>">
        <input type="text" name="felt2" value="<%/*=rs.getInt("felt2")*/%>">
        <input type="submit" value="opdater" action='<% a(felt1); %>'>
      </form>
    </CENTER>
    </TD>
    <TD>
    </TD>
  </TR>
</TABLE>
</body>
</html>

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?
Avatar billede arne_v Ekspert
18. marts 2003 - 13:39 #55
Der skal ikke være nogen action attribut i input type=submit tagget.

Hvis der skulle have været så skulle du have skrevet:

<input type="submit" value="opdater" action='<%=a("felt1")%>'>

[eller noget i den stil - jeg ved ikke hvad a er]
Avatar billede cogitans Nybegynder
18. marts 2003 - 13:42 #56
Hvordan får man så den funktioanlittet ind, at metoden skal kaldes, når der trykkes på knappen? Ved script evt?
Avatar billede cogitans Nybegynder
18. marts 2003 - 13:42 #57
...altså "onClick=a();"
Avatar billede arne_v Ekspert
18. marts 2003 - 15:33 #58
<form method="POST" action="addDoktorTest.jsp">
        ...
        <input type="submit" value="opdater">
      </form>

er helt fint.

Klik på submit vil submitte til addDoktorTest.jsp uden bruge
af JavaScript. Standard HTML.
Avatar billede cogitans Nybegynder
18. marts 2003 - 15:55 #59
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"?
Avatar billede cogitans Nybegynder
18. marts 2003 - 16:01 #60
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'");
  }   
%>
Avatar billede arne_v Ekspert
18. marts 2003 - 16:05 #61
onClick er client-side og JSP er server-side og det kan ikke bruges
på den måde.

Og jeg vil godt tro at det giver syntax fejl.

Det skal ikke laves på den måde.
Avatar billede arne_v Ekspert
18. marts 2003 - 16:05 #62
Jeg overvejer om jeg skal lave et komplet eksempel der virker !
Avatar billede arne_v Ekspert
18. marts 2003 - 23:01 #63
Det her stykke JSP har jeg kørt (og det virker):

<%@ page import="java.sql.*" %>
<%
Class.forName("sun.jdbc.odbc.JdbcOdbcDriver");
Connection con = DriverManager.getConnection("jdbc:odbc:TestMSAccess");
Statement stmt = con.createStatement();
if(request.getMethod().equals("POST")) {
    int F1 = Integer.parseInt(request.getParameter("F1"));
    String F2 = request.getParameter("F2");
    stmt.executeUpdate("INSERT INTO T1 VALUES (" + F1 + ",'" + F2 + "')");
}
%>
<!doctype html public "-//w3c/dtd HTML 4.01 Transitional//en">
<html>
<head>
<title>T1</title>
</head>
<body>
<h1>T1</h1>
<h2>Show data</h2>
<table border>
<%
ResultSet rs = stmt.executeQuery("SELECT * FROM T1");
while(rs.next()) {
%>
<tr>
<td><%=rs.getInt("F1")%></td>
<td><%=rs.getString("F2")%></td>
</tr>
<%
}
%>
</table>
<h2>Add data</h2>
<form method="post" action="test.jsp">
F1:<input type="text" name="F1" size="10">
<br>
F2:<input type="text" name="F2" size="20">
<br>
<input type="submit" value="Add">
</form>
</body>
</html>
Avatar billede arne_v Ekspert
18. marts 2003 - 23:02 #64
Tabel T1 har 2 felter: F1 - int, F2 - String.

Ret simpelt faktisk.
Avatar billede cogitans Nybegynder
19. marts 2003 - 10:11 #65
Hehe - ja, det var nok en god ide med et eksempel. Og mange tak for det!
Avatar billede cogitans Nybegynder
19. marts 2003 - 10:22 #66
YES! Endelig fungerer det - som du sagde :-)
Nu skal jeg så lige se, om jeg kan overføre det til mit eget eksempel.
Avatar billede cogitans Nybegynder
19. marts 2003 - 11:29 #67
...så mangler funktionalitteten med javaclasserne, som varetager databaseadgang, bare...
Avatar billede arne_v Ekspert
19. marts 2003 - 11:43 #68
Jo men det er vel bare at konvertere direkte brug af JDBC klasser
til brug af din Database wrapper klasse.
Avatar billede cogitans Nybegynder
19. marts 2003 - 13:08 #69
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.
Avatar billede arne_v Ekspert
19. marts 2003 - 13:14 #70
Utestet:

<%@ page import="java.sql.*" %>
<%
dbGennemfoer dbg = new dbGennemfoer();
if(request.getMethod().equals("POST")) {
    int F1 = Integer.parseInt(request.getParameter("F1"));
    String F2 = request.getParameter("F2");
    dbg.beregn("INSERT INTO T1 VALUES (" + F1 + ",'" + F2 + "')");
}
%>
<!doctype html public "-//w3c/dtd HTML 4.01 Transitional//en">
<html>
<head>
<title>T1</title>
</head>
<body>
<h1>T1</h1>
<h2>Show data</h2>
<table border>
<%
ResultSet rs = dbg.beregn("SELECT * FROM T1");
while(rs.next()) {
%>
<tr>
<td><%=rs.getInt("F1")%></td>
<td><%=rs.getString("F2")%></td>
</tr>
<%
}
%>
</table>
<h2>Add data</h2>
<form method="post" action="test.jsp">
F1:<input type="text" name="F1" size="10">
<br>
F2:<input type="text" name="F2" size="20">
<br>
<input type="submit" value="Add">
</form>
</body>
</html>
Avatar billede arne_v Ekspert
19. marts 2003 - 20:01 #71
Er du kommet videre ?
Avatar billede cogitans Nybegynder
20. marts 2003 - 10:34 #72
Nej, jeg har ikke rigtig prøvet med javaclasser endnu. Jeg er lige ved at sætte mig helt ind i dit eksempel...
Avatar billede arne_v Ekspert
20. marts 2003 - 12:40 #73
Skriv hvis du synes der er noget som kræver en forklaring.
Avatar billede cogitans Nybegynder
20. marts 2003 - 13:10 #74
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?
Avatar billede arne_v Ekspert
20. marts 2003 - 15:00 #75
Den kan ikke finde din klasse DatabaseSearch.dbGennemfoer !

Enten skal den ligge i:

xxxx\WEB-INF\classes\DatabaseSearch\dbGennemfoer.class

eller som

DatabaseSearch/dbGennemfoer.class

i xxxx\WEB-INF\lib\yyyy.jar
Avatar billede cogitans Nybegynder
20. marts 2003 - 15:02 #76
Ja, jeg fandt ud af det i mellemtiden. Men nu vil den ikke gennemføre en INSERT.

<%@page contentType="text/html"%>
<%@page import="java.sql.*"%>
<%
if(request.getMethod().equals("POST")) {
  classes.dbGennemfoer dbMod=null;
  try{
    dbMod=new classes.dbGennemfoer();
  }
  catch(Exception e){}
    String F1 = request.getParameter("felt1");
    String F2 = request.getParameter("felt2");
    String F3 = request.getParameter("felt3");
    String F4 = request.getParameter("felt4");
    String F5 = request.getParameter("felt5");
    String F6 = request.getParameter("felt6");
    String F7 = request.getParameter("felt7");
    String F8 = request.getParameter("felt8");
    String F9 = request.getParameter("felt9");
    String F10 = request.getParameter("felt10");
    String F11 = request.getParameter("felt11");
    String F12 = request.getParameter("felt12");
    String F13 = request.getParameter("felt13");
    dbMod.beregn("INSERT INTO doktorTabel VALUES (A='"+F1+"', B='"+F2+"', c='"+F3+"', d='"+F4+"', e='"+F5+"', f='"+F6+"', g='"+F7+"', h='"+F8+"', i='"+F9+"', j='"+F10+"', k='"+F11+"', l='"+F12+"', m='"+F13+"')");
}
%>
<html>
<head><title>JSP Page</title>

</head>
<body>

<%-- <jsp:useBean id="beanInstanceName" scope="session" class="package.class" /> --%>
<%-- <jsp:getProperty name="beanInstanceName"  property="propertyName" /> --%>
<TABLE width='100%' height='100%' border='1'>
  <TR>
    <TD colspan='2'><CENTER><B>Tilføj doktor</B></CENTER></TD>
  </TR>
  <TR>
    <TD align='right'>
      <FORM method='POST' action='addDoktorJavaTest.jsp'>
        Oprettelse af læge:<BR>
        Cpr-nr:<INPUT type='text' value='' name='felt1'>*<BR>
        Navn:<INPUT type='text' value='' name='felt2'>*<BR>
        Adresse:<INPUT type='text' value='' name='felt3'>*<BR>
        Postnummer:<INPUT type='text' value='' name='felt4'>*<BR>
        By:<INPUT type='text' value='' name='felt5'>*<BR>
        E-mail:<INPUT type='text' value='' name='felt6'><BR>
        Privat tlf:<INPUT type='text' value='' name='felt7'><BR>
        Arb.tlf:<INPUT type='text' value='' name='felt8'><BR>
        Mobil tlf:<INPUT type='text' value='' name='felt9'>
    </TD>
  <TD align='right'>
      Specificering af speciallæge:<BR>
      Lægetype:<INPUT type='text' value='' name='felt10'>*<BR>
      Speciale:<INPUT type='text' value='' name='felt11'>*<BR>
      Operationsvalg:<INPUT type='text' value='' name='felt12'>*<BR>
      Lægens initialer:<INPUT type='text' value='' name='felt13'>*<BR>
    </TD>
  </TR>
  <TR>
    <TD colspan='2'>
    <CENTER>
        <%--<INPUT type='submit' value='Annuller'>Annuller--%>
        <INPUT type='submit' value='Gem'>Opret læge
      </FORM>
    </CENTER>
    </TD>
    <TD>
    </TD>
  </TR>
</TABLE>
</body>
</html>
Avatar billede arne_v Ekspert
20. marts 2003 - 15:19 #77
Det er ikke valid SQL syntax for INSERT.

Det er:
  INSERT INTO tabel VALUES (værdi1, værdi2, ...)
eller:
  INSERT INTO tabel (feltnavn1, feltnavn2, ....) VALUES (værdi1, værdi2, ...)
Avatar billede cogitans Nybegynder
20. marts 2003 - 15:42 #78
Skulle denne sætning så ikke fungere:

dbMod.beregn("INSERT INTO doktorTabel VALUES ("+F1+", "+F2+", "+F3+", "+F4+", "+F5+", "+F6+", "+F7+", "+F8+", "+F9+", "+F10+", "+F11+", "+F12+", "+F13+")");

?
Avatar billede arne_v Ekspert
20. marts 2003 - 16:07 #79
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.
Avatar billede arne_v Ekspert
20. marts 2003 - 16:08 #80
For '' se F2 i mit oprindelige eksempel.
Avatar billede arne_v Ekspert
20. marts 2003 - 16:09 #81
Et godt tips for læse-venlighed af koden kald:
  database felt
  form felt navn
  java variabel navn
for det samme.
Avatar billede cogitans Nybegynder
20. marts 2003 - 22:12 #82
Felterne er textfelter. Men syntaxen i mit eksempel på en INSERT-sætning er da god nok. Det er da den samme, som i dit eksempel under 13:14:41...?
Avatar billede arne_v Ekspert
20. marts 2003 - 22:15 #83
Nix.

dbg.beregn("INSERT INTO T1 VALUES (" + F1 + ",'" + F2 + "')");

Læs grundigt - meget grundigt - jeg har nogle ' siddende omkring F2 !
Avatar billede arne_v Ekspert
20. marts 2003 - 22:16 #84
Det er fordi det er:

INSERT INTO tabel VALUES (1,2,3,'A','B B','C C C');
Avatar billede cogitans Nybegynder
21. marts 2003 - 09:26 #85
Så virker det!
Når jeg bruger INSERT, kommer data så automatisk ind i slutningen af tabellen?
Avatar billede arne_v Ekspert
21. marts 2003 - 09:39 #86
Godt spørgsmål !

Ifølge relationel database teori, så kan rækkerne komme i en vilkårlig
rækkefølge når man laver en SELECT (uden ORDER BY).

I praksis skal du nok regne med at enten kommer de i den rækkefølgde de
er sat ind eller så kommer de i rækkefølge efter primray key.

Du bør seriøst overveje at bruge ORDER BY for selv at bestemme række-følgen.

SELECT * FROM T1 ORDER BY F2

vil hente rækkerne sorteret efter feltet F2.
Avatar billede cogitans Nybegynder
21. marts 2003 - 10:31 #87
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å?
Avatar billede arne_v Ekspert
21. marts 2003 - 10:45 #88
Pointen er man laver bare INSERT og så bestemmer man på SELECT
tidspunkt sorteringen med ORDER BY.
Avatar billede arne_v Ekspert
21. marts 2003 - 10:45 #89
Flere tabeller ?

Du laver bare en INSERT per tabel !
Avatar billede arne_v Ekspert
21. marts 2003 - 10:49 #90
Men det vil muligvis være anbefalelsesværdigt at gøre det som:

con.setAutoCommit(false);
...
try {
  stmt.executeUpdate("INSERT ...");
  stmt.executeUpdate("INSERT ...");
  stmt.executeUpdate("INSERT ...");
  con.commit();
} catch {SQLException e) {
  con.rollback();
}

det vil sikre at enten udføres alle INSERT eller ingen.
Avatar billede cogitans Nybegynder
21. marts 2003 - 10:58 #91
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+")");
}
%>

Ved du hvorfor?
Avatar billede arne_v Ekspert
21. marts 2003 - 11:03 #92
Jeg forstår ikke din problem-beskrivelse:

"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"
Avatar billede cogitans Nybegynder
21. marts 2003 - 12:06 #93
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.
Avatar billede arne_v Ekspert
21. marts 2003 - 12:42 #94
OK.

Vær opmærksom på at det er en dyr/langsom operation at lave en connection.

Virker det hele så nu ?
Avatar billede cogitans Nybegynder
21. marts 2003 - 12:46 #95
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>

</head>
<body>

<%-- <jsp:useBean id="beanInstanceName" scope="session" class="package.class" /> --%>
<%-- <jsp:getProperty name="beanInstanceName"  property="propertyName" /> --%>
<TABLE width='100%' height='100%' border='1'>
  <TR>
    <TD colspan='2'><CENTER><B>Operatør</B></CENTER></TD>
  </TR>
  <TR>
    <TD align='right'>
      <%if (result!=null){ result.getString("Fornavn");}%>
      <FORM method='POST' action='Operator.jsp'>
        Oprettelse af læge:<BR>
        Fornavn:<INPUT type='text' value='<%%>' name='fornavn'>*<BR>
        Efternavn:<INPUT type='text' value='' name='efternavn'>*<BR>
        Adresse:<INPUT type='text' value='' name='adr'>*<BR>
        Privattlf#:<INPUT type='text' value='' name='privatnr'>*<BR>
        Lokal#:<INPUT type='text' value='' name='lokalnr'>*<BR>
        Mobil#:<INPUT type='text' value='' name='mobilnr'><BR>
        By:<INPUT type='text' value='' name='by'><BR>
        OpInitialer:<INPUT type='text' value='' name='initialer'><BR>
    </TD>
  <TD align='right'>
      Specificering af operatør:<BR>
      Operationsvalg:<INPUT type='text' value='' name='Operationsvalg'>*<BR>
    </TD>
  </TR>
  <TR>
    <TD>
    <CENTER>
        <%--<INPUT type='submit' value='Annuller'>Annuller--%>
        <INPUT type='submit' value='Gem'>Opret operatør
      </FORM>
    </CENTER>
    </TD>
    <TD>
    <CENTER>
        <%--<INPUT type='submit' value='Annuller'>Annuller--%>
      <FORM method='POST2' action='Operator.jsp'>
        <INPUT type='submit' value='Søg'>Søg efter operatør
      </FORM>
    </CENTER>
    </TD>
  </TR>
</TABLE>
</body>
</html>
Avatar billede arne_v Ekspert
21. marts 2003 - 13:03 #96
Ja det virker næppe.

method skal være GET eller POST.

Så vidt jeg kan se har du 2 mulighder:

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");
}

hvis du kan følge min tanke-gang.
Avatar billede cogitans Nybegynder
21. marts 2003 - 14:28 #97
Jo, det kan jeg skam godt. Det er løst nu vha. "hidden fields".
Avatar billede cogitans Nybegynder
22. marts 2003 - 12:43 #98
Nu har jeg et nyt problem :-)

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?
Avatar billede arne_v Ekspert
22. marts 2003 - 16:18 #99
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:

<input type="text" name="f" size="20" value="<%=rs.getString("f")%>">
Avatar billede arne_v Ekspert
22. marts 2003 - 16:19 #100
Forudsætter feltets navn er f og at der er et ResultSet med navn rs.

Feltet kan naturligvis laves hidden hvis nødvendigt.
Avatar billede arne_v Ekspert
25. marts 2003 - 08:17 #101
Har du fået det til at virke ?
Avatar billede cogitans Nybegynder
25. marts 2003 - 10:00 #102
Yep, jeg tror, det fungerer nu. Nu skal der så lige testes lidt ;-)
Avatar billede cogitans Nybegynder
25. marts 2003 - 13:02 #103
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

mens Patient.jsp er således ud:

<%@page contentType="text/html"%>
<%@page import="java.sql.*"%>
<%
String Patientnr="";
String Fornavn="";
String Efternavn="";
String Adresse="";
String By="";
int Privat=0;
int Arb=0;
int Mobil=0;
String felt9="";
String felt10="";
String Akutliste="";
String Operationskode="";
String Diagnose="";
String Diagnosekode="";
String Lægevalg="";
String Booking="";
String Afbudsbog="";
//kald fra knapper
String Opret=request.getParameter("Opret");
String Find=request.getParameter("Find");
String Alter=request.getParameter("Alter");
ResultSet result;
classes.dbKald dbMod=null;
if(Opret!=null){
if(Opret.equals("Opret")) {
  try{
    dbMod=new classes.dbKald();
  }
  catch(Exception e){}
    Patientnr = request.getParameter("Patientnr");
    Fornavn = request.getParameter("Fornavn");
    Efternavn = request.getParameter("Efternavn");
    Adresse = request.getParameter("Adresse");
    By = request.getParameter("By");
    Privat = Integer.parseInt(request.getParameter("Privat").trim());
    Arb = Integer.parseInt(request.getParameter("Arb").trim());
    Mobil = Integer.parseInt(request.getParameter("Mobil").trim());
    felt9 = request.getParameter("felt9");
    felt10 = request.getParameter("felt10");
    Akutliste=request.getParameter("Akutliste");
    Operationskode=request.getParameter("Operationskode");
    Diagnose=request.getParameter("Diagnose");
    Diagnosekode=request.getParameter("Diagnosekode");
    Lægevalg=request.getParameter("Lægevalg");
    Booking=request.getParameter("Booking");
    Afbudsbog= request.getParameter("Afbudsbog");
System.out.println("Patientnr"+Patientnr);
System.out.println("Fornavn"+Fornavn);
System.out.println("Efternavn"+Efternavn);
System.out.println("Adresse"+Adresse);
System.out.println("By"+By);
System.out.println("Privat"+Privat);
System.out.println("Arb"+Arb);
System.out.println("Mobil"+Mobil);
System.out.println("felt9"+felt9);
System.out.println("felt10"+felt10);
System.out.println("Afbudsbog"+Afbudsbog);
    dbMod.eksekver("INSERT INTO Patient VALUES ('"+Patientnr+"', '"+Fornavn+"', '"+Efternavn+"', '"+Adresse+"', "+Privat+", "+Arb+", "+Mobil+", '"+By+"', '"+Afbudsbog+"')");
    //dbMod.eksekver("INSERT INTO Opvalg VALUES ('"+initialer+"', "+Operationsvalg+")");
dbMod.close();
}
}

if(Find!=null){
if(Find.equals("search")) {
  try{
    dbMod=new classes.dbKald();
    Patientnr = request.getParameter("patientnr");
    result=dbMod.eksekver("SELECT * FROM Patient WHERE Patientnr='"+Patientnr+"' ");
    result.next();
    Fornavn = result.getString(1);
    Efternavn=result.getString(2);
    Adresse=result.getString(3);
    Privat=Integer.parseInt(result.getString(4).trim());
    Mobil=Integer.parseInt(result.getString(5).trim());
    By=result.getString(6);
    Afbudsbog=request.getParameter("Afbudsbog");

    result=dbMod.eksekver("SELECT * FROM Diagnoser WHERE Patientnr='"+Patientnr+"' ");
Operationskode=result.getString(2);
Diagnose=result.getString(3);
Diagnosekode=result.getString(4);
Lægevalg=result.getString(5);
Booking=result.getString(6).trim();
    result.next();
  }
  catch(Exception e){ System.out.println(e);}
  dbMod.close();
}
}//if
%>
<html>
<head><title>JSP Page</title></head>
<body>
<TABLE HEIGHT='100%' WIDTH='100%' border='1'>
  <TR>
    <TD colspan='3' align='center'><H3>Patient</H3></TD>
  </TR>
  <TR>
    <TD align='right'>
      <FORM method='post' name='cprnummer' action="Patient.jsp">
        Patient-nr:<INPUT type='text' value='<%=Patientnr%>' name='Patientnr'>*<BR>
        Fornavn:<INPUT type='text' value='<%=Fornavn%>' name='Fornavn'>*<BR>
        Efternavn:<INPUT type='text' value='<%=Efternavn%>' name='Efternavn'>*<BR>
        Adresse:<INPUT type='text' value='<%=Adresse%>' name='Adresse'>*<BR>
        By:<INPUT type='text' value='<%=By%>' name='By'>*<BR>
        Privat tlf:<INPUT type='text' value='<%=Privat%>' name='Privat'><BR>
        Arb.tlf:<INPUT type='text' value='<%=Arb%>' name='Arb'><BR>
        Mobil tlf:<INPUT type='text' value='<%=Mobil%>' name='Mobil'>
    </TD>
    <TD align='right'>
      Specificering af operation:<BR>
      Operationstype:
        <select name='felt9' size='1'>
        <OPTION value='Alloplastik'>Alloplastik
        <OPTION value='Skulder'>Skulder
        <OPTION value='Korsbånd'>Korsbånd
        <OPTION value='Andet'>Andet
        </SELECT>*
      <BR>
      Akutliste:
        <select name='felt10' size='1'>
        <OPTION value='Akut'>Akut
        <OPTION value='Subakut'>Subakut
        <OPTION value='Fremskyndet'>Fremskyndet
        <OPTION value='Almindelig tidsbestilling'>Almindelig tidsbestilling
        <OPTION value='Andet'>Andet
        </SELECT>*
      <BR>
      Operationskode:<INPUT type='text' value='<%=Operationskode%>' name='Operationskode'>*<BR>
      Diagnose:<INPUT type='text' value='<%=Diagnose%>' name='Diagnose'>*<BR>
      Diagnosekode:<INPUT type='text' value='<%=Diagnosekode%>' name='Diagnosekode'>*<BR>
      Lægevalg:<INPUT type='text' value='<%=Lægevalg%>' name='Lægevalg'><BR>
      Dato for booking:<INPUT type='text' value='<%=Booking%>' name='Booking'><BR>
    </TD>
    <TD>
      Tilmelding i "Afbudsbog":<BR>
      <INPUT type='checkbox' checked name='felt16'>Patienten vil IKKE i afbudsbogen.<BR>
      <INPUT type='checkbox' name='felt17'>Patienten VIL tilmeldes.
<BR>
<BR>
      <INPUT type='hidden' value='<%="Opret"%>' name='Opret'>
      <INPUT type='hidden' name='initialer2'>
<INPUT type='hidden' name='Patientnr'>
<INPUT type='hidden' name='Fornavn'>
<INPUT type='hidden' name='Efternavn'>
<INPUT type='hidden' name='Adresse'>
<INPUT type='hidden' name='By'>
<INPUT type='hidden' name='Privat'>
<INPUT type='hidden' name='Arb'>
<INPUT type='hidden' name='Mobil'>
<INPUT type='hidden' name='felt9'>
<INPUT type='hidden' name='felt10'>
<INPUT type='hidden' name='Operationskode'>
<INPUT type='hidden' name='Diagnose'>
<INPUT type='hidden' name='Diagnosekode'>
<INPUT type='hidden' name='Lægevalg'>
<INPUT type='hidden' name='Booking'>
<INPUT type='hidden' name='felt16'>
<INPUT type='hidden' name='felt17'>
      <INPUT type='submit' name='OpretPatient' value='Opret Patient' onclick='document.Opret.patientnr.value=document.cprnummer.Patientnr.value,
document.Opret.Fornavn.value=document.cprnummer.Fornavn.value,
document.Opret.Efternavn.value=document.cprnummer.Efternavn.value,
document.Opret.Adresse.value=document.cprnummer.Adresse.value,
document.Opret.By.value=document.cprnummer.By.value,
document.Opret.Privat.value=document.cprnummer.Privat.value,
document.Opret.Arb.value=document.cprnummer.Arb.value,
document.Opret.Mobil.value=document.cprnummer.Mobil.value,
document.Opret.felt9.value=document.cprnummer.felt9.value,
document.Opret.felt10.value=document.cprnummer.felt10.value,
document.Opret.Operationskode.value=document.cprnummer.Operationskode.value,
document.Opret.Diagnose.value=document.cprnummer.Diagnose.value,
document.Opret.Diagnosekode.value=document.cprnummer.Diagnosekode.value,
document.Opret.Lægevalg.value=document.cprnummer.Lægevalg.value,
document.Opret.Booking.value=document.cprnummer.Booking.value,
document.Opret.felt16.value=document.cprnummer.felt16.value,
document.Opret.felt17.value=document.cprnummer.felt17.value'
><BR>
      <INPUT type='hidden' value='<%="Find"%>' name='Find'>
      <INPUT type='hidden' name='patientnr'>
      <INPUT type='submit' name='Findpatient' value='Find patient' onclick='document.Find.patientnr.value=document.cprnummer.Patientnr.value'><BR>
      <INPUT type='hidden' value='<%="Alter"%>' name='Alter'>
      <INPUT type='submit' name='Modificer' value='Modificer en patient'>
    </TD>
  </TR>
  <TR>
    <TD colspan='3'>
      Patienten skal oprettes før patienten kan bookes!<BR>
      <INPUT type='submit' name='search' value='Søg efter operationsdato'><INPUT type='submit' name='search' value='Find næste ledige tid'><BR>
      <INPUT type='submit' name='search' value='Accepter denne dato'><INPUT type='text' value='<%/*=*/%>' name='felt18'>Operationsdato udfra operatør<BR>
      <INPUT type='submit' name='search' value='Accepter denne dato'><INPUT type='text' value='<%/*=*/%>' name='felt19'>Operationsdato udfra operationstype/akuttype
    </FORM>
    </TD>
  </TR>
</TABLE>
</body>
</html>

kan du/i overskue, hvad der skal laves om?
Avatar billede arne_v Ekspert
25. marts 2003 - 22:07 #104
Lad mig se:

  dbMod.eksekver("INSERT INTO Patient VALUES ('"+Patientnr+"', '"+Fornavn+"', '"+Efternavn+"', '"+Adresse+"', "+Privat+", "+Arb+", "+Mobil+", '"+By+"', '"+Afbudsbog+"')");

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 !?
Avatar billede cogitans Nybegynder
26. marts 2003 - 08:57 #105
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

????
Avatar billede arne_v Ekspert
26. marts 2003 - 09:33 #106
Er der plinger i de data du ligger ind ?

Det er et kendt problem som man oftest løser ved at skifte fra
Statement til PreparedStatement.

Ellers ville det nok være rart at få printet den færdige
SQL sætning fra din eksekver metode og at få en præcise
SQLException.
Avatar billede cogitans Nybegynder
26. marts 2003 - 09:46 #107
"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 ;-)
Avatar billede arne_v Ekspert
26. marts 2003 - 10:08 #108
plinger = '

når man sætter '' omkring tekster man indsætter, så går det ganske
gevaldigt galt, når teksterne selv indeholder ' !
Avatar billede arne_v Ekspert
26. marts 2003 - 10:09 #109
Alt fungerer nu ?

Fedt !

Point tid så ?

(savle savle)
Avatar billede arne_v Ekspert
26. marts 2003 - 10:13 #110
Jeg tror oiøvrigt at du kunne pynte din kode lidt ved at lave:

- data klasser for hver record type
- lave et ekstra lag database klasser mellem JSP og din generelle
  database klasse
Avatar billede cogitans Nybegynder
26. marts 2003 - 10:17 #111
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!
Avatar billede cogitans Nybegynder
26. marts 2003 - 12:41 #112
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???
Avatar billede arne_v Ekspert
26. marts 2003 - 12:51 #113
Den primitive løsning er:

rs = stmt.executeQuery("SELECT * FROM tabel");
int maxf = 0;
while(rs.next()) {
  int f = rs.getInt("f");
  if(f > max) maxf = f;
}

den smarte løsning er:

rs = stmt.executeQuery("SELECT MAX(f) FROM tabel");
rs.next();
int maxf = rs.getInt(1);
Avatar billede arne_v Ekspert
26. marts 2003 - 12:52 #114
Men ofte vælger at man at springe over autonumber felter.

Eksempel:
  f1 - autonumber
  f2 - int
  f2 - text

INSERT INTO tabel (f2, f3) VALUES (123, 'ABC');

så giver databsen selv f1 en autonumber.
Avatar billede cogitans Nybegynder
26. marts 2003 - 13:00 #115
ja, så fungerer den også :-)
Avatar billede cogitans Nybegynder
26. marts 2003 - 13:26 #116
Hvorfor kan dette så ikke lade sig gøre:

  try{
    dbMod=new classes.dbKald();
  }
  catch(Exception e){ System.out.println(e);}
  OpInitialer = request.getParameter("OpInitialer");
  Ugevagtnr = Integer.parseInt(request.getParameter("Ugevagtnr").trim());
  Ugedag = request.getParameter("Ugedag");
  Årstal = request.getParameter("Årstal");
  IDVagtskema = Integer.parseInt(request.getParameter("IDVagtskema").trim());

  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 =")"

???
Avatar billede arne_v Ekspert
26. marts 2003 - 13:39 #117
Er den ikke gal med plingerne ?

AND IDVagtskema='" + IDVagtskema + "'");
Avatar billede cogitans Nybegynder
26. marts 2003 - 13:42 #118
Nej, det har jeg testet for - desuden er IDVagtskema jo en integer...?
Avatar billede arne_v Ekspert
26. marts 2003 - 13:44 #119
Jamen så skal det vel være:

AND IDVagtskema=" + IDVagtskema);

(stadig forskellig fra hvad du postede)
Avatar billede cogitans Nybegynder
26. marts 2003 - 13:46 #120
jo, men så er det jo ikke en del af den string, som sende videre i systemet.

uuhhh...der mangler sgu da et "+" før variabelnavnet :-)
Avatar billede arne_v Ekspert
26. marts 2003 - 13:52 #121
Jo.

+ fungerer som append når der er strenge med i billedet.
Avatar billede cogitans Nybegynder
26. marts 2003 - 13:53 #122
yeps - men kaldet kommer ikke engang op i metoden...
Jeg har lige prøvet at skrive variablerne ud i metoden, og de kommer ikke ud.
Avatar billede arne_v Ekspert
26. marts 2003 - 14:03 #123
Øh - jeg forstår ikke helt.
Avatar billede cogitans Nybegynder
26. marts 2003 - 14:09 #124
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.

Når jeg nu skriver:

String Find=request.getParameter("Opdater");

if(Find!=null){
if(Find.equals("Opdater")) {
  try{
    dbMod=new classes.dbKald();
  }

I hvilket felt i FORMen skal der så stå "Opdater", for at den kan checke på det i det jeg lige skrev?
Avatar billede cogitans Nybegynder
26. marts 2003 - 14:11 #125
Hele JSP-siden ser således ud:

<%@page contentType="text/html"%>
<%@page import="java.sql.*"%>
<%
ResultSet result=null;
String OpInitialer="";
int Ugevagtnr=0;
String Ugedag="";
String Årstal="";
int IDVagtskema=0;

String Opret=request.getParameter("opret");
String Find=request.getParameter("Opdater");

classes.dbKald dbMod=null;

if(Opret!=null){
if(Opret.equals("opret")) {
  try{
    dbMod=new classes.dbKald();
  }
  catch(Exception e){}
  OpInitialer = request.getParameter("OpInitialer");
  Ugevagtnr = Integer.parseInt(request.getParameter("Ugevagtnr").trim());
  Ugedag = request.getParameter("Ugedag");
  Årstal = request.getParameter("Årstal");
System.out.println("OpInitialer");
System.out.println("Ugevagtnr");
System.out.println("Ugedag");
System.out.println("Årstal");
System.out.println("INSERT INTO Vagtskema (OpInitialer, UgeVagtnr, Ugedag, Årstal) VALUES ('"+OpInitialer+"', "+Ugevagtnr+", '"+Ugedag+"', "+Årstal+")");
  dbMod.eksekver("INSERT INTO Vagtskema (OpInitialer, UgeVagtnr, Ugedag, Årstal) VALUES ('"+OpInitialer+"', "+Ugevagtnr+", '"+Ugedag+"', "+Årstal+")");
  dbMod.close();
}
}//if

if(Find!=null){
if(Find.equals("Opdater")) {
  try{
    dbMod=new classes.dbKald();
  }
  catch(Exception e){ System.out.println(e);}
  OpInitialer = request.getParameter("OpInitialer");
  Ugevagtnr = Integer.parseInt(request.getParameter("Ugevagtnr").trim());
  Ugedag = request.getParameter("Ugedag");
  Årstal = request.getParameter("Årstal");
  IDVagtskema = Integer.parseInt(request.getParameter("IDVagtskema").trim());
System.out.println("Initial er: "+OpInitialer);
System.out.println("Ugevagt er: "+Ugevagtnr);
System.out.println("Ugedag er: "+Ugedag);
System.out.println("Årstal er: "+Årstal);
System.out.println("IdVagt er: "+IDVagtskema);
  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+"");

  dbMod.close();
}
}//if
%>
<html>
<head><title>JSP Page</title></head>
<body>
<TABLE width='100%' height='100%' border='1'>
    <TD>
    <CENTER>
      <FORM name='opret' method='POST' action='Vagtplan.jsp'>
        <INPUT type='hidden' value='<%="opret"%>' name='opret'>
        Opret en vagtplan for en operatør:<BR>
        Operatørinitialer:<INPUT type='text' value='<%=OpInitialer%>' name='OpInitialer'>*<BR>
        Ugevagtnr:<INPUT type='text' value='<%=Ugevagtnr%>' name='Ugevagtnr'>*<BR>
        Ugedag:<INPUT type='text' value='<%=Ugedag%>' name='Ugedag'>*<BR>
        Årstal:<INPUT type='text' value='<%=Årstal%>' name='Årstal'>*<BR>
        ID_Vagtskema:<INPUT type='text' value='<%=IDVagtskema%>' name='ID_Vagtskema'>*<BR>
        <INPUT type='submit' value='opret'> Opret
      </FORM>
    </CENTER>
    </TD>
    <TD>
    <CENTER>
      <FORM name='Opdater' method='POST' action='Vagtplan.jsp'>
        <INPUT type='hidden' value='<%="Opdater"%>' name='Opdater'>
        <INPUT type='hidden' name='initialer1'>
        <INPUT type='hidden' name='Ugevagtnr'>
        <INPUT type='hidden' name='Ugedag'>
        <INPUT type='hidden' name='Årstal'>
        <INPUT type='hidden' name='ID_Vagtskema'>
        <INPUT type='submit' value='Opdater' onclick='
document.Opdater.initialer1.value=document.opret.OpInitialer.value
document.Opdater.Ugevagtnr.value=document.opret.Ugevagtnr.value
document.Opdater.Ugedag.value=document.opret.Ugedag.value
document.Opdater.Årstal.value=document.opret.Årstal.value
document.Opdater.ID_Vagtskema.value=document.opret.ID_Vagtskema.value'> Ændre vagtplanen for en operatør (Skriv OperatørInitialer for operatøren ind)
      </FORM>
    </CENTER>
    </TD>
</TABLE>
</body>
</html>
Avatar billede arne_v Ekspert
26. marts 2003 - 19:25 #126
Er problemet at når du klikker submit så udfører den JS koden men får slet
ikke submittet opdaterimgs oplysningerne til serveren med JSP siden ?
Avatar billede arne_v Ekspert
26. marts 2003 - 19:28 #127
Du har struktureret det som:
  vis + opret
  opdater

Jeg tror nok at jeg ville forsøge at bruge samme form til det hele altså:
  vis + opret + opdater
eller koble vis med opdater altså:
  opret
  vis + opdater
Avatar billede arne_v Ekspert
26. marts 2003 - 19:28 #128
(og derved ungå at skulel bruge onclick)
Avatar billede cogitans Nybegynder
27. marts 2003 - 10:33 #129
ja, det prøver jeg lige...
Avatar billede arne_v Ekspert
28. marts 2003 - 13:16 #130
Hvordan går det ?
Avatar billede cogitans Nybegynder
08. april 2003 - 09:38 #131
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).
Avatar billede arne_v Ekspert
08. april 2003 - 10:13 #132
Det har de. Og den regel håndhæves strengt.

Men 200 point er også helt fint.
Avatar billede cogitans Nybegynder
08. april 2003 - 10:27 #133
:-) 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...
Avatar billede arne_v Ekspert
08. april 2003 - 10:44 #134
Jeg har set det.

Men hvordan HTML ser ud i browsere er ikke ligefrem mit ekspertise
område.
Avatar billede cogitans Nybegynder
08. april 2003 - 11:32 #135
Okay...
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
Kurser inden for grundlæggende programmering

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