您的位置:首页 > 编程语言 > Java开发

03-struts2获得servetAPI

2018-03-07 16:57 323 查看

1 原理

三个域合一的时候相同的键值对以小的域为准。
ActionContext 对象创建:每次请求的时候都会创建一个与请求对应的 ActionContext 对象。
ActionContext 销毁:请求处理完 ActionContext 销毁。

ActionContext 的生命周期由其中生命周期最短的 request 域限制了。

问题 1:application 不应该是一个项目种只有一个吗?你每次请求都会创建 application 域
吗?

答:ActionContext 不能反过来影响其它域的生命周期。ActionContext 每次的创建只是负
责把以前那些域收集过来,然后销毁的时候只是仅仅销毁 ActionContext,并没有销毁掉
ActionContext 域。域还是以前的域,下次创建 ActionContext 对象的时候,再把
ActionContext 域取出来,然后收录进来。

问题 2:项目种可能同时存在多个 ActionContext 对象吗?

答:对。一个请求创建一个,如果是 10 个请求,就会创建 10 个 ActionContext 对象。
问题 3:如何获得当前请求的 ActionContext 对象?
答:struts2 设计的是,将 ActionContext 对象创建好后,将 ActionContext 与当前线程绑
定。我们要获得 ActionContext 对象,只需要从 ThreadLocal 获取即可。

2 通过 ActionContext

package www.test.b_api;

import java.util.Map;

import com.opensymphony.xwork2.ActionContext;
import com.opensymphony.xwork2.ActionSupport;

//如何在action中获取原生的serveltAPI
public class Demo5Action extends ActionSupport {

public String execute() throws Exception {

//request域===>Map (Struts2并不推荐使用原生的request域)
//不推荐
Map<String, Object> requestScope = (Map<String, Object>) ActionContext.getContext().get("request");

//推荐
ActionContext.getContext().put("name", "ActionContextTom");

//获得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;
}

}

3  通过 ServletActionContext

package www.test.b_api;

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

import org.apache.struts2.ServletActionContext;

import com.opensymphony.xwork2.ActionSupport;

//如何在action中获得原生ServletAPI
public class Demo6Action extends ActionSupport {

//并不推荐
public String execute() throws Exception {
//获得原生的request
HttpServletRequest request = ServletActionContext.getRequest();
//原生的session
HttpSession session = request.getSession();
//原生的application
ServletContext servletContext = ServletActionContext.getServletContext();

return SUCCESS;
}

}

4 通过实现接口方式

package www.test.b_api;

import java.util.Map;

import javax.servlet.http.HttpServletRequest;

import org.apache.struts2.interceptor.ServletRequestAware;

import com.opensymphony.xwork2.ActionSupport;

public class Demo7Action extends ActionSupport implements ServletRequestAware {

private HttpServletRequest request;

@Override
public String execute() throws Exception {
System.out.println("原生的request:"+request);
request.setAttribute("name", "zhagnsan");
return SUCCESS;
}

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

}

 

内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: