Struts2访问Servlet API的三种方式

 

方式一: 让当前 Action 实现感知接口:

ServletRequestAware:  感知HttpServletRequest对象;

ServletResponseAware:感知HttpServletResponse对象;

ServletContextAware:    感知ServletContext对象;

struts2框架(servletConfig拦截器(优先于Action执行))会判断当前Action是否实现感知接口,不推荐,和ServletAPI耦合严重

//实现感知接口方式: 和ServletAPI耦合严重
/*
 * struts2框架(servletConfig拦截器(优先于Action执行))会判断当前Action是否实现感知接口, 
 *	是则通过set方法获取对应的ServletAPI
*/
public class UserAction extends ActionSupport implements ServletRequestAware,ServletResponseAware,ServletContextAware{
	HttpServletRequest request;
	HttpServletResponse response;
	ServletContext application;
	
	public String login() {
		Map<String, String[]> params = request.getParameterMap();
		for (Map.Entry<String, String[]> entry : params.entrySet()) {
			System.out.println("key:" + entry.getKey() + ", value:" + Arrays.toString(entry.getValue()));
		}
		return "success";
		
	}
	@Override
	public void setServletRequest(HttpServletRequest arg0) {
		this.request = arg0;
	}
	@Override
	public void setServletResponse(HttpServletResponse response) {
		this.response = response;
	}
	@Override
	public void setServletContext(ServletContext context) {
		this.application = context;
	}
}

 

方式二: 通过ServletActionContext工具类:

通过ServletActionContext类中的静态方法,得到Servlet相关的Api

如果用参数来接受 依然和ServletAPI有耦合, 不接受直接用则不耦合。推荐使用

//通过ServletActionContext工具类: 和ServletAPI耦合严重
public class UserAction extends ActionSupport {
	public String login() {
		// 如果用参数来接受 依然和ServletAPI有耦合, 不接受直接用则不耦合。。
		//HttpServletRequest request = ServletActionContext.getRequest();
		Map<String, String[]> params = ServletActionContext.getRequest().getParameterMap();
		for (Map.Entry<String, String[]> entry : params.entrySet()) {
			System.out.println("key:" + entry.getKey() + ", value:" + Arrays.toString(entry.getValue()));
		}
        
		//获得 session对象
		ServletActionContext.getRequest().getSession().setAttribute("username", "admin");;
				
		//获得response对象
		ServletActionContext.getResponse();
		
		//获得application对象
		ServletActionContext.getServletContext();
		
		//获取当前项目的绝对路径
		String realPath = ServletActionContext.getServletContext().getRealPath("");
		System.out.println(realPath);
                //获得远程的ip地址: 127.0.0.1
		System.out.println(ServletActionContext.getRequest().getRemoteAddr());
		return "success";
	}
}

 

方式三: 通过ActionContext工具类:

Struts2将作用域对象重新使用Map集合进行了封装,所以现在操作作用域中的共享数据就是直接操作对应的Map集合, 存取值比较方便,  推荐使用

在ActionContext中把request,session,application三大作用域都作为Map对象.

1):获取请求参数.

     原始:Map<String,String[]> params = request.getParameterMap();

     现在:Map<String,String[]> params = ctx.getParameters();

2):操作request作用域:

     原始:request.setAttribute(String name, Object value);   

Object val = request.getAttribtue(String name);

     现在:ctx.put(String key,Object value);                                

Object val = ctx.get(String name);

3):操作session作用域:

     原始:HttpSession  session =request.getSession();

     现在:Map<String,Object> session = ctx.getSession();

4):操作servletContext(application)作用域:

     原始:ServletContext ctx = request.getServletContext();

     现在:Map<String,Object> app = ctx.getApplication();

//通过ActionContext工具类: 完全和ServletAPI不耦合
public class UserAction extends ActionSupport {
	public String login() {
		//获取ActionContext对象
		ActionContext actionContext = ActionContext.getContext();
		//获取所有请求值
		Map<String, Object> params = actionContext.getParameters();
		for (Map.Entry<String, Object> entry : params.entrySet()) {
			System.out.println("key:" + entry.getKey() + ", value:" + Arrays.toString((String[])entry.getValue()));
		}
		
		//获得request作用域中的值
		Map<String, Object> request = (Map<String, Object>) actionContext.get("request");
		
		Map<String, Object> session = actionContext.getSession();
		session.put("username", "admin");
		session.get("username");
		
		Map<String, Object> application = actionContext.getApplication();
		
		return "success";
	}
}

 

 

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值