2013-02-26 14 views
5

如何在我的操作中獲得ServletRequest實例?Struts2:如何在ActionSupport中獲取ServletRequest實例

我實現ServletRequestAware但我沒能獲得請求對象的動作。

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> 

我正在使用Ajax/JavaScript調用:

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

JSON對象:

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

操作:

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

} 

回答

5

試試這個

HttpServletRequest request = ServletActionContext.getRequest() ; 
+0

雖然此方法有效,執行'ServletRequestAware'是優選的。 – 2013-02-26 16:20:53

4
  1. 你爲什麼需要 servlet的請求?這很少需要。
  2. 原因ServletRequestAware不工作是因爲你刪除了其設置到行動攔截器:
<action name="Cart" class="struts.cart.action.CartAction"> 
    <interceptor-ref name="json"> 
    <param name="contentType">application/json</param> 
    </interceptor-ref> 
    <result type="json"/> 
</action> 

當你在一個動作的配置設置任何攔截器必須設置所有攔截。

這裏你刪除所有的默認攔截,其中包括「ServletConfig類」,它設置了ServletRequestAware行動的請求,並正在運行json攔截。

0

可以以這種方式使用AjaxActionSupport代替ActionSupport的..

public class TestAjaxAction extends AJAXActionSupport { 

//這裏面你有執行方法,你可以很容易地獲得這兩個對象。

公共無效執行(HttpServletRequest的請求,HttpServletResponse的 響應)拋出AJAXActionException {

+1

'AJAXActionSupport'不屬於S2核心。至少給一個FQN。 – 2014-01-28 09:10:37