Struts2获取ServletAPI的三种方式

方式1:让Action类实现接口.

ServletRequestAware:HttpServletRequest对象;

ServletResponseAware:HttpServletResponse对象;

ServletSessionAware:HttpSession对象;

package com.it.action;

import javax.servlet.ServletContext;
import javax.servlet.ServletRequest;
import javax.servlet.ServletResponse;
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;
import com.sun.net.httpserver.HttpContext;
//方式1:让Action类实现感知接口.
//
//ServletRequestAware:HttpServletRequest对象;
//
//ServletResponseAware:HttpServletResponse对象;
//
//ServletSessionAware:HttpSession对象;
import com.sun.org.apache.regexp.internal.recompile;

public class ActionServlet1 extends ActionSupport implements ServletRequestAware,ServletResponseAware,ServletContextAware{
	private static final long serialVersionUID = 1L;
	HttpServletRequest request;
	HttpServletResponse response;
	ServletContext context;
	@Override
	public String execute() throws Exception {
		response.setContentType("text/html;charset=utf-8");
		//获取页面数据
		String name = request.getParameter("username");
		System.out.println(name);
		//写响应页面数据
		//response.getWriter().print("adfg");
	    // 往域中存数据 到页面展示
		request.setAttribute("msg1","request");
		request.getSession().setAttribute("msg2", "session");
		context.setAttribute("msg3", "servletcontext");
		return "ok";
	}
	@Override
	public void setServletRequest(HttpServletRequest request) {
		// TODO Auto-generated method stub
		this.request=request;
	}
	@Override
	public void setServletResponse(HttpServletResponse response) {
		// TODO Auto-generated method stub
		this.response=response;
	}
	@Override
	public void setServletContext(ServletContext context) {
		// TODO Auto-generated method stub
		this.context=context;
	}
	
}

存在的问题,和ServletAPI耦合严重;

问题:Action中感知接口的方法是谁在调用?----->servletConfig拦截器(优先于Action执行)

 

方式2:通过ServletActionContext工具类.

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

这种方式直接通过ServletActionContext的静态方法就可以获取Servlet的API对象,操作和理解非常简单.

在开发中很多人都喜欢使用,但是依然是Action与ServletAPI有耦合.

package com.it.action;

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

import org.apache.struts2.ServletActionContext;

import com.opensymphony.xwork2.ActionSupport;

//方式2:通过ServletActionContext工具类.
//
//通过ServletActionContext类中的静态方法,得到Servlet相关的Api
//
//这种方式直接通过ServletActionContext的静态方法就可以获取Servlet的API对象,操作和理解非常简单.
//
//在开发中很多人都喜欢使用,但是依然是Action与ServletAPI有耦合.

public class ActionServlet2 extends ActionSupport  {
	@Override
	public String execute() throws Exception {
		//获取response
		HttpServletResponse response = ServletActionContext.getResponse();
		//response.getWriter().print("response");
		response.setContentType("text/html;charset=utf-8");
		
		//获取request
		HttpServletRequest request = ServletActionContext.getRequest();
		String name = request.getParameter("username");
		System.out.println(name);
		
		
		//获取ServletContext
		ServletContext context = ServletActionContext.getServletContext();
		
		// 封装数据到域对象 到页面展示
		request.setAttribute("msg1", "request");
		request.getSession().setAttribute("msg2", "session");
		context.setAttribute("msg3", "servletContext");
		return "ok";
	}
}

方式3:通过ActionContext工具类

 

Struts2将作用域对象重新使用Map集合进行了封装,所以现在操作作用域中的共享数据就是直接操作对应的Map集合

理解ActionContext:从字面上分析,表示Action的上下文对象.

ActionContext封装每一次请求的相关信息.

 

此时要获取请求对象实际上就是在获取ActionContext对象(因为ActionContext是对请求数据的封装,相当于就是一个请求对象)

可以使用ActionContext中的非静态方法来获取Servlet相关的API

所以需要获取到ActionContext的对象

获取ActionContext对象:

 ActionContext  ac= ActionContext.getContext();

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

1):获取请求参数.

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

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

2):操作request作用域:

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

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

     原始:Object val = request.getAttribtue(String name);                  

     现在:   Object val = ac.get(String name);

3):操作session作用域:

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

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

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

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

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

package com.it.action;
//方式3:通过ActionContext工具类
//Struts2将作用域对象重新使用Map集合进行了封装,所以现在操作作用域中的共享数据就是直接操作对应的Map集合
//理解ActionContext:从字面上分析,表示Action的上下文对象.
//ActionContext封装每一次请求的相关信息.
//此时要获取请求对象实际上就是在获取ActionContext对象(因为ActionContext是对请求数据的封装,相当于就是一个请求对象)
//可以使用ActionContext中的非静态方法来获取Servlet相关的API
//所以需要获取到ActionContext的对象
//获取ActionContext对象:
//ActionContext  ac= ActionContext.getContext();
//在ActionContext中把request,session,application三大作用域都作为Map对象.

import java.util.Arrays;
import java.util.Map;

import javax.servlet.http.HttpSession;

import org.apache.struts2.ServletActionContext;

import com.opensymphony.xwork2.ActionContext;
import com.opensymphony.xwork2.ActionSupport;

public class ActionServlet3 extends ActionSupport {
	@Override
	public String execute() throws Exception {
		//获取session的底层集合
		ActionContext actionContext = ActionContext.getContext();
		Map<String, Object> map = actionContext.getSession();
		map.put("abcd", 45646);//等于:session.setAttribute("abcd", 45646);
		//验证
		HttpSession session = ServletActionContext.getRequest().getSession();
		Object obj = session.getAttribute("abcd");
		System.out.println(obj);//45646
		//获取页面数据
		Map<String, Object> parameters = actionContext.getParameters();//类似request.getParameterMap();
		for(String key:parameters.keySet()) {
			System.out.println(key+":"+Arrays.toString((String[])parameters.get(key)));
		}
		
		// 封装封装到域对象 页面展示
		actionContext.put("msg1", "requset");
		actionContext.getSession().put("msg2", "session....");
		actionContext.getApplication().put("msg3", "servletContext..");
		return "ok";
	}

	
}

猜你喜欢

转载自blog.csdn.net/qq_43122641/article/details/89261481
今日推荐