|
|||||||
|
|
|
![]() |
|
|
Strumenti |
|
|
#1 |
|
Member
Iscritto dal: Dec 2004
Città: Treviso e Udine
Messaggi: 258
|
[Java Servlet] Pagina pasticciata quando aperta in contemporanea
Il problema è questo: sto sviluppando un'applicazione Server-Oriented per una rete intranet: essenzialmente più terminali devono collegarsi contemporaneamente al server (Apache Tomcat) tramite collegamento wireless; il server distingue le varie sessioni e, di conseguenza, non dovrebbero esserci problemi all'apertura contemporanea della servlet da parte di più terminali...
Ciò, infatti, è vero per alcune di esse (l'applicativo è sviluppato su più pagine/servlet tra esse collegate) ma nell'apertura di una data servlet (particolarmente complessa e dal caricamento lungo), viene fuori un bel pasticcio: a volte da un terminale viene stampata una doppia pagina (in cascata), mentre dall'altro pagina vuota (o parzialmente stampata); altre volte da una parte mi dà errore; altre volte ancora entrambe le pagine vengono visualizzate con frammenti di codice in bella vista tra un campo testo e un'altro... Mi verrebbe quasi da pensare che sia un problema del Tomcat e non del codice... ma spero proprio di no! La mia speranza è che qualcuno di voi sia incappato nel mio stesso problema e che mi spieghi come risolverlo. Grazie. |
|
|
|
|
|
#2 |
|
Senior Member
Iscritto dal: Jun 2001
Città: Alessandria (provincia)
Messaggi: 4772
|
La servlet non dovrebbe mai essere troppo grande o particolarmente complessa.
Hai già provato a spostare fuori il codice "pesante" e a richiamarlo dalla servlet, in modo da attivare lo stream di output quando cominciano ad arrivare i dati dell'elaborazione e non durante ? |
|
|
|
|
|
#3 | |
|
Member
Iscritto dal: Dec 2004
Città: Treviso e Udine
Messaggi: 258
|
Quote:
|
|
|
|
|
|
|
#4 | |
|
Senior Member
Iscritto dal: Jun 2001
Città: Alessandria (provincia)
Messaggi: 4772
|
Quote:
Poi nella servlet importi la classe, passi i parametri che servono all'elaborazione (mediante il costruttore o direttamente al metodo), invochi il metodo e recuperi il risultato (ad es. un vettore o uno stringbuffer se è una sequenza di istruzioni HTML). Quindi apri lo stream di scrittura, ci riversi il codice HTML e chiudi lo stream, eventualmente invocandoci sopra un flush per pulirlo. |
|
|
|
|
|
|
#5 |
|
Member
Iscritto dal: Dec 2004
Città: Treviso e Udine
Messaggi: 258
|
Mi sono appena reso conto di una grave inconsistenza del mio codice (la mia niubbaggine non smette mai di stupirmi). L'oggetto PrintWriter che uso per lo streaming di output l'ho dichiarato fuori dai metodi (i quali non sono synchronized), con conseguente insorgere di problemi di concorrenza.
Se ho capito bene basta chiudere il codice concorrente in blocchi synchronized o dichiarare l'oggetto PrintWriter dentro e non fuori dei metodi, vero? |
|
|
|
|
|
#6 | |
|
Senior Member
Iscritto dal: Jun 2001
Città: Alessandria (provincia)
Messaggi: 4772
|
Quote:
Provare, grazie al cut & paste, costa poca fatica Il suggerimento di organizzare meglio il codice resta comunque valido, se non altro per facilità di gestione e riusabilità del codice |
|
|
|
|
|
|
#7 |
|
Member
Iscritto dal: Dec 2004
Città: Treviso e Udine
Messaggi: 258
|
Come sempre hai ragione.
Grazie dell'aiuto, se avrò altri problemi tornerò a perseguitarti!!!
|
|
|
|
|
|
#8 | |
|
Senior Member
Iscritto dal: Jun 2001
Città: Alessandria (provincia)
Messaggi: 4772
|
Quote:
Scherzo, sono qua... |
|
|
|
|
|
|
#9 |
|
Member
Iscritto dal: Dec 2004
Città: Treviso e Udine
Messaggi: 258
|
Neanche a farlo apposta ho subito un altro consiglio da chiederti/vi.
Sto riprogettando il codice rendendolo più modulare e più elegante e mi è giunto un dilemma: siccome gli elementi dell'interfaccia grafica (nomi delle label, dimensioni dei campi testo, etc...) delle varie servlet vengono letti da database tramite interrogazioni SQL restituite come oggetti ResultSet, l'idea è quella di eseguire la query alla prima apertura della servlet ( dal metodo init() ) e clonarne il risultato ogni volta che una nuova sessione viene creata. Il problema è che gli oggetti ResultSet non sono clonabili, a quanto pare. Come posso fare? |
|
|
|
|
|
#10 |
|
Senior Member
Iscritto dal: Jun 2001
Città: Alessandria (provincia)
Messaggi: 4772
|
Cosa intendi per clonare le resultSet?
Se intendi dire salvarti gli oggetti per non interrogare di nuovo il DB, se sono pochi dati puoi metterli in una lista e poi in sessione, se sono tanti non ti conviene (appesantiscono la memoria). Tutto sommato, se sono pochi, a recuperarli ogni volta non è che pesa molto... |
|
|
|
|
|
#11 |
|
Member
Iscritto dal: Dec 2004
Città: Treviso e Udine
Messaggi: 258
|
Niente, volevo dire tramite il metodo clone() ma mi sono reso conto che c'è un errore concettuale di fondo: ResultSet non è una classe, è un interfaccia.
Uhmmm... che ne dici di una lista statica, lasciando perdere di copiarla ogni volta nelle variabili sessione? Coi ResultSet aveva un senso, poichè sono provvisti di un puntatore che utilizzavo per la costruzione della riga ma se parliamo di lista posso usare un puntatore per ogni sessione e un'unica lista... |
|
|
|
|
| Strumenti | |
|
|
Tutti gli orari sono GMT +1. Ora sono le: 21:16.



















