Avatar billede thomas_yde Nybegynder
09. april 2002 - 18:06 Der er 7 kommentarer og
1 løsning

Servlets og kørende java program

Jeg har et problem med et projekt.
Jeg har en klasse der hedder Model.
Den ser sådan ud :

package NyWebPortal.Server.ModelServer;
import NyWebPortal.Server.ModelServer.*;
/*
* Model.java
*
* Created on 22. marts 2002, 13:03
  * @author  tydexx
* @version
*/
public class Model {
   
    private static Model model = new Model();
   
    private OpslagsTavleContainer otc= new OpslagsTavleContainer();
   
    private DokumentDataContainer ddc = new DokumentDataContainer();
   
    private MedlemContainer mc = new MedlemContainer();
   
    private ForumContainer fc = new ForumContainer();
   
    /** Creates new Model */
    public Model() {
        super();
    }
   
    public static Model getModel(){
        return model;
    }
   
    public static OpslagsTavleContainer getOpslagsTavleContainer(){
        return model.otc;
    }
   
    public static DokumentDataContainer getDokumentDataContainer(){
        return model.ddc;
    }
    public static MedlemContainer getMedlemContainer(){
        return model.mc;
    }

    public static ForumContainer getForumContainer() {
        return model.fc;
    }

}

Mit problem er så nu at jeg har en servlet som skal bruge denne model til at hente de forskellige containers. Men det er som om den henter en tom Model til sig selv og slet ikke bruge den model der allerede er oprettet.

Er der nogen der har en forklaring på dette fænomen?

Servlet ser sådan ud:
    protected void processRequest(HttpServletRequest request, HttpServletResponse response)
    throws ServletException, java.io.IOException {
      response.setContentType("text/html");
      java.io.PrintWriter out = response.getWriter();
     
      HashMap tavler;
       
      tavler = VisOpslagsTavleBeskederController.visOpslagstavler();
      int antal=Model.getOpslagsTavleContainer().getSize();
      int controller_antal = tavler.size();
        out.println("Size: " + antal); 
        out.println("<html>");
        out.println("<head>");
        out.println("<title>Opslagstavler</title>"); 
        out.println("</head>");
        out.println("<body>");
        out.println("<h1>Opslagstavler</h1>");
        //antal = tavler.size();
        out.println("controller_size: " + controller_antal+"<br>" );
        out.println("Size: " + antal + "<br>");   
        if(tavler != null && tavler.size() != 0)
        {
       
          Iterator enum = tavler.values().iterator();
     
          // output your page here*/
          out.println("<!--tavler is empty-->");
          Opslagstavle t;
          while (enum.hasNext())
          {
            t =(Opslagstavle)enum.next();
            out.println("<!--tavler != null-->");
            out.println("<A HREF=OpslagstavleBeskederServlet?titel=" + t.getTitel() +">" +
                        t.getTitel() + "</a>");
            out.println("<br>");
          }
        }
        else
        {
            out.println("Der er ingen tavler oprettet");
        }
        out.println("</body>");
        out.println("</html>");
       
        out.close();
    }


Håber nogen kan hjælpe mig.
Avatar billede thomas_yde Nybegynder
09. april 2002 - 18:30 #1
Er i lidt trætte idag eksperter?
jeg kan sætte nogle flere point på hvis det er det i vil.
Det er ret vigtigt !
Avatar billede jkrag Nybegynder
10. april 2002 - 01:20 #2
Skal det forstås således at du ønsker at din model skal være en singelton klasse (dvs. en hvor der kun oprettes netop en instans)?
I så fald bør du nok lave din constructor private (du kalder den jo heller ikke udefra).
Så kan du lave din getModel om så den opretter instances hvis der ikke findes en i forvejen.
De andre get-metoder bør så laves om til at bruge getModel istedet for at referere model direkte.
Udsnit af ændret kode følger:

private static Model model;
    /** Creates new Model */
    private Model() {
        super();
    }
 
    public static Model getModel(){
      if (model == null) {
        model = new Model();
      }
      return model;
    }
 
    public static OpslagsTavleContainer getOpslagsTavleContainer(){
        return getModel().otc;
    }

----------------------
du kan evt. også lave de andre om efter samme model således at du får:
    public static OpslagsTavleContainer getOpslagsTavleContainer(){
        return getModel().getOtc();
    }

hvor getOtc() opretter instansen hvis den ikke findes.

-------------------------
Hvis dette svar ikke stemmer overens med din problemstilling, så er jeg bange for at du må komme med lidt flere oplysninger. F.eks. noget om hvordan du kalder din servlet.

Håber dog du kan bruge ovenstående til noget alligevel.
Avatar billede thomas_yde Nybegynder
10. april 2002 - 08:49 #3
hmm der kommer lige lidt mere kode:

Her bliver model oprettet sammen med de objekter der allerede er blevet skabt og lagret i databasen :

import dk.friluftsliv.util.*;
import java.sql.*;
import javax.sql.*;
import java.util.*;
import java.awt.*;
import java.awt.event.*;
import java.text.*;
import NyWebPortal.Server.ModelServer.*;
import NyWebPortal.Server.ControllerServer.*;
import javax.swing.*;

public class StartServer extends JFrame implements ActionListener

    Model m;
   
    public static void main(String[] args)
    {
        new StartServer();
    }
      public StartServer(){
        JFrame jf = new JFrame();
        JButton jb = new JButton("Stop Server");
        JButton jb2 = new JButton("udskriv container");
        jb2.addActionListener(this);
        jb.addActionListener(this);
        jf.getContentPane().add(jb, BorderLayout.CENTER);
        jf.getContentPane().add(jb2, BorderLayout.EAST);
        jf.setSize(200,100);
        jf.pack();
        jf.show();
        m =  new Model();
        createObjects();
    }
    public void actionPerformed(ActionEvent ae)
    {
        if(ae.getActionCommand().equals("udskriv container"))
        {
            //udskriver direkte fra model -> container
            System.out.println("\n===== udskriv forum container =====\n");
            java.util.HashMap fc = m.getForumContainer().getFora();
            Collection c = fc.values();
            Iterator enum = c.iterator();
            while(enum.hasNext())
            {
                Forum f  = (Forum)enum.next();
                System.out.println(f.getTitel());
            }
            try{
                //udskriver via controller -> model -> container
                System.out.println("\n==== udskriver forum container via controller ====\n");
                java.util.HashMap fcc = VisForumBeskederController.visFora();
                Collection cc = fcc.values();
                Iterator enumc = cc.iterator();
                while(enumc.hasNext())
                {
                    Forum f  = (Forum)enumc.next();
                    System.out.println(f.getTitel());
                }
            }
            catch(Exception e)
            {
                System.out.println("exception ved controller: " + e.getMessage());
            }
        }
        if(ae.getActionCommand().equals("Stop Server"))
        {
          System.exit(0);
        }
    }
    public void createObjects()
    {
        try
        {
            java.sql.Connection conn = ConnectionManager.getConnection();
            java.sql.Statement stat = conn.createStatement();
            try
            {
                ResultSet rs = stat.executeQuery("Select FORUMTITEL from Forum");
                while(rs.next())
                {
                    String titel = rs.getString("FORUMTITEL");
                    ForumContainer fc = m.getForumContainer();
                    Forum f = new Forum(titel,null,null);
                    fc.add(titel,f);
                }
            }
          catch(Exception e)
          {
                System.out.println("SQL fejl: " + e.getMessage());
          }
          try
          {
              ResultSet rs2 = stat.executeQuery("Select TITEL from Opslagstavle");
              while(rs2.next())
              {
                  String titel = rs2.getString("TITEL");
                  Opslagstavle ot = new Opslagstavle(titel);
                  OpslagsTavleContainer otc = m.getOpslagsTavleContainer();
                  otc.add(titel,ot);
              }
          }
          catch(Exception e)
          {
              System.out.println("SQL Fejl ved Opslagstavle: " + e.getMessage());
          }
        }
        catch(Exception e)
        {
            System.out.println("Exception i start server: " + e.getMessage());
        }
    }
   
}

så længe startserver køre så formoder jeg at model også er i live, da startserver har en reference til model, og på den måde holder liv i container.

Jeg kan godt udskrive mine objekter via "startserver" klassen. Så det er min servlet der melder fejl.

Jeg kalder den egentlig ikke men "logger" bare ind på den via explore.
Avatar billede jkrag Nybegynder
10. april 2002 - 09:06 #4
Så vidt jeg kan se på et hurtigt kig, så er mit forrige svar stadig relevant.
Det er rigtigt at den model du opretter i Startserver bliver ved med at leve, men det garanterer jo ikke at det er den samme du får fat i fra din servlet.
Jeg ved ikke hvor du kører din servlet fra og i hvilke omgivelser, men det er jo ikke engang sikekrt at de kører i samme VM instans.
Hvis de kører i samme instans, bør mit første forslag kunne hjælpe. Hvis de ikke gør, så e det nogle helt andre metoder der skal tages i brug.
Avatar billede thomas_yde Nybegynder
10. april 2002 - 09:51 #5
jeg kører resin 2.10 på min server
Og mine servlets ligger under WEB-INF\classes\
hvor mit projekt også befinder sig under de forskellige packages.
Og du har ret jeg tror heller ikke min servlet får fat i den aktuelle model.

Hvordan kan jeg se om de kører i samme VM instans
Avatar billede jkrag Nybegynder
10. april 2002 - 14:32 #6
Hvis du starter din Swing applikation fra commandline (el. lign.) så kommer den aldrig til at køre i samme vm instans som din servlet container.
I Så fald skal du ud at rode med noget client-server forbindelse (RMI, CORBA , etc.) eller finde en helt anden arkitektur til din applikation (f.eks. ved at de to applikationerne (web og swing) bare arbejder på samme data, eller ved at din swing-applikation henter sine data via http til en anden servlet.)
Jeg ved jo ikke helt rigtigt hvad du prøver at bikse sammen, så jeg kan nok ikke hjælpe mere på denne her, mewn det skulle da også være en slags svar ;^)
Avatar billede thomas_yde Nybegynder
10. april 2002 - 18:07 #7
hehe ja det har du ret i, Men jeg har indtil videre løst problemet. Jeg sætter min servlet til at aktivere javaprogrammet som bygger min model ud fra mySQL på den måde for jeg dem i samme VM instans, men det hjælper ikke hvis resin serveren bryder sammen så skal den bygge modellen igen. Men det er pt. ikke noget stort problem :)

Men tusind tak for hjælpen du har envidere hjulpet mig til at forstå den der singleton pattern, som jeg ikke kendte til før :)
Avatar billede jkrag Nybegynder
10. april 2002 - 18:43 #8
jeg takker for pointtildelingen.
Held og lykke med det videre arbejde.
Hilsen jan
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