2013-02-26 12 views
5

Jak uzyskać instancję ServletRequest w mojej akcji?Struts2: Jak uzyskać wystąpienie ServletRequest w ActionSupport

Zaimplementowałem ServletRequestAware, ale nie mogę pobrać obiektu żądania w akcji.

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> 

Robię połączenia przy użyciu ajax/javascript:

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

JSON obiektu:

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

Działanie:

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; 
    } 

} 

Odpowiedz

5

spróbować

HttpServletRequest request = ServletActionContext.getRequest() ; 
+0

Chociaż to działa, wdrażanie 'jest korzystne ServletRequestAware'. –

4
  1. Dlaczego potrzeba wniosek servlet? To rzadkie, że jest wymagane.
  2. Powodem ServletRequestAware nie działa dlatego, że usunęła przechwytywania, który ustawia go do działania:
<action name="Cart" class="struts.cart.action.CartAction"> 
    <interceptor-ref name="json"> 
    <param name="contentType">application/json</param> 
    </interceptor-ref> 
    <result type="json"/> 
</action> 

Po ustawieniu żadnych przechwytujących w konfiguracji powództwo musi ustawionej wszystkie przechwytujących .

Tutaj masz usunięte wszystkie przechwytujących domyślnych, w tym „ServletConfig”, który ustawia żądanie ServletRequestAware działań i działają tylkojson przechwytujących.

0

Można użyć AjaxActionSupport zamiast ActionSupport w ten sposób ..

public class TestAjaxAction extends AJAXActionSupport { 

// wewnątrz tego trzeba wykonać metodę gdzie można uzyskać łatwo zarówno obiekt.

public void wykonać (HttpServletRequest prośba, HttpServletResponse odpowiedź) wyrzuca AJAXActionException {

+1

'AJAXActionSupport' nie należy do rdzenia S2. Przynajmniej daj FQN. –

Powiązane problemy