Autore Topic: Come prelevare un reference di un oggetto restituito da una Servlet?  (Letto 1348 volte)

Offline n3tmaster

  • Utente junior
  • **
  • Post: 96
  • Respect: 0
    • Google+
    • lerocchi
    • Mostra profilo
  • Dispositivo Android:
    Nexus 4 - Nexus 7 - PadFone JB
  • Sistema operativo:
    Mac OSX 10.7
Salve a tutti,
sto cercando di recuperare un reference di un oggetto da una mia servlet java (la quale restituisce appunto un mio oggetto).
Di solito in JSP si utilizza il metodo getAttribute della classe request, ma su Android non ho trovato niente di tutto ciò. Io utilizzo un istanza di HttpClient e pensavo di risolvere la questione utilizzando un HttpParams... il problema è che la classe HttpParams non fornisce alcun metodo simile alla getAttribute...
Esiste qualcosa in merito su Android per implementare questa cosa?

Grazie mille :)
Leandro Rocchi
Software Developer - Geodatabase Designer

Offline n3tmaster

  • Utente junior
  • **
  • Post: 96
  • Respect: 0
    • Google+
    • lerocchi
    • Mostra profilo
  • Dispositivo Android:
    Nexus 4 - Nexus 7 - PadFone JB
  • Sistema operativo:
    Mac OSX 10.7
Re:Come prelevare un reference di un oggetto restituito da una Servlet?
« Risposta #1 il: 12 Marzo 2012, 18:10:13 CET »
0
mmm vi posto qualche informazioni in più:

La parte finale lato Servlet:
Codice (Java): [Seleziona]
                      System.out.println("isAndroid : yes");
                        HttpSession ses = req.getSession();
                        ServletContext sc = ses.getServletContext();
                        sc.setAttribute("mioGruppoList",mioGruppoList);    //mioGruppoList è un istanza di una mia classe
                        sc.setAttribute("questoID", questoIDFile);              //questoIDFile è una String
                        System.out.println("completato");

questo pezzo di codice sta dentro il metodo doGet

Mentre lato Android
Codice (Java): [Seleziona]
    byte[] data = EntityUtils.toByteArray(miaEnt);
                                       
    Log.i(getClass().getSimpleName(), "data size from servlet=" + data.toString());
    ByteArrayInputStream mioBIS=new ByteArrayInputStream(data);
                                       
    Log.i(getClass().getSimpleName(), "data size from servlet ByteArrayInputStream=" + mioBIS.toString());
    Log.i("LayersListActivity - createList","leggo ObjectInputStream");
                                       
    ObjectInputStream ois = new ObjectInputStream(mioBIS);   //Genera ECCEZIONE
    Log.i("LayersListActivity - createList","chiamo readObject, mioGruppoList");
                                       
    mioGruppoList=(Vector<SVGroupList>)ois.readObject();
    Log.i("LayersListActivity - createList","chiamo readObject, String");
    questoID=(String)ois.readObject();

Ovviamente nel mio progetto android ho messo il package della mia classe (la SVGroupList).
Quando eseguo il codice , mi da un eccezione incomprensibile (una JavaNullPointer Exception) al momento che tento di istanziare la ObjectInputStream...

boh non so più che pesci pigliare...
Leandro Rocchi
Software Developer - Geodatabase Designer

Offline Ricky`

  • Amministratore
  • Utente storico
  • *****
  • Post: 3489
  • Respect: +506
    • Github
    • Google+
    • rciovati
    • Mostra profilo
Re:Come prelevare un reference di un oggetto restituito da una Servlet?
« Risposta #2 il: 12 Marzo 2012, 18:18:59 CET »
0
Io fossi in te farei produrre alla servlet un bell'array json. Almeno poi lato Android lo parsi facilmente.

Offline n3tmaster

  • Utente junior
  • **
  • Post: 96
  • Respect: 0
    • Google+
    • lerocchi
    • Mostra profilo
  • Dispositivo Android:
    Nexus 4 - Nexus 7 - PadFone JB
  • Sistema operativo:
    Mac OSX 10.7
Re:Come prelevare un reference di un oggetto restituito da una Servlet?
« Risposta #3 il: 12 Marzo 2012, 18:29:30 CET »
0
ehm..si beh è vero.. il fatto però è che volevo riciclare quella Servlet che ho sviluppato a suo tempo per un altro sistema e dato che io ho bisogno di quel vettore di oggetti mi sembrava più sensato riutilizzarla tale e quale piuttosto che rifare una nuova servlet che mi restituisce una struttura JSON piuttosto che modificare quella esistente per "specializzarla"....
però se non ci sono altri modi farò una JSON..
la cosa che mi torna strana è che non capisco perché non funzioni così come l'ho scritta... boh...  o_O
Leandro Rocchi
Software Developer - Geodatabase Designer

Offline Ricky`

  • Amministratore
  • Utente storico
  • *****
  • Post: 3489
  • Respect: +506
    • Github
    • Google+
    • rciovati
    • Mostra profilo
Re:Come prelevare un reference di un oggetto restituito da una Servlet?
« Risposta #4 il: 12 Marzo 2012, 18:38:16 CET »
0
Prova a scrivere qui un esempio di output di quella servlet.

[edit]
COmunque non è strettamente necessario crearne un'altra. Potresti lavorare tramite gli header http: android aggiunge un header "Accept: text/json" e se la servlet legge questo header produce l'output in json altrimenti lo produce normalmente.
« Ultima modifica: 12 Marzo 2012, 18:42:15 CET da Ricky` »

Offline n3tmaster

  • Utente junior
  • **
  • Post: 96
  • Respect: 0
    • Google+
    • lerocchi
    • Mostra profilo
  • Dispositivo Android:
    Nexus 4 - Nexus 7 - PadFone JB
  • Sistema operativo:
    Mac OSX 10.7
Re:Come prelevare un reference di un oggetto restituito da una Servlet?
« Risposta #5 il: 12 Marzo 2012, 19:39:00 CET »
0
beh l'output "umano" non c'è, nel senso che restituisce una Vector di oggetti che si riferiscono ad una classe che ho costruito. Ogni istanza della mia classe contiene una serie di informazioni (una lista di nomi  e proprietà) che poi mi voglio gestire dinamicamente sull'activity che chiama la servlet.
Ho provato a modificare l'uscita della servlet nel seguente modo:
Codice (Java): [Seleziona]
       
                       
                        OutputStream os = resp.getOutputStream();      //recupero lo stream chiamante per riempirlo
                        BufferedOutputStream  bos = new BufferedOutputStream(os);  
                       
                        txtout=mioGruppoList.toArray().toString().getBytes();
                        //txtout=mieiObj.
                        bos.write(txtout,0,txtout.length);
                       

nell'esempio che ho scritto, mioGruppoList è una Vector di  SVGroupList (la mia classe). In questo modo scrivo sotto forma di stream di bytes la mia struttura...
ora però la devo raccogliere lato Activity nella handlerResponse.....
Leandro Rocchi
Software Developer - Geodatabase Designer

Offline Ricky`

  • Amministratore
  • Utente storico
  • *****
  • Post: 3489
  • Respect: +506
    • Github
    • Google+
    • rciovati
    • Mostra profilo
R: Come prelevare un reference di un oggetto restituito da una Servlet?
« Risposta #6 il: 12 Marzo 2012, 21:11:17 CET »
0
Beh se apri la pagina con il browser dovresti avere un output leggibile, no?

Inviato dal mio HTC Desire usando Tapatalk

Offline n3tmaster

  • Utente junior
  • **
  • Post: 96
  • Respect: 0
    • Google+
    • lerocchi
    • Mostra profilo
  • Dispositivo Android:
    Nexus 4 - Nexus 7 - PadFone JB
  • Sistema operativo:
    Mac OSX 10.7
Re:Come prelevare un reference di un oggetto restituito da una Servlet?
« Risposta #7 il: 13 Marzo 2012, 01:03:05 CET »
0
mmm ma non ha senso, la mia servlet restituisce un costrutto java (una vector con dei reference ad una classe) se lo chiamo direttamente dal browser non apparirà niente..tra l'altro dato che io restituisco uno stream di byte binary, ho impostato come setContentType un "image/gif"
Leandro Rocchi
Software Developer - Geodatabase Designer

Offline pivoide

  • Utente junior
  • **
  • Post: 133
  • Respect: +19
    • Mostra profilo
  • Dispositivo Android:
    Samsung galaxy tab 10.1
  • Play Store ID:
    codicerosso
  • Sistema operativo:
    Ubuntu 11.04
Re:Come prelevare un reference di un oggetto restituito da una Servlet?
« Risposta #8 il: 13 Marzo 2012, 02:13:41 CET »
0
Se non sbaglio con l' istruzione mioGruppoList.toArray().toString().getBytes() non hai l'oggetto ma il riferimento. Prova con

ByteArrayOutputStream b=new ByteArrayOutputStream();
ObjectOutputStream os=new ObjectOutputStream(b);
os.writeObject(tuoVector);
b.writeTo(tuo buffered);

Dovrebbe funzionare. Originale l'idea di utilizzare http per trasportare oggetti binari: non ci avrei mai pensato
Odio l'inglese e per un informatico non è il massimo

Offline Ricky`

  • Amministratore
  • Utente storico
  • *****
  • Post: 3489
  • Respect: +506
    • Github
    • Google+
    • rciovati
    • Mostra profilo
R: Come prelevare un reference di un oggetto restituito da una Servlet?
« Risposta #9 il: 13 Marzo 2012, 08:35:04 CET »
0
Ciao, scusa non avevo colto l'idea di quello che stavi realmente facendo quindi riconosco che il mio suggerimento era fuori luogo :)

Inviato dal mio HTC Desire usando Tapatalk

Offline n3tmaster

  • Utente junior
  • **
  • Post: 96
  • Respect: 0
    • Google+
    • lerocchi
    • Mostra profilo
  • Dispositivo Android:
    Nexus 4 - Nexus 7 - PadFone JB
  • Sistema operativo:
    Mac OSX 10.7
Re:Come prelevare un reference di un oggetto restituito da una Servlet?
« Risposta #10 il: 13 Marzo 2012, 10:03:14 CET »
0
Se non sbaglio con l' istruzione mioGruppoList.toArray().toString().getBytes() non hai l'oggetto ma il riferimento. Prova con

ByteArrayOutputStream b=new ByteArrayOutputStream();
ObjectOutputStream os=new ObjectOutputStream(b);
os.writeObject(tuoVector);
b.writeTo(tuo buffered);

Dovrebbe funzionare. Originale l'idea di utilizzare http per trasportare oggetti binari: non ci avrei mai pensato

Allora effettivamente ho fatto una modifica alla mia Servlet perché per come era messa prima non poteva funzionare, ho cambiato innanzitutto il contenttype (per trovarlo ho veramente tribolato)
Codice (Java): [Seleziona]
            resp.setContentType("application/octet-stream");
            ByteArrayOutputStream baos = new ByteArrayOutputStream();
            ObjectOutputStream oos = new ObjectOutputStream(baos);
            oos.writeObject(mioGruppoList);
            resp.setContentLength(baos.size());
      

Ti ringrazio per il complimento, l'idea in realtà nasce dal fatto che voglio riciclare il più possibile quello che ho fatto lato server per una mia webApp J2EE mobile...
Anyway in J2EE si usa spesso la tecnica di tirare sulla pagina JSP/JSF gli oggetti che ti istanzi sulla servlet, in questo modo la servlet non si deve preoccupare di gestire la rappresentazione dei tuoi oggetti ma demanda tutto alla JSP/JSF... volevo fare la stessa cosa con Android, ma sto trovando non poche difficoltà  :-(

Al momento il codice che ho scritto io mi va in eccezzione sulla writeObject e non capisco perché.. una cosa che non ho capito invece del tuo suggerimento: perché mi dici di usare anche writeTo ? dovrebbe bastare la writeObject no? inoltre cosa dovrei passare a writeTo?
Boh scusate le mie domanda da nooobbbone :(
Leandro Rocchi
Software Developer - Geodatabase Designer

Offline n3tmaster

  • Utente junior
  • **
  • Post: 96
  • Respect: 0
    • Google+
    • lerocchi
    • Mostra profilo
  • Dispositivo Android:
    Nexus 4 - Nexus 7 - PadFone JB
  • Sistema operativo:
    Mac OSX 10.7
Re:Come prelevare un reference di un oggetto restituito da una Servlet?
« Risposta #11 il: 13 Marzo 2012, 10:16:52 CET »
0
Mi è venuto un dubbio..la mia classe implementa Serializable..ma non è che sotto Android devo farle implementare Parcelable?
Leandro Rocchi
Software Developer - Geodatabase Designer

Offline n3tmaster

  • Utente junior
  • **
  • Post: 96
  • Respect: 0
    • Google+
    • lerocchi
    • Mostra profilo
  • Dispositivo Android:
    Nexus 4 - Nexus 7 - PadFone JB
  • Sistema operativo:
    Mac OSX 10.7
Re:Come prelevare un reference di un oggetto restituito da una Servlet?
« Risposta #12 il: 13 Marzo 2012, 10:52:30 CET »
0
ragazzi HO RISOLTO!!!!!!

allora la servlet ho dovuto un pò modificarla:

Codice (Java): [Seleziona]
       
                        ByteArrayOutputStream baos = new ByteArrayOutputStream();
                        ObjectOutputStream oos = new ObjectOutputStream(baos);
                        oos.writeObject(mioGruppoList);    //scrivo nel mio byteArray la mia vector e tutta la struttura
                        outputBB = ByteBuffer.wrap(baos.toByteArray());   //uso ByteBuffer per bufferizzare il mio oggetto
                        ServletOutputStream sos = resp.getOutputStream();   //recupero l'outputstream
                       
                        resp.setContentType("application/octet-stream");
                        resp.setContentLength(outputBB.capacity());
                        sos.write(outputBB.array());   //scrivo nella servlet outputstream il mio array buffered
                        sos.flush();
                        sos.close();
                                       
                       


a questo punto su android, nella mia handlerResponse metto:

Codice (Java): [Seleziona]
HttpEntity miaEnt = response.getEntity();
                       
                        if(miaEnt!=null){
                                try{
                                        byte[] data = EntityUtils.toByteArray(miaEnt);
                                        Log.i("LayersListActivity - createList","Ecco quanta roba esiste: ");
                                        ObjectInputStream ois = new ObjectInputStream(new ByteArrayInputStream(data));
                                        Log.i("LayersListActivity - createList","Ecco quanta roba esiste: ");
                                        mioGruppoList=(Vector<SVGroupList>)ois.readObject();
                       
                                }catch(Exception e){
                                        Log.e("LayersListActivity - createList","Errore in lettura dati remoti - "+e.getMessage());
                                }
                               
                               
                        }

E funziona!!!! su android mi arriva la struttura ESATTAMENTE come l'ho creata sulla servlet! con tutti i dati memorizzati ovviamente!
Leandro Rocchi
Software Developer - Geodatabase Designer

Offline n3tmaster

  • Utente junior
  • **
  • Post: 96
  • Respect: 0
    • Google+
    • lerocchi
    • Mostra profilo
  • Dispositivo Android:
    Nexus 4 - Nexus 7 - PadFone JB
  • Sistema operativo:
    Mac OSX 10.7
Re:Come prelevare un reference di un oggetto restituito da una Servlet?
« Risposta #13 il: 13 Marzo 2012, 11:00:35 CET »
0
Ah dimenticavo... le mie classi le ho messe tutte Serializable
Leandro Rocchi
Software Developer - Geodatabase Designer