今天碰到一个问题,将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;
/**
@since 1.0
*/
public class BaseAction extends ActionSupport
{
/**
protected HttpSession getSession()
{
return getRequest().getSession();
}
protected HttpServletRequest getRequest()
{
return ServletActionContext.getRequest();
}
protected HttpServletResponse getResponse()
{
return ServletActionContext.getResponse();
}
}
[/code]