Avatar billede p_gaard Juniormester
09. februar 2007 - 15:45 Der er 8 kommentarer og
1 løsning

At indlæse og arbejde en klasse fra andet sted på www

Hej,

Jeg har et problem med at få en applet hos en klient til at anvende en klasse beliggende på serveren i tomcats root.

Jeg er interesseret i at åbne klassen således at jeg kan anvende dens metoder.

Kan URLClassLoader anvendes i denne sammenhæng?

(Ved URLClassLoader forstår jeg at den kan åbne en klasse beliggende andet sted på internettet for at arbejde med den i f.eks en applet.)

Såfremt den kan, er der så en som er i besiddelse af en en klasse som kan returnere en klasse ved hjælp af URLClassLoader.


Såfremt førstnævnte umiddelbart burde være muligt vil jeg også meget gerne vide det.

Mvh

Peter
Avatar billede arne_v Ekspert
09. februar 2007 - 16:49 #1
URLClassLoader cl = new URLClassLoader(new URL[] { new URL("http://www.xxx.dk/foobar.jar") });
Object o = Class.forName("minpakke.MinKlasse", true, cl).newInstance();
Avatar billede p_gaard Juniormester
10. februar 2007 - 18:30 #2
Tak for svaret, jeg vil prøve det af på mandag.
Avatar billede p_gaard Juniormester
12. februar 2007 - 10:48 #3
Hej igen,

Jeg har ikke fået urlclassloader til at fungere. Jeg har en mistanke om at problemet slet ikke ligger i at få appletten til at anvende/se klassen "container_ship" som ligger i /root på serveren.

Hos klienten returneres flg. fejl:

Returned HTTP responsecode 411: http://172.xxx.xxx.xxx/servlet/servlet_senddata

Jegf tolker fejlen som at længden på response ikke er angivet i servletten.

Er der en der ved at skimte nedenstående kode kan hjælpe med at sætte res.setcontentlength.


SERVLET:

public void doPost(HttpServletRequest req,
  HttpServletResponse res)
  throws ServletException, IOException{
 

            String contentType = "application/x-java-serialized-object";
            res.setContentType(contentType);


            PrintWriter pw=res.getWriter();
           
           
            ArrayList<container_ship> arrlst=new ArrayList<container_ship>();           
           
            try
            {
                dbclass x=new dbclass();
                ResultSet s=x.rstbscheme("Select * from tablesynop");
               
                s.first();
             
                while (s.next())
                {

                    container_ship cont=new container_ship();                 
                    cont.callsign=s.getString(1);
                    sz=sz+s.getString(1).length();
                   
                   
                    arrlst.add(cont);
                   
                   
                }
            }
                catch (Exception e){}

                ///res.setContentLength(sz); /virker ej
            ObjectOutputStream ou =    new ObjectOutputStream(res.getOutputStream());

   

            ou.writeObject(arrlst);
            ou.flush();


  }
Avatar billede arne_v Ekspert
18. februar 2007 - 04:48 #4
prøv og pak den kode som skal sendes til client i en jar fil

og placer den så den kan hentes direkte (ikke gennem servlet)
Avatar billede p_gaard Juniormester
19. marts 2007 - 13:54 #5
Jeg har lagt alle klasser ned i en signeret jar og serialiseret de klasser som var "containere" til at udfylde ArrayLists.

Kunne du forklare mig hvorfor det er nødvendigt at serialisere lige netop denne "containerklasse" som jeg anvendte til at fylde Arraylisten ArrayList<mapPoint> i servletten inden den blev sendt til appletten (Som så igen genetablerer ArrayList<mapPoint>. Klassen ligger jo i jar'en og der burde appletten kunne se mapPoint uanset om den er Serializable. Appletten kan sagtens se alle mulige andre klasser i samme jar. Kun lige nedenstående skal implementere Serializable.


public class mapPoint implements Serializable
{
   
    public double bredde;
    public double længde;
    public Point point;
 
  public void doPoint(Graphics g)
  {
     
        g.translate(0,0);
        g.setColor(Color.ORANGE);
        g.fillOval(point.x,point.y,3,3);
        g.setColor(Color.BLACK);
        g.drawOval(point.x,point.y,3,3);

  }
 
 
}
Avatar billede arne_v Ekspert
19. marts 2007 - 14:01 #6
en URLClassLoader kan hente klasse definitioner d.v.s. kode over en netværks forbindelse

serialisering gør at man kan sende objekter d.v.s. data over en netværks forbindelse

2 helt forskellige ting

ArrayList og Point er formentligt allerede serializable
Avatar billede p_gaard Juniormester
19. marts 2007 - 14:28 #7
URLClassLoaderen har jeg glemt alt om...

Det undrer mig hvorfor jeg skal implementere Serializable. Ellers virker det ikke. Jeg vil gerne finde en logisk forklaring på det.
Avatar billede arne_v Ekspert
19. marts 2007 - 14:40 #8
den er nødvendig for at sende et objekt over en socket

Serializable gør ikke noget som sådan men "implements Serializable" betyder
"undertegnede klasse lover hermed på tro og ære at hvis alle mine felter
skrives til disk/socket og læses igen så vil data også give mening i den anden ende"
Avatar billede p_gaard Juniormester
19. marts 2007 - 16:05 #9
Det lød flot!

Den vil jeg skrive op som kommentar i min kode. Mit program viser skibes observationskordinater på et kort men skal samtidig bruges i et eksamensprojekt. Det var mit mål fra starten at anvende polymorfi i appletten ude hos klienten og så løb jeg ind i disse vanskellighedder med serialisering.

Venlig hilsen

Peter
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