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; }
}
det her er DBHandler klassen er det ikke min insert-metode i den du mener??
LIGE et andet spørgsmål: Hvordan får jeg denne side neden under til at ligge mine ordre i min database frem for i en fil?????
Det er første side brugeren kommer ind på:
<!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>
Til at kontrollere HTML-side og åbne adgang til databasen har jeg denne servlet:
/*
* 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);
}
}
Jeg har også nogle klasser der understøtter det hele:
Vare:
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);
}
}
Spedition:
/*
* SpeditionClass.java
*
* Created on 28. april 2002, 20:51
*/
package usingjsp.Butik;
import usingjsp.Butik.*;
import java.sql.*;
import java.io.*;
import java.util.*;
/**
*
* @author
* @version
*/
public class SpeditionClass extends DBHandler {
public int Spedition_id;
public String Navn;
public String Adresse1;
public String Adresse2;
public String City;
public String State;
public String Country;
public String PostalCode;
public String Email;
/** Creates new SpeditionClass */
public SpeditionClass() {
}
public SpeditionClass(ResultSet results)
throws SQLException
{
Spedition_id = results.getInt("Spedition_id");
Navn = results.getString("Navn");
Adresse1 = results.getString("Adresse1");
Adresse2 = results.getString("Adresse2");
City = results.getString("City");
State = results.getString("State");
Country = results.getString("Country");
PostalCode = results.getString("PostalCode");
Email = results.getString("Email");
}
public int getSpedition_id(){return Spedition_id;}
public void setSpedition_id( int aSpedition_id){Spedition_id = aSpedition_id;}
public String getNavn() {return Navn; }
public void setNavn(String aNavn){ Navn = aNavn;}
public String getAdresse1() {return Adresse1; }
public void setAdresse1(String aAdresse1){ Adresse1 = aAdresse1;}
public String getAdresse2() {return Adresse2; }
public void setAdresse2(String aAdresse2){ Adresse2 = aAdresse2;}
public String getCity() {return City; }
public void setCity(String aCity){ City = aCity;}
public String getState() {return State; }
public void setState(String aState){ State = aState;}
public String getCountry() {return Country; }
public void setCountry(String aCountry){ Country = aCountry;}
public String getPostalCode() {return PostalCode; }
public void setPostalCode(String aPostalCode){ PostalCode = aPostalCode;}
public String getEmail() {return Email; }
public void setEmail(String aEmail){ Email = aEmail;}
public String getTableName() {return "Spedition2";}
public DBHandler createInstance(ResultSet results)
throws SQLException
{
return new SpeditionClass(results);
}
public int insert(Connection conn)
throws SQLException
{
int numRows = super.insert(conn);
Spedition_id = getSequenceNumber(conn);
return numRows;
}
public String getFieldList()
{
return "Spedition_id,Navn, Adresse1, Adresse2, City, State,Country, PostalCode, Email";
}
public String getInsertStatement()
{
return "insert i spedition (Spedition_id,Navn,"+
"Adresse1, Adresse2, City, State,Country, PostalCode, Email)values (?,?,?,?,?,?,?,?,?,?)";
}
public void prepareInsertStatement(PreparedStatement s) throws SQLException
{
s.setInt(1,0);
s.setString(2,Navn);
s.setString(3,Adresse1);
s.setString(4,Adresse2);
s.setString(5,City);
s.setString(6,State);
s.setString(7,Country);
s.setString(8,PostalCode);
s.setString(9, Email);
}
public String getUpdateStatement()
{
return "Opdater Speditionsoplysninger set Spedition_id=?, "+
"Navn=?,Adresse1=?,Adressse2=?,City=?,State=?,"+
"Country=?,PostalCode=?,Email=? where Spedition_id =?";
}
public void prepareUpdateStatement(PreparedStatement s)
throws SQLException
{
try
{
s.setInt(1,0);
s.setString(2,Navn);
s.setString(3,Adresse1);
s.setString(4,Adresse2);
s.setString(5,City);
s.setString(6,State);
s.setString(7,Country);
s.setString(8,PostalCode);
s.setString(9, Email);
}catch (Exception exc){
exc.printStackTrace();
}
}
public String getDeleteStatement()
{
return "Fjern from Spedition where Spedition_id=?";
}
public void prepareDeleteStatement(PreparedStatement s) throws SQLException
{
try
{
s.setInt(1,Spedition_id);
}catch (Exception exc){
exc.printStackTrace();
}
}
public String getSequenceGenerator()
{
return "Spedition_id_gen";
}
}
o.s.v alle extender de 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; }
}