2010-02-16 4 views
3

J'ai un comportement étrange (et probablement) incorrect ici. Je tentais de mettre une case à cocher sur la page, et vous le savez: Des cases non cochées ne sont pas écrites à la demande (cases seulement vérifiés sont)Struts reset() n'est pas appelé avant de remplir le formulaire

Ce qui se pavane offre normalement est de passer outre:

@Override 
public void reset(ActionMapping mapping, ServletRequest request) 

à réinitialiser toutes les cases à cocher à "false". Mais dans mon cas, cette réinitialisation() n'est jamais appelée!

Quelqu'un a une idée?

Merci à l'avance,

mana

+0

Peut être, est-ce parce que l'URL de la demande est à la recherche de jsp, et non le mappage pour struts- action (par exemple * .do). Désolé pour mon mauvais anglais. – Shashi

Répondre

2

La méthode de réinitialisation est automatiquement appelée par le framework Struts (votre observation sur la réponse de The Elite Gentleman est correcte) ... c'est-à-dire si vous avez tout fait par le livre.

Vérifiez les points suivants:

  1. êtes-vous étendez une classe ActionForm ou autre chose?
  2. avez-vous par hasard écraser la méthode de réinitialisation dans une sous-classe de la vous ne recevez pas la méthode appelée et vous l'utiliser pour votre action?
  3. Gérez-vous manuellement le cycle de vie du formulaire au lieu de laisser les Struts le faire?
  4. dans struts-config, avez-vous spécifier que votre action utilise cette forme particulière en spécifiant le name attribut sur la balise action?

Mon argent est sur le numéro 4.

+0

Eh bien, j'ai vérifié: 1. Mon formulaire étend ValidationActionForm, qui étend le formulaire d'action. 2. Dans le débogueur, il indique l'instance correcte de mon formulaire. Dans le cas où n'importe quelle sous-classe remplacerait reset(), aussi - ce ne sera pas un problème, puisque le reset() de la classe la plus haute sera appelée. De là, j'appelle super.reset(). 3. Le formulaire est seulement décrit dans le fichier struts-config.xml (je ne fais pas new MyForm() et session.add (myForm) ou autre) 4. Oui, l'action a le nom correct du Formulaire (avec la portée de la session) – mana

+0

Étrange ... Peut-être que si vous fournissez un peu plus de code avec votre question. En outre, avez-vous un attribut nommé "attribut" sur la balise d'action dans struts-config? Utilisez-vous les tags dans la JSP pour récupérer le formulaire ou utilisez-vous autre chose (comme un formulaire plain vanilla)? –

0

Reset est jamais appelé par défaut, vous devez l'appeler par vos actions (si vous voulez réinitialiser votre formulaire),

alternativement, sur votre jsp, vous aurez <html:reset /> tag et remplacer la méthode de réinitialisation de ActionForm. CA aide.

+0

Je ne veux pas réinitialiser l'ensemble du formulaire. Je veux simplement mettre tous les champs qui contiennent des valeurs des cases à cocher à "false" - de sorte que les cases cochées soient correctement écrites dans ces champs avec la valeur "true" ... et les cases non cochées (dont la valeur n'est pas transmise dans la requête) coller à "faux". Ceci est normalement un automatisme dans les entretoises, mais comme je l'ai dit, reset() n'est pas exécuté dans mon cas. – mana

+0

dans ce cas, sur votre action, remplacez la méthode 'reset()', puis votre méthode, par exemple. 'Public ActionForward execute (mappage ActionMapping, formulaire ActionForm, requête HttpServletRequest, réponse HttpServletResponse) throws Exception {form.reset(); return mapping.findForward (..);} '.... Ce que je veux dire, c'est que vous pouvez (typecast) appeler le' reset() 'comme je l'ai fait dans l'exemple. –

+0

le reset() n'a normalement pas besoin d'être appelé manuellement. Il doit être appelé par le cadre Struts? Ou ai-je tort? – mana

4

La signature de la méthode correcte pour remplacer est

public void reset (ActionMapping de cartographie, javax.servlet.http.HttpServletRequest demande)

+1

(Peut-être en fonction de votre version de Struts) C'est la bonne réponse. – searlea

0

prototype de reset() méthode est:

public void reset(ActionMapping mapping, javax.servlet.http.HttpServletRequest request) 

Si nous ne sommes pas en utilisant la méthode reset() quand ce moment-là, nous essayons d'ouvrir notre application alors les valeurs précédentes sont automatiquement à venir.
Si nous utilisons cette méthode reset(), les valeurs précédentes seront réinitialisées en valeurs vides. Donc, en utilisant cette méthode reset(), nous pouvons éviter les valeurs précédentes.

1

J'ai eu un problème similaire.

La solution a été d'ajouter l'attribut scope = « demande » dans la balise d'action dans struts-config.xml