• 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;
        }
    
    }
  • 相关阅读:
    c# Invalidate() Update() Refresh()的区别
    Winform重画ComboBox背景色
    窗口过程 Wndproc
    设置DatagridView的列头样式
    SQL2005 全文检索超时的解决方案
    winform 获取当前程序运行根目录
    Web API-如何将Controller的返回值转换成HTTP response消息
    ASP.NET Web API 如何通过程序控制返回xml还是json
    C# web api返回类型设置为json的两种方法
    多组 RadioButtonList 获取值
  • 原文地址:https://www.cnblogs.com/jepson6669/p/8523507.html
Copyright © 2020-2023  润新知