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?
