2010-12-10 10 views
1

Ich habe ein Problem mit den Parametern in der URL übergeben.Struts 2.0.14 GET-Parameter sind nicht URLDecodiert, ist das ein Fehler?

Lassen Sie sagen, die Anforderung: /struts/MyAction.action?param=foo%40bar.com

Das Aktionsfeld der "param" bekommt Feld auf "foo% 40bar.com", ist, dass ein Bug oder ich erwarte zu viel von Struts?

Meine Intuition sagt mir, dass ich den Wert erhalten sollte: "[email protected]", wie es zum Beispiel passieren würde, wenn ich diesen Parameter als POST-Formularfeld übergeben würde.

Ich verwende den Standard-Interceptor-Stack und meine Action-Klasse erweitert ActionSupport. Ich bekomme das Verhalten auf WebSphere6.1 & GlassFish2.1.

Dank


Hallo Wieder

Das Problem wird durch einen Fehler in der Proxy-Implementierung verursacht wurde. Wir haben einen benutzerdefinierten Proxyserver geschrieben, der vor der Webanwendung stand. Es hat die URL-Parameter zum zweiten Mal codiert und deshalb hatte ich in Struts% 40 statt @. Fehler wurde behoben und Parameter werden korrekt übergeben.

Vielen Dank für Ihre Hilfe

Antwort

2

Ich glaube nicht, Struts2 zur Decodierung der Parameter verantwortlich ist, sondern der Servlet-Container ist z.B. Tomcat, Jetty usw.

0

Was ist Ihr Problem mit Parametern? Was hofften Sie, dass das Param-Feld eingestellt werden würde?

Sie können einen benutzerdefinierten Typkonverter schreiben, wenn Sie möchten, dass Ihre Action-Eigenschaft anders als in Struts konvertiert wird.

1

Ihre Intuition ist richtig, Sie sollten "[email protected]" bekommen. Mit dem folgenden Test der Struts Version 2.0.14 konnte ich! @ # $ # $^$ &% # $% & in ein von eingeben und auf einer anderen Seite ohne Problem anzeigen.

testete ich eine nackte Knochen Streben 2.0.14 Anwendung mit einer Form, die einen String:

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

Eine grundlegende Aktion Klasse (beachten Sie mit stuts2 bei dieser Version Sie brauchen Setter/Getter nicht wichtig):

package struts2; 

import com.opensymphony.xwork2.ActionSupport; 

public class FormViewAction extends ActionSupport{ 
    public String email; 
} 

Und eine sehr einfache Anzeigeseite enthält:

<s:property value="email"/> 

Hier ist die 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> 

Es muss ein Konfigurationsproblem geben ... Bauen Sie mit Maven? Warum verwenden Sie Version 2.0.14 anstelle von 2.2.1? Nebenbei habe ich eine Testanwendung von 2.2.1 auf 2.0.14 runtergestuft und das dauerte meine ca. 5 min. Ich glaube nicht, dass es ernsthafte Hindernisse beim Upgrade auf die aktuelle Version gibt, die Ihnen eine aktuelle Dokumentation liefern.

Ich lief dies auf Glassfish 3.0.1.

Wenn Sie nicht mit Maven bauen, listen Sie bitte die jars in Ihrer Bibliothek auf, Ihre web.xml- und struts.xml-Dateien und wenn möglich eine minimale form.jsp, display.jsp und eine Action-Klasse, um das Problem zu reproduzieren.

+0

Sie sollten Getter und Setter verwenden, anstatt die Felder als öffentlich verfügbar zu machen. Das ist nur eine allgemeine Best Practice in Java. –

+0

Mit Struts sollten Sie Validierungen in einer Validierungsmethode durchführen, der Getter und Setter sollten nicht mehr tun als setzen, Parameter-Constraints werden auch anderswo gehandhabt ... Klassen in Actions sind dünn, also brauchen Sie nicht viel Isolation als so (und mit einem IDE Refactoring wirklich einfach). Im Allgemeinen ist es eine gute Idee, aber die Art, wie ich Aktionen mache, scheint ziemlich abstrakt zu sein, während das Hinzufügen von ihnen die Lesbarkeit verbessert. OT nur FYI, Hibernate kann sogar die Einstellung von privaten Feldern erlauben (über Bytecode Neuschreiben) über exotische sprechen! Ich stimme zu, dass Get/Set "Best Practice" ist, aber es ist nicht immer das Beste. – Quaternion

+1

Hallo, das ist keine Form, sondern ein Link zu einer Aktion in einer generierten E-Mail. Der Klassenpfad scheint in Ordnung zu sein und wir erhalten keine beunruhigende Ausgabe in den Protokollen. Ich werde versuchen, die Struts 2.2.1 und sehen, ob es irgendetwas ändert –

0

Wie von Rado angezeigt, ist der Servlet-Container für die Decodierung der Parameterwerte im HttpServletRequest verantwortlich. Wenn Ihre Werte nicht URL-dekodiert werden, ist etwas ausgeschaltet.

Servlet Tutorial: Handling Form Data

Erstens, welche Version des Servlet-API verwenden Sie? 2.5? 2.4? Verfügen Sie in Ihrer web.xml über das richtige XSD-Schema für die von Ihnen verwendete Version? Stellen Sie außerdem sicher, dass die von Ihnen verwendete Version mit der Version übereinstimmt, die von Ihrem Anwendungsserver bereitgestellt wird.