Struts2访问Servlet API的三种方式

内容源自:Struts2访问Servlet API的三种方式

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

一、完全解耦合的方式
如果使用该种方式,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了。

猜你喜欢

转载自www.cnblogs.com/xym4869/p/8963839.html