request为null问题

今天碰到一个问题,将request变量写在外面,函数中获取request一直是null;
如果将[code="java"]
HttpServletRequest request = ServletActionContext.getRequest();
HttpServletResponse response = ServletActionContext.getResponse(); [/code]
写在函数里,就可以获取到request。
具体代码如下:
[code="java"]public class IOC extends ActionSupport {
private String message;
private HttpServletRequest request = ServletActionContext.getRequest();
private HttpServletResponse response = ServletActionContext.getResponse();

public String getMessage() {
    return message;        
}

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

public void setServletResponse(HttpServletResponse response) {
    this.response = response;
}

public String execute() {             
    HttpSession session = request.getSession();

    StringBuffer sb =new StringBuffer("Message from request: ");
    sb.append(request.getParameter("msg"));
    sb.append("<br>Response Buffer Size: ");
    sb.append(response.getBufferSize());
    sb.append("<br>Session ID: ");
    sb.append(session.getId());

    message = sb.toString();
    return SUCCESS;
}

}[/code]
请各位高手看看这是什么原因???

你可以把它定义到外面,但是值要到方法里面获取。你这样放外面,类初始化的时候就会去执行,但是这时候还没有用户请求过来,当然是空啦!!!到了方法里面,就不一样了,只有当用户请求过来时,才会去执行具体的方法,这时候Request就不空了。
[code="java"]
private HttpServletRequest request = null;

private HttpServletResponse response = null;

public String execute() {
this.request = ServletActionContext.getRequest();
}

[/code]

类初始化的时候还没有Request,到请求来了才有Request。

局部变量与成员变量的差别!

[quote]那这个放在函数里面和外面怎么效果就不一样了啊???[/quote]

成员变量先初始化,成员方法后初始化。

建议写一个Action基类BaseAction
[code="java"]
package dangerous.action;

import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import javax.servlet.http.HttpSession;

import org.apache.struts2.ServletActionContext;

import com.opensymphony.xwork2.ActionSupport;

/**

  • simple introduction
  • detailed comment
  • @author pKF42922 Mar 10, 2011
  • @see
  • @since 1.0
    */
    public class BaseAction extends ActionSupport
    {

    /**

    • */ private static final long serialVersionUID = 1L;

    protected HttpSession getSession()
    {
    return getRequest().getSession();
    }

    protected HttpServletRequest getRequest()
    {
    return ServletActionContext.getRequest();
    }

    protected HttpServletResponse getResponse()
    {
    return ServletActionContext.getResponse();
    }

}

[/code]