2013-02-26 5 views
5

Wie bekomme ich die ServletRequest Instanz in meiner Aktion?Struts2: Wie erhalte ich ServletRequest-Instanz in ActionSupport

Ich implementiert ServletRequestAware, aber ich bin nicht in der Lage, Anfrage Objekt in der Aktion zu erhalten.

struts.xml

<package name="default" extends="struts-default,json-default"> 
    <action name="Cart" 
    class="struts.cart.action.CartAction"> 
     <interceptor-ref name="json"> 
      <param name="contentType">application/json</param> 
     </interceptor-ref> 
     <result type="json"/> 
    </action> 
</package> 

Ich Anruf mache Ajax/JavaScript verwenden:

req.onreadystatechange = onReadyState; 
req.open(POST, Cart.action, false); 
req.setRequestHeader("Content-Type", "application/json; charset=utf-8"); 
req.send(JSONstr); 

JSON-Objekt:

var data = { cartItem: { 
    modelNo: $('#modelNo').val(), 
    description: $('#description').val(), 
    price: $('#price').val(), 
    action: $('#action').val(), 
    quantity: $('#quantity').val() 
}}; 
JSONstr = JSON.stringify(data); 

Aktion:

public class CartAction extends ActionSupport implements ServletRequestAware { 

    private HttpServletRequest request; 
    private Map cartItem = new HashMap(); 

    public String execute() throws Exception { 
     System.out.println("request " + cartItem); // getting here cartitem 
     System.out.println("request " + request); // request null 
    } 

    public void setServletRequest(HttpServletRequest httpServletRequest) { 
     this.request = httpServletRequest; 
    } 

    public Map getCartItem() { 
     return cartItem; 
    } 

    public void setCartItem(Map cartItem) { 
     this.cartItem = cartItem; 
    } 

} 

Antwort

5

versuchen diese

HttpServletRequest request = ServletActionContext.getRequest() ; 
+0

Das funktioniert zwar, Implementierung 'ServletRequestAware' bevorzugt. –

4
  1. Warum wollen Sie Notwendigkeit das Servlet Anfrage? Es ist selten, dass es erforderlich ist.
  2. Der Grund ServletRequestAware nicht funktioniert, weil Sie die Abfangjäger entfernt, die es in die Handlung setzt:
<action name="Cart" class="struts.cart.action.CartAction"> 
    <interceptor-ref name="json"> 
    <param name="contentType">application/json</param> 
    </interceptor-ref> 
    <result type="json"/> 
</action> 

Wenn Sie alle Abfangjäger in einer Aktion der Konfiguration stellen Sie alle Abfangjäger setzen müssen .

Hier haben Sie entfernt alle Standard Abfangjäger, darunter „ServletConfig“, die den Antrag auf ServletRequestAware Aktionen setzt und sind nur die json Abfangjäger läuft.

0

Sie können AjaxActionSupport statt ActionSupport auf diese Weise verwenden ..

public class TestAjaxAction extends AJAXActionSupport { 

// innerhalb dieser Sie ausführen müssen Verfahren, wo man leicht sowohl Objekt bekommen.

public void ausführen (HttpServletRequest Anfrage, HttpServletResponse response) wirft AJAXActionException {

+1

'AJAXActionSupport' gehört nicht zum S2-Kern. Gib mindestens ein FQN. –