Newsgroup: it.comp.java
Titolo: jserv

ho bisogno di aiuto
Io ho installato (meglio ... ho fatto installare, ed ho aiutato ad
installare) jserv su redhat 6.2, jdk 1.2.2.
funziona tutto, tranne un piccolo particolare: se la servlet deve accedere
ad un file, il sitema le nega il permesso [permission denied], generando
cosě un'eccezione. Se invece faccio una piccola applicazione java che scrive
su di un file e la faccio partire con il runtime normale (java) questa
funziona benissimo. come mai?
Stefano

Salve a tutti.
Comincio subito col dire cosa ho capito (ma forse è + giusto dire "non
ho capito") sui passi che vengono eseguiti quando viene istanziato un
oggetto a1 di una certa classe A:
1)viene istanziato l'oggetto Class corrispondente
2)vengono inizializzati i suoi campi STATICI
3)viene allocata la necessaria memoria per a1 nella heap
4)vengono inizializzati -se presenti-  tutti gli altri campi (detta un
       po' all'ingrosso, questa è un'operazione relativa all'oggetto a1
       e non al relativo oggetto di tipo Class)
5)viene eseguito il costruttore
Qualora istanziassi un altro oggetto della classe A (chiamiamolo a2)
vengono ripetuti i passi dal 3 (compreso) in poi.
Giusto? Speriamo, altrimenti ben vengano le spiegazioni.
Cosa accade invece quando istanzio una classe derivata???
Da quello che ne ho capito, i 5 passi precedenti vengono TUTTI eseguiti
ricorsivamente su ciascuna super classe,partendo dalla classe base per
arrivare a quella che sto istanziando (ci siamo capiti).
Forse il mio errore potrebbe essere proprio qui.....
Allego a questa mail un breve sorgente java al quale mi riferirò per
comodità (è tratto dal celeberrimo "Thinking in Java",2nd edition
release 11).
class Egg2 {
//------------------ Inner Class --------------------
  protected class Yolk {
    public Yolk() {
      System.out.println("Egg2.Yolk()");
    }
    public void f() {
      System.out.println("Egg2.Yolk.f()");
    }
  }
//---------------------------------------------------
  private Yolk y = new Yolk(); //Reference
 public Egg2() {
    System.out.println("New Egg2()");
  }
  public void insertYolk(Yolk yy) { y = yy; }
  public void g() { y.f(); }
}
//**************************************
public class BigEgg2 extends Egg2 {
//--------Inner (extended) class------------------
 public class Yolk extends Egg2.Yolk {
    public Yolk() {
      System.out.println("BigEgg2.Yolk()");
    }
    public void f() {
      System.out.println("BigEgg2.Yolk.f()");
    }
  }
//---------------------------------------------------
  public BigEgg2() { insertYolk(new Yolk());}
  public static void main(String[] args) {
    Egg2 e2 = new BigEgg2();
    e2.g();
  }
}
Veniamo quindi al dunque:
compilando ed eseguendo si ha il seguente output:
Egg2.Yolk()
New Egg2()
Egg2.Yolk()
BigEgg2.Yolk()
BigEgg2.Yolk.f()
Sulla 5a e ultima riga  dell'output non ci sono dubbi, quindi non ne
parlerò,piuttosto ecco la mia interpretazione sulle altre 4:
1a riga:    dovuta al passo 4 (inizializzo il reference y di Egg2)
2a riga:       "       "     "      5 (eseguo il costruttore di Egg2)
A questo punto si esegue il costruttore della classe derivata BiggEgg2
ma dal codice si evince che esso "comporta" la creazione di un oggetto
della classe BiggEgg2.Yolk (vedi parametro della insertYolk ).Pertanto:
3a riga:       "       "     "      4   (costruttore della superclass Egg2.Yolk)
4a riga:       "       "     "      4   (costruttore diBigEgg2.Yolk)
Tuttavia   BigEgg2   eredita   da Egg2   anche il reference y !
Come mai non se ne ha traccia nell'output (e quindi da nessuna parte)?
Non viene inizializzato ?
Avrei immaginato un'output diverso, e cioè:
Egg2.Yolk()
New Egg2()
Egg2.Yolk()          // linee aggiuntive generate dall'inizializzazione
BigEgg2.Yolk()    // del reference y della BigEgg2 analogamente
                             // alla 1a riga dell'output
Egg2.Yolk()
BigEgg2.Yolk()
BigEgg2.Yolk.f()
Ringrazio chiunque abbia voglia di chiarirmi le idee ( e la pazienza di
essersi sorbito questa mail), ciao
                                                                   Chef



 funziona benissimo. come mai?
Perchè l'applicazione la fai girare con la tua normale utenza (che spero non sia
root, vero? ;) mentre il JServ gira con gli stessi permessi di Apache, che
solitamente sono quelli dell'utente nobody. Quindi per far leggere il file dalla
tua servlet devi rendere il file leggibile da nobody.
Ciao,
 Stefano
----------
"X WindowSSS, teSSSoro mio... lo odieremo per SSSempre"
Bill Gollum
----------