5

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

}   
4

3 回答 3

6

尝试这个

HttpServletRequest request = ServletActionContext.getRequest() ;
于 2013-02-26T15:31:46.990 回答
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

于 2013-02-26T16:23:55.650 回答
0

您可以通过这种方式使用 AjaxActionSupport 而不是 ActionSupport..

public class TestAjaxAction extends AJAXActionSupport {

//在这里面你有执行方法,你可以很容易地得到两个对象。

公共无效执行(HttpServletRequest 请求,HttpServletResponse 响应)抛出 AJAXActionException {

于 2014-01-28T07:17:11.747 回答