2009-01-19 8 views
3

Lorsque vous recevez un appel doGet ou doPost dans une servlet, vous pouvez utiliser getparameterxxx() pour obtenir la chaîne de requête ou les données de publication dans un endroit facile.
Si l'appel était un GET, vous obtenez des données de la chaîne url/query.
Si l'appel était un POST, vous obtenez toutes les données de poste pour vous. Sauf qu'il s'avère, si vous ne mettez pas un attribut 'action' dans votre appel de formulaire. Si vous spécifiez une URL complète ou partiellement qualifiée pour le paramètre d'action, tout fonctionne très bien. Si ce n'est pas le cas, le navigateur appelle la même URL que sur la page précédente et s'il y a des données de chaîne de requête là, vous obtiendrez cela ainsi que des données POST, et il n'y a aucun moyen de les différencier.Comment séparer les paramètres de chaîne de requête des données POST dans une servlet Java

Ou est là? Je regarde à travers l'objet request, je vois d'où viennent les données postales, j'essaie juste de comprendre d'où proviennent les données GET, donc je peux effacer les données GET lors d'un post-appel et effacer les données post sur un appel GET avant de l'analyser si possible.

Une idée de la façon sûre de le faire?

Et devinez lemme: vous n'avez jamais essayé de ne pas mettre un champ d'action dans une étiquette de formulaire. :-)

Répondre

2

En HTML, l'action est REQUIRED, donc je suppose que le comportement variera entre les clients.

+0

Pourtant, cela se produit toujours lorsque l'action est présente, si l'URL de l'action inclut une chaîne de requête. –

+0

Je n'ai jamais vu ça, mais j'ai essayé la chose sans action dans les différents navigateurs et ils se comportent tous de la même manière. Cela dépend probablement de la qualification du paramètre d'action ... – stu

+0

en repensant à ces années plus tard, ce qui peut ne pas être évident était que cette étiquette de forme cassée faisait partie d'une grande application de production et j'avais peur de toucher quelque chose d'aussi important. Donc, même si la question semble stupide, c'était ma raison d'être à l'époque. – stu

1

Les méthodes HttpServletRequest.getParameterxxx() ne font pas la distinction entre les paramètres GET et POST. Si vous avez vraiment besoin de les distinguer, vous devrez les analyser manuellement en utilisant getQueryString() pour les paramètres GET et getInputStream()/getReader() pour les données POST.

3

Vous avez raison, je n'ai jamais essayé de mettre un champ d'action dans un tag de forme ;-) et je ne le ferais pas, à cause de ce dont vous parlez. (De plus, je pense que ce n'est pas valide HTML)

Je ne connais pas de moyen de distinguer « propre » entre les paramètres GET et POST, mais vous pouvez accéder à la chaîne de requête brute en utilisant la méthode getQueryString() de HttpServletRequest, et vous peut accéder aux données POST brutes en utilisant la méthode getInputStream() de ServletRequest. (Je regarde les documents API Tomcat spécifiquement ici, bien que je pense que ceux-ci font partie de l'API Servlet standard) Ensuite, vous pouvez analyser les données POST et les données GET séparément si vous le souhaitez. Ils (ou devraient normalement) à la fois être formaté la même manière, à savoir

name1=value1&name2=value2&... 

mais peut-être avec les esperluette remplacés par des points-virgules (que vous pouvez techniquement faire dans HTTP/1.1, je ne savais pas que jusqu'à récemment)

+0

Oui, je pense que c'est le meilleur que vous pouvez faire. La morale de l'histoire est d'inclure l'action et la méthode dans votre forme ... –

+0

Facile à dire lorsque vous n'avez pas hérité d'un grand système avec beaucoup de formes sans actions. :-) Mais je vois votre point. Merci. – stu

Questions connexes