03-struts2获得servetAPI

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;
    }
    
}

通过 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;
    }

}
原文地址:https://www.cnblogs.com/jepson6669/p/8523507.html