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对象,只能使用此方法并传递一个参数来表示获取对应的对象

如:
//ActionContext类不能通过new的方式创建对象,其提供了getContext()方法
		ActionContext ac=ActionContext.getContext();
		//获取Session对应的Map对象
		Map<String,Object> session=ac.getSession();
		//获取Request对应的Map对象
		Map<String,Object> request=(Map<String,Object>)ac.get("request");
		//获取application对应的Map对象
		Map<String,Object> application=ac.getApplication();
		
		//放入数据
		session.put("key", "value");
		//.....
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);

如:

package com.wzj.action;

import java.util.Map;

import org.apache.struts2.interceptor.ApplicationAware;
import org.apache.struts2.interceptor.RequestAware;
import org.apache.struts2.interceptor.SessionAware;

import com.opensymphony.xwork2.ActionSupport;

public class HelloWorldAction extends ActionSupport implements RequestAware,SessionAware,ApplicationAware{
	/**
	 * 定义成员变量
	 */
	private Map<String,Object> request;
	private Map<String,Object> session;
	private Map<String,Object> application;
	/**
	 * 当Struts2处理请求时,在默认配置下调用的方法
	 */
	@Override
	public String execute() throws Exception {
		
		//执行时Map对象已被框架自动赋值
		request.put("key", "value");
		session.put("key", "value");
		application.put("key", "value");
		
		return SUCCESS;
	}
	

	@Override
	public void setApplication(Map<String, Object> _request) {
		this.request=_request;
	}
	@Override
	public void setSession(Map<String, Object> _session) {
		this.session=_session;
	}
	@Override
	public void setRequest(Map<String, Object> _application) {
		this.application=_application;
	}
	
}

解释:注入,其实就是通过框架自动对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()来获取

如:

HttpServletRequest request=ServletActionContext.getRequest();
		ServletContext application=ServletActionContext.getServletContext();
		HttpServletResponse response=ServletActionContext.getResponse();
		//session通过request获取
		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对象

如:

package com.wzj.action;

import javax.servlet.ServletContext;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;

import org.apache.struts2.interceptor.ServletRequestAware;
import org.apache.struts2.interceptor.ServletResponseAware;
import org.apache.struts2.util.ServletContextAware;

import com.opensymphony.xwork2.ActionSupport;

public class HelloWorldAction extends ActionSupport implements ServletRequestAware,ServletResponseAware,ServletContextAware{
	
	private HttpServletRequest request;
	private HttpServletResponse response;
	private ServletContext application;
	/**
	 * 当Struts2处理请求时,在默认配置下调用的方法
	 */
	@Override
	public String execute() throws Exception {
		
		//....在这里正常使用request,response,application等对象就可以了		
		
		return SUCCESS;
	}

	@Override
	public void setServletContext(ServletContext arg0) {
		this.application=arg0;
	}
	@Override
	public void setServletResponse(HttpServletResponse arg0) {
		this.response=arg0;
	}
	@Override
	public void setServletRequest(HttpServletRequest arg0) {
		this.request=arg0;
	}
}


  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值