Struts2存在一个对象ActionContext(本质是Map),可以获得原生的request,response,ServletContext
还可以获得四大域对象(Map),以及param参数(Map)等等
ActionContext生命周期:每次请求都会创建一个与请求对应的ActionContext对象
绑定当前线程(ThreadLocal),直接从ThreadLocal中获得即可
请求处理完后,ActionContext对象销毁
第一种获得方式:
public String execute() throws Exception {
//request域=> map (struts2并不推荐使用原生request域)
//不推荐
Map<String, Object> requestScope = (Map<String, Object>) ActionContext.getContext().get("request");
//推荐
ActionContext.getContext().put("name", "requestTom");
//session域 => map
Map<String, Object> sessionScope = ActionContext.getContext().getSession();
sessionScope.put("name", "sessionTom");
//application域=>map
Map<String, Object> applicationScope = ActionContext.getContext().getApplication();
applicationScope.put("name", "applicationTom"); return SUCCESS;
}
注意:直接调用put方法在jsp中取值时候直接取即可${name},其他的(例如session):${sessionScope.name}
第二种获取方式(不推荐):
//不推荐
public String execute() throws Exception {
//原生request
HttpServletRequest request = ServletActionContext.getRequest();
//原生session
HttpSession session = request.getSession();
//原生response
HttpServletResponse response = ServletActionContext.getResponse();
//原生servletContext
ServletContext servletContext = ServletActionContext.getServletContext();
return SUCCESS;
}
看过源码发现,这里还是调用了ActionContext中的方法
不推荐的原因:Struts2创造的目的就是避免原生的servlet
第三种:
实现接口
package api; import javax.servlet.http.HttpServletRequest; import org.apache.struts2.interceptor.ServletRequestAware; import com.opensymphony.xwork2.ActionSupport; //如何在action中获得原生ServletAPI
public class Demo extends ActionSupport implements ServletRequestAware { private HttpServletRequest request; public String execute() throws Exception { System.out.println("原生request:"+request);
return SUCCESS;
} @Override
public void setServletRequest(HttpServletRequest request) {
this.request = request;
} }
response等等都是实现相应的接口即可
原理:servletConfig拦截器的intercept方法中获取了原生的servletAPI,本质上还是调用了ActionContext中的方法
实际开发中,常用的其实是第一种方式