Avatar billede rasmuslh Nybegynder
26. maj 2004 - 19:27 Der er 16 kommentarer og
5 løsninger

Static spg?

Hejsa

Vi er to personer der snart skal aflevere en webapplikation der er lavet vha. servletter.

Vi har et spørgsmål vedr. static som vi endnu ikke helt har fattet. Vi har følgende abstract klasse (MainServlet) der blive extended af en masse servletter. I den findes en databaseforbindelse og en række statements.

import java.io.*;
import javax.servlet.*;
import javax.servlet.http.*;
import java.sql.*;


public abstract class MainServlet extends HttpServlet{


/*   
*    MainServlet extender HttpServlet. Den overrider init() og destroy(), og er superklasse til alle vores
*    andre servletter.
*    MainServlet indeholder en forbindelse til databasen, db, og fire statements.
*
*/


public Connection  db;            // forbindelse til databasen
public Statement    st;            // statement til queries
public Statement    st1;            // statement til queries
public Statement    st2;            // statement til queries
public Statement    st3;            // statement til queries
 

      // Open connection to the database when the servlet object is created

    public void init(ServletConfig config) {
          try{
            super.init(config);
            db = DBConnect.dbConnect();
            st = db.createStatement();
            st1 = db.createStatement();
            st2 = db.createStatement();
            st3 = db.createStatement();
           
        } //end try
   
        catch (SQLException e) {
            System.out.println("Database error: " + e);
        }    //end catch
   
        catch (ServletException e){
            System.out.println("Servlet error: " + e);
        }    //end catch
     
    } //end init

    // Close the connection to the database when the servlet object is destroyed
    public void destroy() {
        try {
              st.close();
            st1.close();
            st2.close();
            st3.close();
            db.close();
        }
       
        catch (SQLException e) {
              System.out.println("Database error: " + e);
        }
      }

} // MainServlet

Når de er erklæret static får hver Servletklasse der arver fra MainServlet så deres egen databseforbindelse og statements eller deler de den samme forbindelse?

En grundig forklaring af static vil virkelig blive værdsat da vi ikke helt fatter betydningen af den.

På forhånd tak.
Rasmus
Avatar billede bumle90 Nybegynder
26. maj 2004 - 19:38 #1
Så vidt jeg kan se bruger i ikke static i jeres program :)
Men static vil sige at der kun bliver oprettet 1 instans af variablen i hukommelsen. Dvs. hvis der er flere forskellige objekter af typen a der har en static variabel vil det sige at de alle referer til den samme variabel. Dette kan altså gi problemer med læsning/skrivning hvis et objekt skriver mens et andet læser. Altså race condition.
I vil gerne have en statisk databaseforbindelse. Det er måske ikke den smarteste ide eftersom det kan blive lidt af en flaskehals når alle objekterne skal bruge den. lad os sige der er 100 objekter der skal have tilgang til samme database med samme forbindelse. Det kunne godt være et problem.
Håber i kan bruge det :)
Avatar billede arne_v Ekspert
26. maj 2004 - 19:40 #2
static på et felt betyder at alle intanser af klassen deler det samme felt
(hvorimod hver klasse har sin egen forekomst af ikke static felter).

Normalt bliver der kun instantieret en forekomst af en servlet, så forskellen
er ikke stor i dette tilfælde.

Men jeres sub klasser er nød til at bruge synchronized på connection
og statements da de ellers ikke er thread safe.
Avatar billede rasmuslh Nybegynder
26. maj 2004 - 19:55 #3
UPS!!!!!!!!!!!!!!!

Nu lagde jeg selvfølgelig den version op der ikke brugte static her er den!

public static Connection  db;            // forbindelse til databasen
public static Statement    st;            // statement til queries
public static Statement    st1;            // statement til queries
public static Statement    st2;            // statement til queries
public static Statement    st3;            // statement til queries
Avatar billede bumle90 Nybegynder
26. maj 2004 - 19:59 #4
okay, men som tidligere nævnt tror jeg ikke der er nogen særlig grund til at bruge static i jeres tilfælde.
normalt er det også pænere kun at oprette 1 statement til queries, som så genbruges. Nogle gange er man dog nødt til at have flere :)
Avatar billede rasmuslh Nybegynder
26. maj 2004 - 20:02 #5
Hmmhh, det er ikke så godt! Vi skal aflevere fredag og hvis vi fjerner static i MainServlet crasher alle vores servletter.

Når de static er der altså kun 4 statements og en forbindelse som de alle deler?
Avatar billede arne_v Ekspert
26. maj 2004 - 20:29 #6
Crasher med hvilken fejl ?

Må vi se et eksempel på en sub klasse ?
Avatar billede rasmuslh Nybegynder
26. maj 2004 - 20:32 #7
Her er en af klasserne der extender den:

import java.io.*;
import javax.servlet.*;
import javax.servlet.http.*;
import java.sql.*;


public class RequestServlet extends MainServlet {


/*    
*    RequestServlet er en subklasse til MainServlet. RequestServlet indhenter oplysninger i databasen om
*    hvilke film der vises, i hvilken biograf, sal, dato og tidspunkt.
*
*    Man kommer til RequestServlet fra index.htm eller ManageServlet
*
*/


    public void doPost(HttpServletRequest req, HttpServletResponse res)
        throws ServletException, IOException {
 
        Presentation present = new Presentation("Filmoversigt", "http://www.itu.dk/people/rlh/");
       
        String dato1 = req.getParameter("dato");
        String bio = req.getParameter("biograf"); 
        int bio1 = Integer.parseInt(bio);
        String Medarbejder_ID = req.getParameter("Medarbejder_ID");
        String Medarbejder_email = req.getParameter("Medarbejder_email");
        String Admin = req.getParameter("Admin");     
        String source = req.getParameter("source");
       
        res.setContentType("text/html");
        ServletOutputStream out = res.getOutputStream();
       
        try {
            int pris = 0;
            int Forestilling_ID = 0;   
            int sal = 0;   
            String title = "";
            String klokkeslæt = "";
            String query = "";
            String dato = "";   
            String bionavn = "";
           
            if ((bio1 == 0) && (dato1.equals("Ikke valgt"))) {
                query = Queries.query1();
            } // der er ikke indtastet oplysninger - finder forestillinger der matcher kriterier


            else if (dato1.equals("Ikke valgt")) {
                query = Queries.query2(bio1);
            } // ingen dato valgt - finder forestillinger der matcher kriterier   
           
           
            else if (bio1 == 0) {
                  query = Queries.query3(dato1);
            } // ingen biograf valgt - finder forestillinger der matcher kriterier
           
           
            else {
                  query = Queries.query4(dato1, bio1);
            } //både dato og biograf valgt - finder forestillinger der matcher kriterier
                 
              st.execute(query);
              ResultSet rs = st.getResultSet();
       
            if (!rs.first()) {
                if((source.equals("Forestilling_delete")) || (source.equals("Med_Kunde_bestil"))) {
                    res.sendRedirect("http://servlet.it-c.dk:8080/user/herdigudb/servlet/MessageServlet?source=IngenMatchManage&Medarbejder_email="
                    +Medarbejder_email+"&Admin="+Admin+"&Bio_ID="+bio1);
                    return;
                } // der var ikke nogen forestillinger der matchede de kriterier for en forestilling som en medarbejder havde valgt
               
                else {
                    res.sendRedirect("http://servlet.it-c.dk:8080/user/herdigudb/servlet/MessageServlet?source=IngenForestilling");
                    return;
                } // der var ikke nogen forestillinger der matchede de kriterier for en forestilling som en kunde havde valgt   
           
            } // end if ... der blev ikke fundet et match i databasen
                           
            else {

                  out.println(present.makeHeader());
                  out.println("<table border=1><br/>");
                  out.println("<tr><th>Titel</th><th>Klokkeslæt</th><th>Sal</th>");
                  out.println("<th>Dato</th><th>Biograf</th><th>Pris</th><th>Bestilling</th></tr>");
               
                rs.beforeFirst(); // flytter cursoren tilbage så det første rowset også tages med
       
                  while (rs.next()) {
                    title = rs.getString("Titel");
                    klokkeslæt = rs.getString("Klokkeslæt");
                      sal = rs.getInt("Sal.Sal_ID");
                    dato = rs.getString("Dato");
                    bionavn = rs.getString("Bio_navn");
                    pris = rs.getInt("Pris");
                    Forestilling_ID = rs.getInt("Forestilling.Forestilling_ID");;
                    out.print("<tr>");
                    out.println("<td>" + title + "</td>" + "<td>" + klokkeslæt + "</td>" + "<td>" + sal + "</td>");
                      out.println("<td>" + dato + "</td><td>" + bionavn + "</td><td>" + pris + "</td>");
                   
                   
                    if(source.equals("Med_Kunde_Bestil")){
                        out.println("<td><form action='http://servlet.it-c.dk:8080/user/herdigudb/servlet/OrderServlet' method='post'>");
                        out.println("<input type='hidden' value="+ Forestilling_ID +" name='Forestilling_ID'/>");
                        out.println("<input type='hidden' value='Med_Kunde_Bestil' name='source'/>");
                        out.println("<input type='hidden' value='"+sal+"' name='Sal_ID'/>");
                        out.println("<input type='hidden' value='"+bio1+"' name='Bio_ID'/>");
                        out.println("<input type='hidden' value='"+Medarbejder_email+"' name='Medarbejder_email'/>");
                        out.println("<input type='hidden' value='"+Admin+"' name='Admin'/>");
                        out.println("<input type='submit' value='Bestil billet'/></form></td>");
                    } // Medarbejder bestiller billet
               
                   
                    else if(source.equals("Forestilling_delete")){
                        out.println("<td><form action='http://servlet.it-c.dk:8080/user/herdigudb/servlet/ClientTicketServlet' method='post'>");
                        out.println("<input type='hidden' value="+ Forestilling_ID +" name='Forestilling_ID'/>");
                        out.println("<input type='hidden' value='Forestilling_delete' name='source'/>");
                        out.println("<input type='hidden' value='"+bio1+"' name='Bio_ID'/>");
                        out.println("<input type='hidden' value='"+Medarbejder_email+"' name='Medarbejder_email'/>");
                        out.println("<input type='hidden' value='"+Admin+"' name='Admin'/>");
                        out.println("<input type='submit' value='Slet bestillinger'/></form></td>");
                      } //Hvis der skal slettes bestillinger til en hel forestilling (ikke de solgte billetter)
               
                   
                    else if(source.equals("Salg")){
                        out.println("<td><form action='http://servlet.it-c.dk:8080/user/herdigudb/servlet/OrderServlet' method='post'>");
                        out.println("<input type='hidden' value='"+ Forestilling_ID +"' name='Forestilling_ID'/>");
                        out.println("<input type='hidden' value='"+sal+"' name='Sal_ID'/>");
                        out.println("<input type='hidden' value='"+Medarbejder_ID+"' name='Medarbejder_ID'/>");
                        out.println("<input type='hidden' value='"+bio1+"' name='Bio_ID'/>");
                        out.println("<input type='hidden' value='"+Medarbejder_email+"' name='Medarbejder_email'/>");
                        out.println("<input type='hidden' value='"+Admin+"' name='Admin'/>");
                        out.println("<input type='hidden' value='Salg' name='source'/>");
                          out.println("<input type='submit' value='Sælg billet'/></form></td>");                                 
                    } //Hvis der skal sælges en ikke bestilt billet
                   
                   
                    else {
                        out.println("<td><form action='http://servlet.it-c.dk:8080/user/herdigudb/servlet/OrderServlet' method='post'>");
                        out.println("<input type='hidden' value='"+ Forestilling_ID +"' name='Forestilling_ID'/>");
                        out.println("<input type='hidden' value='"+sal+"' name='Sal_ID'/>");
                        out.println("<input type='hidden' value='Bestil' name='source'/>");
                          out.println("<input type='submit' value='Bestil billet'/></form></td>");
                      } //Hvis en kunde skal foretage en bestilling
               
                    out.print("</tr>");
                 
                  } //end while - der henter henter forestillinger

              out.println("</table>");
              out.println(present.makeFooter());
       
            } //end else - forestillingerne er tegnet op
       
        } // end try
   
        catch (SQLException e) {
           
            if((source.equals("Forestilling_delete")) || (source.equals("Med_Kunde_bestil"))) {
                res.sendRedirect("http://servlet.it-c.dk:8080/user/herdigudb/servlet/MessageServlet?source=MedSQLException&Medarbejder_email="
                +Medarbejder_email+"&Admin="+Admin+"&Bio_ID="+bio1);
                return;
            } // SQL-fejl så medarbejderen sendes tilbage til ManageServlet
           
            else {
                res.sendRedirect("http://servlet.it-c.dk:8080/user/herdigudb/servlet/MessageServlet?source=SQLException");
                return;
            } // SQL-fejl så kunden sendes tilbage til ManageServlet
        } //end catch
   
    } //end doPost

}// end RequestServlet
Avatar billede rasmuslh Nybegynder
26. maj 2004 - 20:35 #8
Den her får jeg smidt i nakken når jeg fjerner static:

javax.servlet.ServletException: Servlet execution threw an exception
    at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:269)
    at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:193)
    at org.apache.catalina.core.StandardWrapperValve.invoke(StandardWrapperValve.java:260)
    at org.apache.catalina.core.StandardPipeline$StandardPipelineValveContext.invokeNext(StandardPipeline.java:643)
    at org.apache.catalina.core.StandardPipeline.invoke(StandardPipeline.java:480)
    at org.apache.catalina.core.ContainerBase.invoke(ContainerBase.java:995)
    at org.apache.catalina.core.StandardContextValve.invoke(StandardContextValve.java:191)
    at org.apache.catalina.core.StandardPipeline$StandardPipelineValveContext.invokeNext(StandardPipeline.java:643)
    at org.apache.catalina.core.StandardPipeline.invoke(StandardPipeline.java:480)
    at org.apache.catalina.core.ContainerBase.invoke(ContainerBase.java:995)
    at org.apache.catalina.core.StandardContext.invoke(StandardContext.java:2396)
    at org.apache.catalina.core.StandardHostValve.invoke(StandardHostValve.java:180)
    at org.apache.catalina.core.StandardPipeline$StandardPipelineValveContext.invokeNext(StandardPipeline.java:643)
    at org.apache.catalina.valves.ErrorDispatcherValve.invoke(ErrorDispatcherValve.java:170)
    at org.apache.catalina.core.StandardPipeline$StandardPipelineValveContext.invokeNext(StandardPipeline.java:641)
    at org.apache.catalina.valves.ErrorReportValve.invoke(ErrorReportValve.java:172)
    at org.apache.catalina.core.StandardPipeline$StandardPipelineValveContext.invokeNext(StandardPipeline.java:641)
    at org.apache.catalina.core.StandardPipeline.invoke(StandardPipeline.java:480)
    at org.apache.catalina.core.ContainerBase.invoke(ContainerBase.java:995)
    at org.apache.catalina.core.StandardEngineValve.invoke(StandardEngineValve.java:174)
    at org.apache.catalina.core.StandardPipeline$StandardPipelineValveContext.invokeNext(StandardPipeline.java:643)
    at org.apache.catalina.core.StandardPipeline.invoke(StandardPipeline.java:480)
    at org.apache.catalina.core.ContainerBase.invoke(ContainerBase.java:995)
    at org.apache.coyote.tomcat4.CoyoteAdapter.service(CoyoteAdapter.java:223)
    at org.apache.coyote.http11.Http11Processor.process(Http11Processor.java:405)
    at org.apache.coyote.http11.Http11Protocol$Http11ConnectionHandler.processConnection(Http11Protocol.java:380)
    at org.apache.tomcat.util.net.TcpWorkerThread.runIt(PoolTcpEndpoint.java:508)
    at org.apache.tomcat.util.threads.ThreadPool$ControlRunnable.run(ThreadPool.java:533)
    at java.lang.Thread.run(Thread.java:534)


root cause

java.lang.IncompatibleClassChangeError
    at RequestServlet.doPost(RequestServlet.java:74)
    at javax.servlet.http.HttpServlet.service(HttpServlet.java:760)
    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.apache.catalina.core.StandardWrapperValve.invoke(StandardWrapperValve.java:260)
    at org.apache.catalina.core.StandardPipeline$StandardPipelineValveContext.invokeNext(StandardPipeline.java:643)
    at org.apache.catalina.core.StandardPipeline.invoke(StandardPipeline.java:480)
    at org.apache.catalina.core.ContainerBase.invoke(ContainerBase.java:995)
    at org.apache.catalina.core.StandardContextValve.invoke(StandardContextValve.java:191)
    at org.apache.catalina.core.StandardPipeline$StandardPipelineValveContext.invokeNext(StandardPipeline.java:643)
    at org.apache.catalina.core.StandardPipeline.invoke(StandardPipeline.java:480)
    at org.apache.catalina.core.ContainerBase.invoke(ContainerBase.java:995)
    at org.apache.catalina.core.StandardContext.invoke(StandardContext.java:2396)
    at org.apache.catalina.core.StandardHostValve.invoke(StandardHostValve.java:180)
    at org.apache.catalina.core.StandardPipeline$StandardPipelineValveContext.invokeNext(StandardPipeline.java:643)
    at org.apache.catalina.valves.ErrorDispatcherValve.invoke(ErrorDispatcherValve.java:170)
    at org.apache.catalina.core.StandardPipeline$StandardPipelineValveContext.invokeNext(StandardPipeline.java:641)
    at org.apache.catalina.valves.ErrorReportValve.invoke(ErrorReportValve.java:172)
    at org.apache.catalina.core.StandardPipeline$StandardPipelineValveContext.invokeNext(StandardPipeline.java:641)
    at org.apache.catalina.core.StandardPipeline.invoke(StandardPipeline.java:480)
    at org.apache.catalina.core.ContainerBase.invoke(ContainerBase.java:995)
    at org.apache.catalina.core.StandardEngineValve.invoke(StandardEngineValve.java:174)
    at org.apache.catalina.core.StandardPipeline$StandardPipelineValveContext.invokeNext(StandardPipeline.java:643)
    at org.apache.catalina.core.StandardPipeline.invoke(StandardPipeline.java:480)
    at org.apache.catalina.core.ContainerBase.invoke(ContainerBase.java:995)
    at org.apache.coyote.tomcat4.CoyoteAdapter.service(CoyoteAdapter.java:223)
    at org.apache.coyote.http11.Http11Processor.process(Http11Processor.java:405)
    at org.apache.coyote.http11.Http11Protocol$Http11ConnectionHandler.processConnection(Http11Protocol.java:380)
    at org.apache.tomcat.util.net.TcpWorkerThread.runIt(PoolTcpEndpoint.java:508)
    at org.apache.tomcat.util.threads.ThreadPool$ControlRunnable.run(ThreadPool.java:533)
    at java.lang.Thread.run(Thread.java:534)
Avatar billede arne_v Ekspert
26. maj 2004 - 20:38 #9
Thrown when an incompatible class change has occurred to some class definition. The definition of some class, on which the currently executing method depends, has since changed.
Avatar billede arne_v Ekspert
26. maj 2004 - 20:39 #10
Husker I at compile sub klasserne efter at i har rettet og compilet super klassen ?
Avatar billede rasmuslh Nybegynder
26. maj 2004 - 20:48 #11
Der var jeg lige hurtig nok - jeg skulle lige kopiere "den" forkerte version over igen.

Fejler jeg får er den her:

java.lang.NullPointerException
    at DrawCinemaServlet.drawCinema(DrawCinemaServlet.java:52)
    at OrderServlet.doPost(OrderServlet.java:53)
    at javax.servlet.http.HttpServlet.service(HttpServlet.java:760)
    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.apache.catalina.core.StandardWrapperValve.invoke(StandardWrapperValve.java:260)
    at org.apache.catalina.core.StandardPipeline$StandardPipelineValveContext.invokeNext(StandardPipeline.java:643)
    at org.apache.catalina.core.StandardPipeline.invoke(StandardPipeline.java:480)
    at org.apache.catalina.core.ContainerBase.invoke(ContainerBase.java:995)
    at org.apache.catalina.core.StandardContextValve.invoke(StandardContextValve.java:191)
    at org.apache.catalina.core.StandardPipeline$StandardPipelineValveContext.invokeNext(StandardPipeline.java:643)
    at org.apache.catalina.core.StandardPipeline.invoke(StandardPipeline.java:480)
    at org.apache.catalina.core.ContainerBase.invoke(ContainerBase.java:995)
    at org.apache.catalina.core.StandardContext.invoke(StandardContext.java:2396)
    at org.apache.catalina.core.StandardHostValve.invoke(StandardHostValve.java:180)
    at org.apache.catalina.core.StandardPipeline$StandardPipelineValveContext.invokeNext(StandardPipeline.java:643)
    at org.apache.catalina.valves.ErrorDispatcherValve.invoke(ErrorDispatcherValve.java:170)
    at org.apache.catalina.core.StandardPipeline$StandardPipelineValveContext.invokeNext(StandardPipeline.java:641)
    at org.apache.catalina.valves.ErrorReportValve.invoke(ErrorReportValve.java:172)
    at org.apache.catalina.core.StandardPipeline$StandardPipelineValveContext.invokeNext(StandardPipeline.java:641)
    at org.apache.catalina.core.StandardPipeline.invoke(StandardPipeline.java:480)
    at org.apache.catalina.core.ContainerBase.invoke(ContainerBase.java:995)
    at org.apache.catalina.core.StandardEngineValve.invoke(StandardEngineValve.java:174)
    at org.apache.catalina.core.StandardPipeline$StandardPipelineValveContext.invokeNext(StandardPipeline.java:643)
    at org.apache.catalina.core.StandardPipeline.invoke(StandardPipeline.java:480)
    at org.apache.catalina.core.ContainerBase.invoke(ContainerBase.java:995)
    at org.apache.coyote.tomcat4.CoyoteAdapter.service(CoyoteAdapter.java:223)
    at org.apache.coyote.http11.Http11Processor.process(Http11Processor.java:405)
    at org.apache.coyote.http11.Http11Protocol$Http11ConnectionHandler.processConnection(Http11Protocol.java:380)
    at org.apache.tomcat.util.net.TcpWorkerThread.runIt(PoolTcpEndpoint.java:508)
    at org.apache.tomcat.util.threads.ThreadPool$ControlRunnable.run(ThreadPool.java:533)
    at java.lang.Thread.run(Thread.java:534)

Historien er den at OrderServlet kalder klassen DrawCinemaServlet der tegner en biografsal.

Her er OrderServlet:
import java.io.*;
import javax.servlet.*;
import javax.servlet.http.*;
import java.sql.*;


public class OrderServlet extends MainServlet {


/*
*    OrderServlet er subklasse til MainServlet. OrderServlet tegner biografen op for en given forestilling og giver
*    mulighed for enten som kunde at vælge sæder, indtaste kundeoplysninger og derefter bestille en eller flere
*    billetter, eller som medarbejder at bestille en billet til en kunde, eller vælge og sælge en ikke bestilt billet.
*
*    Man kommer til OrderServlet fra RequestServlet, eller fra PlaceOrderServlet via MessageServlet ved en fejl
*    i en transaktion.
*
*/


    Presentation present = new Presentation("Biografoversigt", "http://www.itu.dk/people/rlh/");

    public void doPost(HttpServletRequest req, HttpServletResponse res)
        throws ServletException, IOException {
   
        String Medarbejder_email = req.getParameter("Medarbejder_email");
        String Admin = req.getParameter("Admin"); 
        String Bio_ID = req.getParameter("Bio_ID");
        String source = req.getParameter("source");
        String forestilling1 = req.getParameter("Forestilling_ID");
        String sal1 = req.getParameter("Sal_ID"); 
        int Forestilling_ID = Integer.parseInt(forestilling1);
        int Sal_ID = Integer.parseInt(sal1);
        String Medarbejder_ID = req.getParameter("Medarbejder_ID"); 
        res.setContentType("text/html");
        ServletOutputStream out = res.getOutputStream();
       
        out.println(present.makeHeader()); 

        DrawCinemaServlet cinema = new DrawCinemaServlet(Forestilling_ID, Sal_ID); // tegner Salen ud fra de angive parametre.
       
        try {
            String bio = cinema.drawCinema();
   
            if(source.equals("Med_Kunde_Bestil")){
                out.println("<form action='http://localhost:8080/servlets/servlet/PlaceOrderServlet' method='post'>"+bio
                +" <br/><br/><table><tr><td>Navn:</td><td><input type='text' name='Kunde_navn1'></td></tr>"
                +"<tr><td>Email:</td><td><input type='text' name='Kunde_email1'></td></tr>"
                +"<tr><td>Password:</td><td><input type='password' name='Kunde_password1'></td></tr>"
                +"<tr><td>Postnummer:</td><td><input type='text' name='Kunde_postnummer1'></td></tr>"
                +"<input type='hidden' name='Forestilling_ID' value='"+Forestilling_ID+"'>"
                +"<input type='hidden' name='Sal_ID' value='"+Sal_ID+"'>"
                +"<input type='hidden' name='Medarbejder_email' value='"+Medarbejder_email+"'/> "
                +"<input type='hidden' name='Admin' value='"+Admin+"'/> "
                +"<input type='hidden' name='Bio_ID' value='"+Bio_ID+"'/> "
                +"<input type='hidden' name='source' value='Med_Kunde_Bestil'></table><br/>"
                +"<input type='submit' value='Send bestilling'/></form>");   
            } //Medarbejder bestiller billet - medarbejder får sine medarbejderparametre med
       
            else if(source.equals("Salg")){
                out.println("<form action='http://localhost:8080/servlets/servlet/PlaceOrderServlet' method='post'>"+bio
                +" <br/><br/><input type='hidden' name='Forestilling_ID' value='"+Forestilling_ID+"'>"
                +"<input type='hidden' name='Medarbejder_ID' value='"+Medarbejder_ID+"'>"
                +"<input type='hidden' name='Sal_ID' value='"+Sal_ID+"'>"
                +"<input type='hidden' name='Medarbejder_email' value='"+Medarbejder_email+"'/> "
                +"<input type='hidden' name='Admin' value='"+Admin+"'/> "
                +"<input type='hidden' name='Bio_ID' value='"+Bio_ID+"'/> "
                +"<input type='hidden' name='source' value='Salg'>"
                +"<input type='submit' value='Sælg billet'/></form>");   
            } //Medarbejder bestiller sælger til kunde - bruger sit Medarbejder_ID som det Kunde_ID billetterne sælges i
       
            else {
                out.println("<form action='http://localhost:8080/servlets/servlet/PlaceOrderServlet' method='post'>"+bio
                +" <br/><br/><table><tr><td>Navn:</td><td><input type='text' name='Kunde_navn1'></td></tr>"
                +"<tr><td>Email:</td><td><input type='text' name='Kunde_email1'></td></tr>"
                +"<tr><td>Password:</td><td><input type='password' name='Kunde_password1'></td></tr>"
                +"<tr><td>Postnummer:</td><td><input type='text' name='Kunde_postnummer1'></td></tr>"
                +"<input type='hidden' name='Forestilling_ID' value='"+Forestilling_ID+"'>"
                +"<input type='hidden' name='Sal_ID' value='"+Sal_ID+"'>"
                +"<input type='hidden' name='source' value='Bestil'></table><br/>"
                +"<input type='submit' value='Send bestilling'/></form>");   
            } //Kunde bestiller billet
       
            out.println(present.makeFooter());
   
        } // end try
       
        catch (SQLException e) {
              res.sendRedirect("http://localhost:8080/servlets/servlet/MessageServlet?source=DBfejl");
              return;
        } // sender til indexsiden
   
    } //end doGet
   
    public void doGet(HttpServletRequest req, HttpServletResponse res)
        throws ServletException, IOException {
       
        doPost(req,res);
    } // håndterer de tilfælde hvor der redicteres til OrderServlet og parametre gives med i URL

} // end OrderServlet

Her er DrawCinema:

import java.io.*;
import javax.servlet.*;
import javax.servlet.http.*;
import java.sql.*;


public class DrawCinemaServlet extends MainServlet {


/*   
*    DrawCinemaServlet indeholder metoden drawCinema() som returnerer en string i form af en html-tabel som
*    forestiller en biografsal for en given forestilling. Den undersøger for hvert sæde om det er solgt, bestilt
*    eller angivet som gangareal. De sæder som er frie bliver tegnet som checkboxe, de andre med forskellige
*    farver og betegnelser.
*
*    Man kommer til DrawCinemaServlet fra OrderServlet.
*
*/


    StringBuffer bio = new StringBuffer(20500);
   
    int Forestilling_ID;
    int Sal_ID;
   
     
      public DrawCinemaServlet (int Forestilling_ID1, int Sal_ID1) {
   
        Forestilling_ID = Forestilling_ID1;
        Sal_ID = Sal_ID1;

    } // bruges i OrderServlet
     
     
      public String drawCinema () throws SQLException {
       

              String query1 = Queries.query11(Forestilling_ID, Sal_ID); // returnerer imnformationen om en given sal til en foretilling
            String query2 = Queries.query12(Sal_ID); //tæller antal af sæder i hver række
       
           
              st.execute(query1);
              ResultSet rs1 = st.getResultSet();
              st1.execute(query2);
              ResultSet rs2 = st1.getResultSet();
           
                     
              int seat = 0;
            int t = 0;
       
            int seatID = 0;
            int seatRow = 0;
            int seatNo = 0;
            int seatPassage = 0;
            int seatSold = 0;
            String seatOrdered = "";
       
           
            while (rs2.next()) {
                  seat = rs2.getInt("COUNT(DISTINCT Sæde_nr)");     // seat svarer til antal sædder på en række +1
              }                                                    //som bruges til at skrive rækkenummeret ud
             
   
            bio.append("<table>");
            bio.append("<tr><td class='laerred' colspan='"+seat+"'>Lærred</td></tr><tr/>"); // tegner lærred i biografen
                   
            while (rs1.next()) { // while kører så længe der er flere rækker i salen
   
           
                if (t == 0) {
                    bio.append("<tr>"); // tilføjer <tr> hver gang en række er kørt igennem
                }
                t++;
                   
                seatID = rs1.getInt("Sæde.Sæde_ID");
                  seatRow = rs1.getInt("Sæde_række");
                  seatNo = rs1.getInt("Sæde_nr");
                  seatPassage = rs1.getInt("Gang");
                  seatOrdered = rs1.getString("Bestilling.Sæde_ID");
                  seatSold = rs1.getInt("Bestilling.Solgt");
             
                  if(seatPassage == 1) {
                      bio.append("<td class='gang'></td>"); // en plads i biografen er reserveret til gang
                  }
                 
                  else if (seatSold == 1) {
                      bio.append("<td class='solgt'>S</td>"); // en plads i biografen er allerede solgt
                  }   
             
                  else if (seatOrdered != null) {
                      bio.append("<td class='reser'>B</td>"); // en plads i biografen er reserveret
                  }
           
                else {
                      bio.append("<td class='fri'><input name=\""+seatID+"\" type=\"checkbox\" /></td>\n");
                  }    // pladsen er fri og checkboksen får sæde_ID som navn. Det bruges senere når der indsættes i bestilling
           
                if (t == seat) {
                    bio.append("<td class='række'>"+seatRow+"</td></tr>"); // skriver rækkenummeret ud
                    t = 0;
                }

              } // end while
           
            bio.append("<tr><td class='solgt'>S</td><td class='signatur' colspan='"+(seat+1)+"'>Solgt</td></tr>"); // signaturforklaring solgt
            bio.append("<tr><td class='reser'>B</td><td class='signatur' colspan='"+(seat+1)+"'>Bestilt</td></tr>"); // signaturforklaring bestilt
            bio.append("</table>"); // slutter biograftabellen ud
           
   
    String bionavn = bio.toString();       
    return bionavn; // returnerer den tegnede biograf f.eks. til OrderServlet
       
    } // end drawCinema
     
} // end DrawCinema
Avatar billede arne_v Ekspert
26. maj 2004 - 21:22 #12
Den null pointer exception hvis de ikke er static kan jeg godt forklare.

I kalder DrawCinemaServlet constructor, men I kalder aldrig init metoden.

Derfor virker det kun hvis connection og statements er static fordi så har
OrderServlet initialiseret dem fordi servlet engine kalder init metoden
efter constructor.

Nemmeste workaround: kald init efter constructor i OrderServlet doPost.

(men jeg er ikke glad for at I kalder en servlet på den måde)
Avatar billede rasmuslh Nybegynder
26. maj 2004 - 21:36 #13
Hvis man fjerner static foran:

public Connection  db;

i MainServlet (den servlet de andre servletter arver fra) virker det hele!


Betyder det så at hver servletinstans der arver fra MainServlet får deres egen forbindelse eller får de hver især en reference til connectionobjektet i dbConnect.

Her er dbConnect den klasse som bruges i mainServlet til at lave forbindelsen:

public class DBConnect{


/*   
*    DbConnect indeholder metoden dbConnect(), som returnerer en connection til vores database.
*    dbConnect() kaldes af MainServlet.
*
*/

   
    final static String USR = "rlh1";
    final static String URL_ = "jdbc:mysql://mysql.it-c.dk/biobook";
    final static String PWD = "rasmus";

    static Connection  db;            // The connection to the database


    public static Connection dbConnect(){
   
        try {
            Class.forName("org.gjt.mm.mysql.Driver");  //loading driver
              db = DriverManager.getConnection(URL_, USR, PWD); // establish connection
        }
         
          catch (ClassNotFoundException e) {
              System.out.println("Cannot find the mysql driver");
        }    
       
        catch (SQLException e) {
              System.out.println("Database error: " + e);
        }   
          return db;
  }
 
} // end DBConnect


Mange tak for hjælpen!
Avatar billede bumle90 Nybegynder
26. maj 2004 - 21:46 #14
Når du fjerner static fra public Connection  db;
betyder det at hver objekt du opretter får sin egen connection variabel, og dermed sin egen connction til databasen.
Skulle man lave det elegant ville man nok lave en connectionpool der holdt styr på hvor mange connections til databasen der blev brugt.
Men man kan også sagtens lave det på den måde i har gjort når det er en skoleopgave :)
Avatar billede arne_v Ekspert
26. maj 2004 - 21:46 #15
Ved ikke static for hver instans sin egen connection.

Normalt er der kun en instans af en servlet.
Avatar billede arne_v Ekspert
26. maj 2004 - 21:47 #16
PS: Ændre lige password på jeres database !
Avatar billede bumle90 Nybegynder
26. maj 2004 - 21:48 #17
hehe :) Nu kan vi da alle logge på basen :D
Avatar billede arne_v Ekspert
26. maj 2004 - 21:49 #18
Og en connection pool er en rigtig god ide.

Hvis I henter en connection og lukker den igen inde i doPost, så bliver
den nemlig thread safe - det er den ikke med hverken en static eller en
ikek static member variabel.
Avatar billede rasmuslh Nybegynder
26. maj 2004 - 21:56 #19
ups - Bruger lige mit Jedi mind trick. You have not seen my password. You have never participated in this thread! :D
Avatar billede rasmuslh Nybegynder
26. maj 2004 - 21:57 #20
Tror vi fatter det nu. Kæmpe tak til jer for den store hjælp!
Avatar billede bumle90 Nybegynder
26. maj 2004 - 21:58 #21
hæhæ :)
Hvilket password ? :D

det virker sq
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

Forsvarsministeriets Materiel- og Indkøbsstyrelse

Nye kolleger søges til IT Stab i Forsvaret

Kongeå Trailercenter A/S

IT-Ansvarlig med bredt teknisk kendskab

Capgemini Danmark A/S

Java Engineer

SOS International

License & Vendor Manager