Toon posts:

[Struts] Even geduld... pagina

Pagina: 1
Acties:

Verwijderd

Topicstarter
Ik heb een eenvoudige site opgezet met Struts (= projectvoorwaarde).
Na het submitten van een formulier wordt in de execute methode van de Action Bean een proces aangeroepen. Nadat het proces is afgerond zorgt het ActionForward object wat wordt teruggegeven door de execute methode dat de volgende pagina (klaar.jsp) wordt getoond. Hierin toon ik dan de resultaten van het proces.

Het probleem (nou ja, uitdaging dan) is nu, dat het proces dat door de execute wordt aangeroepen lang duurt, de eindgebruiker ongeduldig kan worden en nogmaals het formulier submit. Een dubbele submit vang ik wel af, maar kan ik ook tijdens het proces een 'Even geduld...' pagina tonen en na afloop toch mijn klaar.jsp op het scherm tonen?

Ik kom zelf wel op een stukje JavaScript in mijn submit button die een tussentijdse pagina toont en dan pas submit, maar ik wil mijn pagina zo 'schoon' mogelijk houden en de flow er buiten houden.

  • djengizz
  • Registratie: Februari 2004
  • Niet online
Het dubbel submitten wordt binnen Struts vaak opgelost met tokens (Synchronizer Token pattern). De methodes hiervoor zijn bv. te vinden in de API doc van de Action doc (saveToken, resetToken, isTokenValid etc). Ook classes als TokenProcessor zijn o.a. hiervoor bedoeld.
Wat helemaal mooi is om dit mechanisme userbased te maken en na het vaststellen van een invalid token (of 2* bij dezelfde user) te forwarden naar de juiste boodschap voor de gebruiker.
Nadeel van deze oplossing is dat het toch op de server wordt uitgevoerd. In mijn ogen is deze extra overhead verwaarloosbaar en winnen de mogelijkheden van zo'n mechanisme het ruimschoots van de overhead.
Mocht je het toch client side willen houden dan zijn er meerdere mogelijkheden zoals javascript (zoals je zelf al zegt) maar ook het Validator framework van Struts (op de achtergrond ook javascript).

[ Voor 3% gewijzigd door djengizz op 21-09-2004 21:29 ]


  • ACM
  • Registratie: Januari 2000
  • Niet online

ACM

Software Architect

Werkt hier

djengizz: Volgens mij geef je een oplossing voor het probleem dat ie al opgelost heeft...

't Probleem met van de topicstarter is van een andere aard daarentegen; dat vloeit voort uit de beperkingen van het HTTP-protocol. Dat is een request-based protocol, waarbij de server alleen maar een response kan sturen zodra de gebruiker een request gedaan heeft. Je kan dus niet vanuit de server iets initieren.
Een van de makkelijkere oplossingen die ik ken om ervoor te zorgen dat er een tijdje "even geduld aub, processing..." staat en daarna "klaar" komt te staan (of hoe je dat ook letterlijk wilt uitvoeren) is om met javascript te werken. Je kan dan javascript naar de client sturen dat een bepaalde tekst op het scherm laat schrijven ("even geduld" ofzo) en tot je klaar bent diezelfde verbinding open houden (evt met stukjes voortgangsmelding). Zodra je klaar bent stuur je een laatste stukje javascript op, dat bijvoorbeeld de melding verandert of een redirect uitvoert.
Een groot nadeel hiervan is dat het niet echt MVC meer is, want dit zal je direct vanuit de controller (je action) moeten regelen, niet dmv redirects binnen struts.

Ik geloof dat in de basis alle mogelijke oplossingen op hetzelfde neerkomen. Namelijk dat je ofwel de verbinding openhoudt zolang het duurt en de server uiteindelijk iets speciaal opstuurt. Of dat je vanuit de client steeds informatie opvraagt.
Uiteraard zou je het nog met een kleine java-applet kunnen oplossen, dan kan ook de server data-transfers initieren.

Verwijderd

Topicstarter
djengizz: Bedankt, al was dat niet m'n directe probleem, maar je uiteenzetting is wel helder!

ACM: Ik denk dat ik hier wel mee uit de voeten kan. Ik denk dat ik voor de variant moet kiezen dat ik toch de verbinding sluit omdat het proces enkele uren kan duren (de gebruiker klikt nl. op een knop om een batchproces op te starten). Een sessie m.i. nooit zo lang open te houden, dus na afloop forwarden naar een pagina lijkt dan geen optie.
In plaats daarvan schrijf ik de output naar een file ipv het scherm en toon ik een link hier naar toe. Uiteraard is deze link pas actief na afloop van het proces.

Hoewel het project betrekking heeft op een eenmalige conversie en 'als het werkt, werkt het', sta ik altijd open voor verbeteringen.

Verwijderd

tja, enkele uren processen...geeft je container geen timeouts?

Ik zou gewoon op de pagina waar geklikt wordt de submit button verbergen en ergens een rood (of ander opvallend tekstje) "het proces is gestart, even geduld..." dat eerst visibility:hidden had gewoon visible maken (JS).

Héél eenvoudig en het werkt...zonder roundtrip zelfs.

  • djengizz
  • Registratie: Februari 2004
  • Niet online
Idd: moet beter leren lezen Sorry!

:z

[ Voor 46% gewijzigd door djengizz op 22-09-2004 20:49 ]

Pagina: 1