2010-12-10 124 views
1

J'ai un problème avec les paramètres transmis dans l'URL.Struts 2.0.14 Les paramètres GET ne sont pas codés en URL, est-ce un bug?

Disons que la demande est: /struts/MyAction.action?param=foo%40bar.com

Le champ d'action obtient le "PARAM" champ réglé sur "foo% 40bar.com", est que un bug ou j'attends trop de Struts? Mon intuition me dit que je devrais obtenir la valeur: "[email protected]", comme par exemple se passerait si je passais ce paramètre en tant que champ de formulaire POST. J'utilise la pile d'intercepteurs par défaut et ma classe d'action étend ActionSupport. Je reçois le comportement sur WebSphere6.1 & GlassFish2.1.

Merci


Salut Encore une fois,

Le problème a été causé par un bogue dans la mise en œuvre de proxy. Nous avons écrit un serveur proxy personnalisé devant l'application Web. Il encodait les paramètres d'URL pour la deuxième fois et c'est pourquoi dans Struts j'avais% 40 au lieu de @. Le bogue a été corrigé maintenant et les paramètres sont passés correctement.

Merci pour votre aide

Répondre

2

Je ne pense pas Struts2 est responsable de décoder les paramètres, mais le conteneur de servlet est par exemple Tomcat, Jetty, etc.

0

Quel est votre problème avec les paramètres? Qu'espériez-vous que le champ param serait réglé?

Vous pouvez écrire un convertisseur de type personnalisé si vous souhaitez que votre propriété Action soit convertie différemment de la façon dont Struts le fait.

1

Votre intuition est bonne, vous devriez obtenir "[email protected]". Avec le test suivant de Struts version 2.0.14, je pourrais entrer! @ # $ # $^$ &% # $% & dans un à partir de et l'afficher sur une autre page sans problème.

J'ai testé un os à nu jambes l'application 2.0.14 avec une forme qui prend une chaîne:

<s:form action="form-view.action" method="GET"> 
    <s:textfield label="email" name="email"/> 
    <s:submit/> 
</s:form> 

Une classe d'action de base (note avec stuts2 à cette version, vous n'avez pas besoin setters/getters):

package struts2; 

import com.opensymphony.xwork2.ActionSupport; 

public class FormViewAction extends ActionSupport{ 
    public String email; 
} 

Et une page d'affichage très basique contenant:

<s:property value="email"/> 

Voici le struts.x ml:

<struts> 
    <constant name="struts.enable.DynamicMethodInvocation" value="false" /> 
    <constant name="struts.devMode" value="true" /> 
    <package namespace="" name="example" extends="struts-default"> 
    <action name="form-view" class="struts2.FormViewAction"> 
     <result>/form-view.jsp</result> 
    </action> 
    </package> 
</struts> 

Il doit y avoir un problème de configuration ... Construisez-vous avec maven? Pourquoi utilisez-vous la version 2.0.14 au lieu de 2.2.1? Juste comme un aparté j'ai dégradé une application de test de 2.2.1 à 2.0.14 et cela m'a pris environ 5 minutes à faire. Je ne pense pas qu'il y ait de sérieux obstacles à la mise à jour de la version actuelle, ce qui vous donnera une documentation à jour.

J'ai lancé ceci sur Glassfish 3.0.1.

Si vous ne construisez pas avec maven, veuillez lister les fichiers jars de votre bibliothèque, vos fichiers web.xml et struts.xml et si possible un format.jsp minimal, display.jsp et une classe Action pour reproduire le problème.

+0

Vous devriez utiliser des getters et des setters plutôt que d'exposer des champs en public. C'est juste une bonne pratique générale en Java. –

+0

Avec les Struts, vous devez effectuer une validation dans une méthode de validation, le getter et le setter ne doivent rien faire d'autre que get/set, les contraintes de paramètres sont également traitées ailleurs ... Les classes sont minces. tel (et avec un refactoring IDE vraiment facile). En général, c'est une bonne idée, mais la façon dont je fais les actions semble assez abstraite sans les ajouter, ce qui améliore la lisibilité. OT juste FYI, hibernate peut même permettre la mise en place de champs privés (via la réécriture bytecode) parler d'exotiques! Je suis d'accord que get/set est la «meilleure pratique», mais ce n'est pas toujours le meilleur. – Quaternion

+1

Salut, ce n'est pas vraiment une forme mais un lien vers une action dans un email généré. Le classpath semble être correct et nous n'avons pas de sortie inquiétante dans les logs. Je vais essayer le Struts 2.2.1 et voir si cela change quelque chose –

0

Comme indiqué rado, le conteneur de servlet est responsable du décodage des valeurs de paramètre dans HttpServletRequest. Si vos valeurs ne sont pas décodées par l'URL, alors quelque chose est éteint.

Servlet Tutorial: Handling Form Data

Tout d'abord, quelle version de l'API Servlet utilisez-vous? 2,5? 2,4? Avez-vous le schéma XSD correct défini dans votre fichier web.xml pour la version que vous utilisez? Vérifiez également que la version que vous utilisez correspond à celle fournie par votre serveur d'applications.