2010-10-15 4 views
1

Voici ce que je veux faire. Cela semble simple, mais je n'arrive pas à le faire fonctionner. JSP1 - l'utilisateur remplit le formulaire, soumet à JSP2. JSP2 remplit les valeurs de formulaire dans un Bean et affiche les données, et offre l'option utilisateur de retourner et modifier (history.back()), ou de soumettre à Servlet. J'ai trouvé trois options différentes, et chacune a des problèmes.java session bean - recharger des données?

OPTION 1: JSP1 - formulaire HTML standard, soumet à JSP2

<form name="testform" method="post" action="jsp2.jsp"> 
... 
City: <input name="currentCity" type="text" /> 

JSP2 -

<jsp:useBean id="workorder" type="com.mycompany.app.WorkorderBean" class="com.mycompany.app.WorkorderBean" scope="request"> 
    <jsp:setProperty name="workorder" property="*" /> 
</jsp:useBean> 
... 
currentCity: ${workorder.currentCity} 

Problème -Lorsque JSP2 soumet au contrôleur, et je l'appelle WorkorderBean workorder = (WorkorderBean) request.getAttribute("workorder"); retourne null. Donc 'scope = request' ne le fait pas passer de JSP à servlet. OPTION 2: Même scénario, mais sur JSP2, utilisez 'scope = session'.
Problème: lorsque l'utilisateur choisit de revenir à JSP1 et de modifier les données, puis de soumettre à nouveau à JSP2, JSP2 n'utilise pas les nouvelles valeurs, car il a déjà le bean en tant que bean session.
Question: Existe-t-il un moyen de vider le bean session lorsque je l'envoie à partir de JSP1? Je ne pense pas que je peux le faire avec Javascript. OPTION 3: Envoyer JSP1 à Servlet, qui formate le bean session et l'envoie à JSP2.
Problème: Lorsque l'utilisateur choisit de revenir de JSP2 à JSP1 pour apporter des modifications, toutes les données sont perdues dans le formulaire.

Comment est-ce que je peux faire ce travail?

Répondre

0

Solution possible pour l'option 1:

En JSP2 mettre les paramètres de la requête dans les champs de formulaire cachés afin qu'ils puissent être soumis à votre servlet. Dans la servlet, vous devez lire les paramètres de la requête manuellement. Mais vous n'avez pas besoin de session et vous pouvez revenir de JSP2 à JSP1, changer certaines valeurs, soumettre à nouveau à JSP2. Ensuite, un envoi sur JSP2 transfère les valeurs modifiées au servlet.

Mise à jour:

Dans votre deuxième option: La raison pour laquelle les propriétés de haricots reste inchangé après une nouvelle soumission est que vous avez placé le jsp:setProperty Tag intérieur de jsp:useBean. Avec cette constellation jsp:setProperty est seulement appelée à la création de bean. Pendant le deuxième appel de JSP2, le bean workorder existe déjà dans la portée de session et aucun appel jsp:setProperty ne se produit.

Vous pouvez modifier ce comportement si vous placez le jsp:setProperty Tag à l'extérieur de jsp:useBean:

<jsp:useBean id="workorder" type="com.mycompany.app.WorkorderBean" 
    class="com.mycompany.app.WorkorderBean" scope="session" /> 
<jsp:setProperty name="workorder" property="*" /> 

Alors jsp:setProperty sera appelé à chaque appel JSP2 et écraser les propriétés du bean avec les paramètres de la requête.

+0

Ensemble de déménagementProperty en dehors de l'utilisationBean a bien fonctionné - merci vanje! – snowmanjack

1

La meilleure chose à faire est d'avoir un formulaire avec des champs cachés sur la deuxième page.

Et puis sur le premier formulaire, vous devriez le faire regarder la demande de données saisies.

Donc, vous vous retrouvez avec ceci:

GET /jsp1 

Montre la forme initiale, vide. Il a ensuite à JSP2 POSTs

POST /jsp2 
fname=Frank&lname=Jones&city=Atlanta 

JSP2 puis REDIRECTIONS à lui-même:

GET /jsp2?fname=Frank&lname=Jones&city=Atlanta 

Et il affiche ces valeurs.

Si l'utilisateur appuie sur RETOUR, il voit son travail d'origine. Si vous leur fournissez un « Précédent » lien, et il est un lien réel, il devrait être comme JSP2, que c'est plutôt JSP1:

GET /jsp1?fname=Frank&lname=Jones&city=Atlanta 

S'ils choisissent de continuer, alors vous postez sur le Servlet:

POST /servlet 
fname=Frank&lname=Jones&city=Atlanta 

Sur JSP2 vous avez une forme cachée:

<form action="/servlet" method="POST"> 
    <input type="hidden" name="fname" value="Frank"/> 
    ... 
    <input type="submit" ... /> 
</form> 

Puis, quand il est fait, le Servlet redirigera à tout JSP qu'il veut montrer. Fondamentalement, vous voulez seulement que le navigateur affiche les choses qu'il obtient, plutôt que les résultats des POST. Si vous avez déjà vu lorsque vous cliquez sur un bouton de retour et que vous obtenez cette boîte de dialogue "voulez-vous soumettre à nouveau cette requête", c'est parce que les résultats de la page précédente proviennent d'un POST et non d'un GET.

Vous utilisez des paramètres dans vos requêtes pour aider à faire avancer l'état. Cela empêche les informations de sortir de votre session et permet à des choses comme le bouton "Actualiser" de fonctionner correctement pour l'utilisateur.

+0

Oui, les champs cachés sur JSP2 sont ce que j'avais à l'origine. Il s'avère après avoir soumis le formulaire à la servlet, il va à une page finale JSP3, où 90% de la page est la même avec un en-tête/pied de page légèrement différent. Puisque ce formulaire a plus de 150 paramètres, et je dois en ajouter environ 50 de plus, si je peux obtenir JSP2 et JSP3 pour utiliser le bean pour afficher des valeurs, je n'ai qu'un seul fichier à conserver en utilisant 'include'. – snowmanjack

Questions connexes