Avatar billede snowflake7 Nybegynder
22. juli 2002 - 16:38 Der er 6 kommentarer og
1 løsning

Hjælp til at programmere en Indkøbskurv?--hvad gør jeg nu?

Jeg har en DBHandler:
package usingjsp.Butik;


import java.sql.*;
import java.util.*;

/** A base class for objects that map to database tables */

public abstract class DBHandler
{

    public Vector getAll(Connection conn)
        throws SQLException
    {
        return getAll(conn, null, null);
    }

/*henter alle objekter der macher en bestemt Where**/
    public Vector getAll(Connection conn, String whereClause)
        throws SQLException
    {
        return getAll(conn, whereClause, null);
    }

/** Henter alle objekterne i en tabel,som matcher en specifik where
    og gør det muligt for kunden at specificere yderligere tabeler, der bliver bliver brugt i
    where'en  */
    public Vector getAll(Connection conn, String whereClause,
        String additionalTables)
        throws SQLException
    {
        Statement s = null;

        try
        {
            s = conn.createStatement();

            Vector v = new Vector();

// byg  query'en.Den basale query bliver "select <fields> from table"
            String query = "select "+getFieldList()+" from "+getTableName();

// Tilføj yderligere tabeller, hvis der er brug for det
            if (additionalTables != null)
            {
                query = query + "," + additionalTables;
            }

// Tilføj where hvis der er brug for det
            if (whereClause != null)
            {
                query = query + " where "+whereClause;
            }

// udfør query
            ResultSet results = s.executeQuery(query);

// lav en vector af resultaterne
            while (results.next())
            {
                v.addElement(createInstance(results));
            }

            return v;
        }
        finally
        {
            if (s != null)
            {
                try { s.close(); } catch (Exception ignore) {}
            }
        }
    }

/** Udfører en vilkårlig query string som skulle returnerer alle
*  felterne i tabellen ligesom de andre querier. */
    public Vector executeQuery(Connection conn, String query)
        throws SQLException
    {
        Statement s = null;

        try
        {
            s = conn.createStatement();

            Vector v = new Vector();

// udfør query
            ResultSet results = s.executeQuery(query);

// lav en vector af resultaterne
            while (results.next())
            {
                v.addElement(createInstance(results));
            }

            return v;
        }
        finally
        {
            if (s != null)
            {
                try { s.close(); } catch (Exception ignore) {}
            }
        }
    }

/** Indsæt et objekt i databasen */
    public int insert(Connection conn)
        throws SQLException
    {
        PreparedStatement s = null;

        try
        {
// Få dette objekt til at udføre dets eget insert funktion
            s = conn.prepareStatement(getInsertStatement());

// Sæt dataværdier ind i insert funktionen
            prepareInsertStatement(s);

// Udfør insert'en
            return s.executeUpdate();
        }
        finally
        {
            if (s != null)
            {
                try { s.close(); } catch (Exception ignore) {}
            }
        }
    }

// Returnerer en liste af felter i tabellen (bruges til select)
    public abstract String getFieldList();

/** Returnerer en liste af felter i tabellen og i mens specificeres en
*  tabel til feltnavnene,tabellen får et alias.feltnavne tilbage til det
*  originale navn. For eksempel, kunden vil måske gerne spørge fra tabel A og
*  tabel B, hver indeholde et felt F. hvis kunden skriver "select F from A,B ..." får
*  kunden måske en fejl fordi F er flertydig. Kunden bliver nødt til at skrive
*  "select A.F as F from A,B ...". Denne  rutine tager den originale felt-
*  liste og laver en liste af sådanne aliaser.
*/
    public String getFieldList(String tableName)
    {
// Lav en tokenizer til at analysere i gennem den originale liste
        StringTokenizer fieldList = new StringTokenizer(
            getFieldList(), ",");

// lav string bufferen til at holde resulterende liste
        StringBuffer newList = new StringBuffer();
        boolean first = true;

        while (fieldList.hasMoreTokens())
        {
            String field = fieldList.nextToken();

            if (!first) newList.append(',');
            first = false;
            newList.append(tableName);
            newList.append('.');
            newList.append(field);
            newList.append(" as ");
            newList.append(field);
        }

        return newList.toString();
    }

/** Laver en insert funktion der bliver brugt i en PreparedStatement */
    public abstract String getInsertStatement();

/** Gemmer dette objekt's data i  PreparedStatement'en returneret af
*  prepareInsertStatement. */
    public abstract void prepareInsertStatement(PreparedStatement s)
        throws SQLException;

/** opdaterer database rækken,som indeholder dette objekt */
    public int update(Connection conn)
        throws SQLException
    {
        PreparedStatement s = null;

        try
        {
            s = conn.prepareStatement(getUpdateStatement());

            prepareUpdateStatement(s);

            return s.executeUpdate();
        }
        finally
        {
            if (s != null)
            {
                try { s.close(); } catch (Exception ignore) {}
            }
        }
    }

    public abstract String getUpdateStatement();
    public abstract void prepareUpdateStatement(PreparedStatement s)
        throws SQLException;

/** Fjerner dette objekt fra  databasen */
    public int delete(Connection conn)
        throws SQLException
    {
        PreparedStatement s = null;

        try
        {
            s = conn.prepareStatement(getDeleteStatement());

            prepareDeleteStatement(s);

            return s.executeUpdate();
        }
        finally
        {
            if (s != null)
            {
                try { s.close(); } catch (Exception ignore) {}
            }
        }
    }

/** Returnerer sekvensnummeret, som bliver brugt til at indsætte dette objekt. Denne metode
*  er meget database-afhægig. denne version er gearet hen imod
*  mySQL databasen.
*/
    public int getSequenceNumber(Connection conn)
        throws SQLException
    {
        Statement s = null;

        try
        {
            s = conn.createStatement();

            ResultSet results = s.executeQuery(
                "select last_insert_id()");

            if (results.next())
            {
                return results.getInt(1);
            }
            else
            {
                throw new SQLException(
                    "Unable to generate sequence number");
            }

        }
        finally
        {
            if (s != null)
            {
                try { s.close(); } catch (Exception ignore) {}
            }
        }
    }

    public abstract String getDeleteStatement();
    public abstract void prepareDeleteStatement(PreparedStatement s)
        throws SQLException;

    public abstract String getTableName();
    public abstract DBHandler createInstance(ResultSet results)
        throws SQLException;

    public String getSequenceGenerator() { return null; }
}


en vare klasse som extender handleren:
package usingjsp.Butik;
import usingjsp.Butik.*;
import java.sql.*;

/** A data object representing a bruger in the problem reporting
*  system.
*/
public class Vare extends DBHandler implements java.io.Serializable
{
    public String Varenr;
    public int Pris;
    public String Beskrivelse;
    public int Maengde;
    public int OrdreEnhed;
    public String Bruger;
    public String Brugernavn;
    public String Password;

    public Vare()
    {
    }

    public Vare(ResultSet results) throws SQLException
    {
        Brugernavn = results.getString("Brugernavn");
        Bruger = results.getString("Bruger");
        Password = results.getString("Password");
        Varenr = results.getString("Varenr");
        Pris = results.getInt("Pris");
        Beskrivelse = results.getString("Beskrivelse");
        Maengde = results.getInt("Maengde");
        OrdreEnhed = results.getInt("OrdreEnhed");
       
    }

    public String getBrugernavn() { return Brugernavn; }
    public void setBrugernavn(String aBrugernavn)
        { Brugernavn= aBrugernavn; }
       
    public String getbruger() { return Bruger; }
    public void setbruger(String abruger)
        { Bruger = abruger; }   

    public String getPassword() { return Password; }
    public void setPassword(String aPassword)
        { Password = aPassword; }
       
    public String getVarenr(){return Varenr;}
    public void setVarenr(String aVarenr){ Varenr = aVarenr;}
   
    public int getpris(){return Pris;}
    public void setpris(int aPris){ Pris  = aPris ;}

    public String getbeskrivelse(){return Beskrivelse;}
    public void setbeskrivelse( String aBeskrivelse){ Beskrivelse = aBeskrivelse;}

    public int getMaengde(){return Maengde;}
    public void setMaengde(int aMaengde){ Maengde = aMaengde;}   
   
    public int getOrdreEnhed(){return OrdreEnhed;}
    public void setOrdreEnhed(int aOrdreEnhed){ OrdreEnhed = aOrdreEnhed;} 
   
       
    public String getTableName() { return "indkoebst"; }

    public DBHandler createInstance(ResultSet results)
        throws SQLException
    {
        return new Vare(results);
    }

    public String getFieldList() { return "Brugernavn,Bruger,Password,Varenr"+
                                    ",Pris,Beskrivelse,Maengde"; }

    public String getInsertStatement()
    {
    return "insert into indkoebst (Brugernavn,Bruger,Password"+
            ",Varenr,Pris,Beskrivelse,Maengde) "+
            " values (?,?,?,?,?,?,?)";
    }

    public void prepareInsertStatement(PreparedStatement s)
        throws SQLException
    {
        s.setString(1, Brugernavn);
        s.setString(2, Bruger);
        s.setString(3, Password);
        s.setString(4, Varenr);
        s.setInt(5, Pris);
        s.setString(6, Beskrivelse);
        s.setInt(7,Maengde );
    }

    public String getUpdateStatement()
    {
        return "update indkoebst set Brugernavn=?, Bruger=?,Varenr=?"+
                    ",Pris=?,Beskrivelse=?,Maengde=? "+
            " where Password=?";
    }

    public void prepareUpdateStatement(PreparedStatement s)
        throws SQLException
    {
      s.setString(1, Brugernavn);
        s.setString(2, Bruger);
        s.setString(3, Password);
        s.setString(4, Varenr);
        s.setInt(5, Pris);
        s.setString(6, Beskrivelse);
        s.setInt(7,Maengde );
    }

    public String getDeleteStatement()
    {
        return "delete from indkoebst where Brugernavn=?";
    }

    public void prepareDeleteStatement(PreparedStatement s)
        throws SQLException
    {
        s.setString(1, Brugernavn);
    }
}


En en indkøbskurvs klasse kaldet vogn1:
package usingjsp.Butik;

import java.util.*;
import java.io.*;

public class Vogn1 implements java.io.Serializable
{

    protected Vector Varer;

    public Vogn1()
    {
      Varer = new Vector();
    }


    public Vector getVarer()
    {
      return(Vector) Varer.clone();
    }

    public void addVare(Vare newVare)
    {
        Varer.addElement(newVare);
    }

    public void removeItem(int VareIndex)
    {
      Varer.removeElementAt(VareIndex);
    }

og en completeOrder klasse:
package usingjsp.Butik;

public class CompleteOrder implements java.io.Serializable {
   


    private String Varenr = "";
    private int Pris = 00;
    private String Beskrivelse= "";
    private int Maengde= 00;
    private int OrdreEnhed=00;
    private DBHandler db = new DBHandler();
       
   
    public void udpakObjekt(Vare vare) {
       
    Varenr = vare.getVarenr();   
    Pris = vare.getpris();
    Beskrivelse = vare.getbeskrivelse();
    Maengde = vare.getMaengde();
    OrdreEnhed = vare.getOrdreEnhed();
   
       
       
        danSqlString();       
       
    }
   
   
   
    public void danSqlString () {
       
        String sqlString = "insert into vare values ('"+Navn+"',"+"'"+Pris+"','"Beskrivelse"')";
       
       
        db.open("org.gjt.mm.mysql.Driver","databaseNavn","","");       
        db.doQuery(sqlString);
       
       
           
    }
   
   


}




Jeg har også en login-side og en servlet der tjekker login-siden:
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
<HTML>
<BODY bgcolor='#ffffff'>
<H1>Web Wheels login</H1>
<FORM action='usingjsp.Butik.LoginServlet' method="post">
<TABLE>
<TR>
<TD>Brugernavn:<TD><INPUT type="text" name="brugernavn" >
<TD>Password:<TD><INPUT type="password" name="password" >
</TABLE>
<p>
<INPUT type="submit" value='Login!'>
</FORM>
</BODY>
</HTML>
-----------------------
/*
* LoginServlet.java
*
* Created on 28. maj 2002, 16:20
*/

package usingjsp.Butik;         

import javax.servlet.*;
import javax.servlet.http.*;
import usingjsp.Butik.*;
import java.sql.*;
import java.util.*;

/**
*
* @author 
* @version
*/
public class LoginServlet extends HttpServlet
{
    public void service(HttpServletRequest request, HttpServletResponse response)
        throws java.io.IOException, ServletException
    {
   
    String Brugernavn = request.getParameter("Brugernavn");
        String Password = request.getParameter("Password");

        if (Brugernavn == null)
        {
            request.setAttribute("rejectReason",
                "Der er intet Brugernavn");

            rejectLogin(request,response);

            return;
        }

        if (Password == null)
        {
            request.setAttribute("rejectReason",
                "Der er intet password ");
           
          rejectLogin(request, response);

            return;
        }


        ServletContext context = getServletContext();
       
        IConnectionPool pool = (IConnectionPool) context.getAttribute(
            "connectionPool");
       
        if (pool == null)
        {
            synchronized(context)
            {
                pool = (IConnectionPool) context.getAttribute(
                    "connectionPool");
                if (pool == null)
                {
                    try {
                        Class.forName("jdbc.odbc.JdbcDriver").
                            newInstance();
                    } catch (Exception exc) {
                        getServletContext().log(
                            "Error loading JDBC driver", exc);
                    }
                   
                    pool = new SimpleConnectionPool(
                        "jdbc:odbc:Indkoeb",
                        "", "");
                    context.setAttribute("connectionPool", pool);
                }
            }
        }
       
        Connection conn = null;

        try
        {
            conn = pool.getConnection();
           
            Vare devQuery = new Vare();
           
            Vector v = devQuery.getAll(conn, "Brugernavn='"+
                Brugernavn.toLowerCase()+"'");
           
            if (v.size() != 1)
            {
                request.setAttribute("rejectReason",
                    "Invalid Brugernavn");

                rejectLogin(request, response);

                return;
            }

            Vare va = (Vare) v.elementAt(0);
           
              if (!va.Password.equals(Password))
            {
                request.setAttribute("rejectReason",
                    "Invalid password");
               
                rejectLogin(request,response);


                return;
            }

            HttpSession session = request.getSession();

            session.setAttribute("Brugernavn", Brugernavn);
            session.setAttribute("bruger", va.getbruger());
           
            RequestDispatcher dispather = context.getRequestDispatcher("/usingjsp/Butik/MuligFunktionerJSP.jsp");

          dispather.forward(request, response);
           
           
        }
        catch (SQLException exc)
        {
            getServletContext().log(
                "A database error occurred while validating a user",
                exc);

            request.setAttribute("rejectReason",
                "A database error has occurred");

                rejectLogin(request,response);

            return;
        }
        finally
        {
            if (conn != null)
            {
                try
                {
                    pool.releaseConnection(conn);
                }
                catch (Exception ignore)
                {
                }
            }
        }
    }
   
    public void  rejectLogin(HttpServletRequest request,HttpServletResponse response)
    throws java.io.IOException, ServletException
    {
       
    RequestDispatcher dispather = getServletContext().getRequestDispatcher("/usingjsp/Butik/MuligFunktionerJSP.jsp");
   
      dispather.forward(request, response);
    } 

}   

   
   
 
Så har jeg min IConnectionPool og min simpelconnectionPool:
package usingjsp.Butik;
import java.sql.*;


public interface IConnectionPool
{
    public Connection getConnection() throws SQLException;
    public void releaseConnection(Connection conn) throws SQLException;
}

-------------------------------------
package usingjsp.Butik;
import java.sql.*;
import java.util.*;

/** A simple connection pool that allocates new connections where
*  there are no more connections.
*/
public class SimpleConnectionPool implements IConnectionPool
{
    protected Stack pool;
    protected String connectionURL;
    protected String Brugernavn;
    protected String password;

/** Creates a new connection pool that creates connections using
*  the specified URL, user name and password */
    public SimpleConnectionPool(String aConnectionURL,
        String abrugernavn, String aPassword)
    {
        connectionURL = aConnectionURL;
        Brugernavn = abrugernavn;
        password = aPassword;
        pool = new Stack();
    }

/** Gets a connection from the pool or creates one if the pool is empty */
    public synchronized Connection getConnection()
        throws SQLException
    {
// If the pool isn't empty, grab a connection from it
        if (!pool.empty())
        {
            return (Connection) pool.pop();
        }
        else
        {
// Otherwise, create a new connection
            return DriverManager.getConnection(connectionURL,
                Brugernavn, password);
        }
    }

/** Returns a connection to the pool */
    public synchronized void releaseConnection(Connection conn)
        throws SQLException
    {
        pool.push(conn);
    }
}


og så en hel masse mere.
Det spørgsmål jeg har er, for det første:

1. Hvordan får jeg sat min IConnectionPool ind i min CompleteOrder klasse, så den bruger den i stedet for den database der står der?
Avatar billede soelvpil Nybegynder
22. juli 2002 - 17:58 #1
Jeg ville lave følgende klasse

public class ConnectionManager {
  private static IConnectionPool pool;

  static {
    Class.forName( navn på din dbdriver her );
    pool = new SimpleConnectionPool( indtast parametre her );
  }

  public static Connection getConnection() throws SQLException {
    return pool.getConnection();
  }

  public static void releaseConnection(Connection con) throws SQLException {
    pool.releaseConnection(con);
  }
}

Når du åbner en connection, kan du så erstatte

Class.forName(jkhkhkjkh);
DriverManager.getConnection(kjhkjhkhhk);

med ConnectionManager.getConnection();

Og så skal du erstatte alle steder der står conn.close()
med ConnectionManager.releaseConnection();

Du åbner herved at oplysninger om driver, databaseurl o.s.v kun står et sted i koden.

p.s. De fleste kommercielle connectionPools returnerer ikke en Connection fra databasen, men har i stedet en klasse, der ligner en connection med en lille forskel, at når man lukker den, bliver forbindelsen til databasen ikke lukket. I stedet kaldes en releaseConnection(); Gevinsten ved det er, at man blot kalder conn.close() uanset om man bruger en connectionpool eller ej. Det virker dog ikke med denne her connectionPool.
Avatar billede snowflake7 Nybegynder
22. juli 2002 - 18:22 #2
skal jeg så slette noget i mine sider hvis jeg laver såden en klasse bortset fra Class.forName(jkhkhkjkh);
DriverManager.getConnection(kjhkjhkhhk);
conn.close()
som jeg ikke havde stående i forvejen?
Avatar billede snowflake7 Nybegynder
22. juli 2002 - 18:25 #3
Kommer fra LogInServlet:

IConnectionPool pool = (IConnectionPool) context.getAttribute(
            "connectionPool");
       
        if (pool == null)
        {
            synchronized(context)
            {
                pool = (IConnectionPool) context.getAttribute(
                    "connectionPool");
                if (pool == null)
                {
                    try {
                        Class.forName("jdbc.odbc.JdbcDriver").
                            newInstance();
                    } catch (Exception exc) {
                        getServletContext().log(
                            "Error loading JDBC driver", exc);
                    }
                   
                    pool = new SimpleConnectionPool(
                        "jdbc:odbc:Indkoeb",
                        "", "");
                    context.setAttribute("connectionPool", pool);

Skal jeg f.eks. slettet noget her?
Avatar billede soelvpil Nybegynder
22. juli 2002 - 19:23 #4
Du kan enten slette hele den kodestump du har sendt med, og bruge min ConnectionManager.

Alternativt kan du bruge det kode du har nu, men så har du nærmest ikke brug for ConnectionManageren. Det kræver dog, at de klasser, der skal kalder databasen kan få fingre i connectionPoolen. D.v.s. at en masse af dine metodekald skal sende ConnectionPoolen med (eller evt blot servletContexten, så de selv kan slå poolen op). Det betyder altså at mange af dine metoder skal have ekstra parametre.

Så jeg ville nok vælge at fjerne koden, og bruge COnnectionManageren i stedet.

Så kan du jo blot sige
ConnectionManager.getConnection();

i stedet for

((IConnectionPool)context.getAttribute("connectionPool")).getConnection();
Avatar billede soelvpil Nybegynder
31. juli 2002 - 22:02 #5
Der blev lidt stille...

har du løst problemet?
Avatar billede soelvpil Nybegynder
21. september 2002 - 08:51 #6
Hullu bullu: hvor er du henne?

Lukker du spm og deler et par points ud, eller mener du ikke folk fortjener belønning or indsatsen eller hvad?
Avatar billede snowflake7 Nybegynder
27. september 2002 - 22:39 #7
undskyld ventetiden men jeg har været ude at rejse!!!!
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

IT-JOB

Capgemini Danmark A/S

Java Engineer

Rambøll Management Consulting

Senior Software Engineer

Forsvarsministeriets Materiel- og Indkøbsstyrelse

Solution Manager til Cyberdivisionen