zoukankan      html  css  js  c++  java
  • 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了。
  • 相关阅读:
    Object-C中
    实例变量可见度修饰符
    Object-C 类和对象
    C语言中线程和进程的区别
    动态内存分配
    C语言中union关键字
    C语言结构体
    const define static extern 关键词详解
    基于TensorFlow Object Detection API进行迁移学习训练自己的人脸检测模型(一)
    Ubuntu18.04+CUDA9.0+cuDNN7.1.3+TensorFlow1.8 安装总结
  • 原文地址:https://www.cnblogs.com/kangsir/p/6653268.html
Copyright © 2011-2022 走看看