企业🤖AI智能体构建引擎,智能编排和调试,一键部署,支持私有化部署方案 广告
## 三种方式 1. 通过ActionContext. 2. 实现特定接口的方式. 3. 通过ServletActionContext对象静态方法实现. ## 通过ActionContext(数据中心) ActionContext是application域,session域,request域三域合一.每次请求时都会创建一个与请求对应的ActionContext.请求处理完ActionContext销毁. struts2将ActionContext创建好之后,将ActionContext与当前线程绑定,我们 要获得ActionContext只需从ThreadLocal中获取即可. ~~~ ActionContext context = ActionContext.getContext(); //获取application域 Map<String, Object> application = context.getApplication(); //获取session域 Map<String, Object> session = context.getSession(); //获取request域(struts2不推荐使用request域,因为request生命周期和ActionContext是一样的) Map<String, Object> request = (Map<String, Object>) context.get("request"); //推荐使用下面的方式 context.put("name", "jack"); ~~~ ## ServletActionContext对象静态方法实现(不推荐) ~~~ //获取原生request ServletActionContext.getRequest(); //获取原生response ServletActionContext.getResponse(); //获取原生servletContext ServletActionContext.getServletContext(); //获取原生session ServletActionContext.getRequest(); ~~~ ## 实现特定接口的方式(不推荐) 必须把request和response放在私有的属性中其他方法才能使用. 但是servlet是单实例的.会引发线程危机.所以我们几乎不在servlet中定义成员属性. ~~~ public class HelloAction extends ActionSupport implements ServletRequestAware, ServletResponseAware { private javax.servlet.http.HttpServletRequest httpServletRequest; private HttpServletResponse httpServletResponse; @Override public void setServletRequest(javax.servlet.http.HttpServletRequest httpServletRequest) { } @Override public void setServletResponse(HttpServletResponse httpServletResponse) { } } ~~~ ## 线程危机:什么情况下有线程危机? 当多个线程操作了共享的数据(单实例),就容易发生线程安全问题. ## Action是单实例还是多实例? 多实例.以下例子可以证明,每次访问构造方法都会执行.所以是多实例. ~~~ public class HelloAction extends ActionSupport { public HelloAction(){ System.out.println("action create"); } public String index() { ActionContext context = ActionContext.getContext(); return SUCCESS; } } ~~~