Struts2(二)使用Struts2访问ServletAPI对象

        在前面的示例中Struts2的Action中并没有使用到ServletAPI对象,但是在实际应用中我们往往会用到ServletAPI对象,比如用户登录成功后将用户信息保存在会话中。所以为了解决这个问题,Struts2提供了多种方式来访问ServletAPI对象,总的来说分为两大类:
        使用与ServletAPI解耦的方式
        使用与ServletAPI耦合的方式
一、使用与ServletAPI解耦的方式
1.使用ActionContext类获取ServletAPI对应的Map对象

        为了避免与Servlet耦合在一起,方便Action类的测试,Struts2提供了 普通的Map对象替代了ServletAPI中的对象(HttpServletRequest、HttpSession、ServletContext等)。通过ActionContext类可以在Action类中可以直接访问他们对应的Map对象。 com.opensymphony.xwork2.ActionContext类是Action执行的上下文,可以通过下面的方式获取ServletAPI对应的Map对象
①public Map getSession():获取HttpSession对应的Map对象
②public Map getApplication():获取ServletContext对应的Map对象
③public Object get(Object key):ActionContext类没有提供getRequest()这样的方法来获取HttpServletRequest对应的Map对象,只能使用此方法并传递一个参数来表示获取对应的对象

如:
  1. //ActionContext类不能通过new的方式创建对象,其提供了getContext()方法  
  2.         ActionContext ac=ActionContext.getContext();  
  3.         //获取Session对应的Map对象  
  4.         Map<String,Object> session=ac.getSession();  
  5.         //获取Request对应的Map对象  
  6.         Map<String,Object> request=(Map<String,Object>)ac.get("request");  
  7.         //获取application对应的Map对象  
  8.         Map<String,Object> application=ac.getApplication();  
  9.           
  10.         //放入数据  
  11.         session.put("key""value");  
  12.         //.....  
2.实现接口来获取Map对象
        除了使用ActionContext类来获取Map对象还可以使用实现接口的方式,实现接口后Struts2在运行时将会自动注入ServletAPI对应的Map对象
①org.apache.struts2.interceptor.RequestAware
    注入request对应的Map对象,该接口只有一个方法:public void setRequest(Map<String,Object> request)
②org.apache.struts2.interceptor.SessionAware
    注入session对应的Map对象,该接口只有一个方法:public void setSession(Map<String,Object> session);
③org.apache.struts2.interceptor.ApplicationAware
    注入application对应的Map对象,该接口只有一个方法:public void setApplication(Map<String,Object> application);

如:

  1. package com.wzj.action;  
  2.   
  3. import java.util.Map;  
  4.   
  5. import org.apache.struts2.interceptor.ApplicationAware;  
  6. import org.apache.struts2.interceptor.RequestAware;  
  7. import org.apache.struts2.interceptor.SessionAware;  
  8.   
  9. import com.opensymphony.xwork2.ActionSupport;  
  10.   
  11. public class HelloWorldAction extends ActionSupport implements RequestAware,SessionAware,ApplicationAware{  
  12.     /** 
  13.      * 定义成员变量 
  14.      */  
  15.     private Map<String,Object> request;  
  16.     private Map<String,Object> session;  
  17.     private Map<String,Object> application;  
  18.     /** 
  19.      * 当Struts2处理请求时,在默认配置下调用的方法 
  20.      */  
  21.     @Override  
  22.     public String execute() throws Exception {  
  23.           
  24.         //执行时Map对象已被框架自动赋值  
  25.         request.put("key""value");  
  26.         session.put("key""value");  
  27.         application.put("key""value");  
  28.           
  29.         return SUCCESS;  
  30.     }  
  31.       
  32.   
  33.     @Override  
  34.     public void setApplication(Map<String, Object> _request) {  
  35.         this.request=_request;  
  36.     }  
  37.     @Override  
  38.     public void setSession(Map<String, Object> _session) {  
  39.         this.session=_session;  
  40.     }  
  41.     @Override  
  42.     public void setRequest(Map<String, Object> _application) {  
  43.         this.application=_application;  
  44.     }  
  45.       
  46. }  
解释:注入,其实就是通过框架自动对Action中的属性赋值。
二、使用与ServletAPI耦合的方式
1.通过ServletActionContext类访问ServletAPI对象

        与ServletAPI解耦的方式只能获取到ServletAPI对象对应的Map对象,并不能真正的获取到ServletAPI对象,在开发中避免不了要使用对象中的其他方法,此时便可以使用org.apache.struts2.ServletActionContext类来获取API对象,该类是ActionContext的子类,并提供了以下方法:
①public static HttpServletRequest getRequest():得到HttpServletRequest对象
②public static ServletContext getServletContext():得到ServletContext对象
③public static HttpServletResponse getResponse():得到HttpServletResponse对象

注意:
        此类中并没有提供getSession方法,因为session对象可以通过request.getSession()来获取

如:

  1. HttpServletRequest request=ServletActionContext.getRequest();  
  2.         ServletContext application=ServletActionContext.getServletContext();  
  3.         HttpServletResponse response=ServletActionContext.getResponse();  
  4.         //session通过request获取  
  5.         HttpSession session=request.getSession();  
2.实现接口来访问ServletAPI对象
        类似于实现RequestAware、SessionAware等接口的方式,Struts也可以通过实现以下接口来访问ServletAPI对象:
①org.apache.struts2.interceptor.ServletRequestAware
    获取HttpServletRequest对象
②org.apache.struts2.interceptor.ServletResponseAware
    获取HttpServletResponse对象
③ org.apache.struts2.util.ServletContextAware
    获取ServletContext对象

如:

  1. package com.wzj.action;  
  2.   
  3. import javax.servlet.ServletContext;  
  4. import javax.servlet.http.HttpServletRequest;  
  5. import javax.servlet.http.HttpServletResponse;  
  6.   
  7. import org.apache.struts2.interceptor.ServletRequestAware;  
  8. import org.apache.struts2.interceptor.ServletResponseAware;  
  9. import org.apache.struts2.util.ServletContextAware;  
  10.   
  11. import com.opensymphony.xwork2.ActionSupport;  
  12.   
  13. public class HelloWorldAction extends ActionSupport implements ServletRequestAware,ServletResponseAware,ServletContextAware{  
  14.       
  15.     private HttpServletRequest request;  
  16.     private HttpServletResponse response;  
  17.     private ServletContext application;  
  18.     /** 
  19.      * 当Struts2处理请求时,在默认配置下调用的方法 
  20.      */  
  21.     @Override  
  22.     public String execute() throws Exception {  
  23.           
  24.         //....在这里正常使用request,response,application等对象就可以了          
  25.           
  26.         return SUCCESS;  
  27.     }  
  28.   
  29.     @Override  
  30.     public void setServletContext(ServletContext arg0) {  
  31.         this.application=arg0;  
  32.     }  
  33.     @Override  
  34.     public void setServletResponse(HttpServletResponse arg0) {  
  35.         this.response=arg0;  
  36.     }  
  37.     @Override  
  38.     public void setServletRequest(HttpServletRequest arg0) {  
  39.         this.request=arg0;  
  40.     }  

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值