2013-02-26 13 views
5

Làm thế nào để có được cá thể ServletRequest trong hành động của tôi?Struts2: Làm thế nào để tôi nhận được cá thể ServletRequest trong ActionSupport

Tôi đã triển khai ServletRequestAware nhưng tôi không thể nhận đối tượng yêu cầu trong hành động.

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> 

Tôi đang thực hiện cuộc gọi sử dụng Ajax/Javascript:

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

JSON đối tượng:

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

Hành động:

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

} 

Trả lời

5

thử này

HttpServletRequest request = ServletActionContext.getRequest() ; 
+0

Trong khi làm việc này, việc thực hiện 'ServletRequestAware' được ưa thích. –

4
  1. Tại sao bạn cần yêu cầu servlet? Nó hiếm hoi nó là cần thiết.
  2. Lý do ServletRequestAware không hoạt động là bởi vì bạn loại bỏ các đánh chặn mà bộ nó thành hành động:
<action name="Cart" class="struts.cart.action.CartAction"> 
    <interceptor-ref name="json"> 
    <param name="contentType">application/json</param> 
    </interceptor-ref> 
    <result type="json"/> 
</action> 

Khi bạn thiết lập bất kỳ chặn trong cấu hình của một hành động mà bạn phải thiết lập tất cả chặn .

đây bạn đã loại bỏ tất cả các máy bay đánh chặn mặc định, bao gồm "ServletConfig" mà đặt ra yêu cầu cho ServletRequestAware hành động, và đang chạy chỉ các json đánh chặn.

0

Bạn có thể sử dụng thay vì AjaxActionSupport ActionSupport theo cách này ..

public class TestAjaxAction extends AJAXActionSupport { 

// bên này bạn phải thực hiện phương pháp mà bạn có thể nhận được một cách dễ dàng cả hai đối tượng.

public void thực hiện (yêu cầu HttpServletRequest, HttpServletResponse phản ứng) ném AJAXActionException {

+1

'AJAXActionSupport' không thuộc về lõi S2. Ít nhất là cho một FQN. –

Các vấn đề liên quan