• Struts2访问Servlet API的三种方式


    有时我们需要用到Request, Response, Session,Page, ServletContext这些我们以前常用的对象,那么在Struts2中怎么样使用到这些对象呢,通常有三种方式。

        *** 完全解耦合的方式

        *** 使用ServletActionContext中静态方法直接访问Servlet的API

        *** 使用接口注入的方式

    一、完全解耦合的方式
    如果使用该种方式,Struts2框架中提供了一个类,ActionContext类,该类中提供一些方法,通过方法获取Servlet的API。
    一些常用的方法如下:
     //private ActionContext context ;//该方法还可以取得值栈(getValueStack()),使用push(obj)往值栈中放数据    
        private Map request;  
        private Map session ;    
        private Map application ;  
        public LoginAction1(){  
           request = (Map)ActionContext.getContext().get("request");   //获取request  
           session = ActionContext.getContext().getSession();          //取得session  
           application = ActionContext.getContext().getApplication();   //取得application  
           request.put("r1","r1");  
           session.put("i1","i1");  
           application.put("a1","a1");  
           return SUCCESS;
         } 

    二、使用ServletActionContext中静态方法直接访问Servlet的API
    Struts2中提供了一个静态类,它里面的方法可以获取到我们的HttpServletResponse, HttpServletRequest。
    ServletActionContext具体的方法如下
            * getPageContext();
            * getRequest()
            * getResponse();
            * getServletContext(); //也就是application对象
    注意这里没有getSession(),我们可以通过request对象获取session对象
    private HttpServletRequest request;  
    private HttpSession session;  
    private ServletContext application;  
    public LoginAction(){  
    request = ServletActionContext.getRequest(); //获取request对象 
    session = request.getSession();  //由request获取session
    application = session.getServletContext();  //由session获取application
    }  

    三、使用接口注入的方式
    虽然Struts2提供了ActionContext来访问Servlet API,但是这种方式毕竟不能直接获取Servelt API实例,为了在Action中直接访问Servlet API,Struts2还提供了一系列接口。
    ServletContextAware   实现此接口后,可以取得ServletContext
    ServletRequestAware   实现此接口后,可以取得HttpServletRequest
    ServletResponseAware 实现此接口后,可以取得HttpServletResponse
    SessionAware         实现此接口后,可以取得HttpSession,注意,这里有点特殊,取得的是一个Map<String,Object> session,拦截器负责将session中存储的键值进行解析,并一一对应. 
    所以我们通常的做法是:
    public class BaseAction implements ServletResponseAware, ServletRequestAware,
       SessionAware {
    protected HttpServletResponse response;
    protected HttpServletRequest request;
    protected Map<String, Object> session;
    //省略了get和set方法

    //下面就可以直接使用上面 response,request和session

    }

    了让BaseAction能有验证的功能,并且不能被实例化,开发中我们会这样做:
    public abstract class BaseAction extends ActionSupport implements ServletResponseAware, ServletRequestAware, SessionAware 
    然后让我们每个模块的Action来继承这个BaseAction类,然后我们就可以在Action中直接使用Servelt的API了。
  • 相关阅读:
    Kubernetes实战:高可用集群的搭建和部署
    华为云MVP程云:知识化转型,最终要赋能一线
    支持60+数据传输链路,华为云DRS链路商用大盘点
    关于单元测试的那些事儿,Mockito 都能帮你解决
    深入原生冰山安全体系,详解华为云安全服务如何构筑全栈安全
    云小课|ModelArts Pro 视觉套件:零代码构建视觉AI应用
    FLINK重点原理与机制:内存(1)task之间的数据传输
    FLINK重点原理与机制:内存(2)网络流控及反压机制剖析(一)
    FLINK重点原理与机制:状态(3)两阶段提交
    FLINK重点原理与机制:状态(2)Flink的检查点算法CHECKPOINT
  • 原文地址:https://www.cnblogs.com/kangsir/p/6653268.html
Copyright © 2020-2023  润新知