Struts2-访问web 资源

有时候我们需要在 Action 中, 可以通过以下方式访问 web 的 HttpSession, HttpServletRequest, 
HttpServletResponse等资源

访问 web 资源有两种方式:与 Servlet API 解耦的访问方式,与 Servlet API 耦合的访问方式;
1:与Servlet API解耦的访问方式 :
为了避免与 Servlet API 耦合在一起, 方便 Action 做单元测试, Struts2 对 HttpServletRequest,HttpSession 和 ServletContext 进行了封装, 构造了 3 个 Map 对象来替代这 3 个对 象, 在 Action 中可以直接使用 HttpServletRequest, HttpServletSession, ServletContext 对应的 Map 对象来保存和读取数据. 
1.1 通过 ActionContext 访问 Web 资源,ActionContext 是 Action 执行的上下文对象, 在 ActionContext 中保存了Action 执行所需要的所有对象, 包括 parameters, request,       session, application 等. 

以下为实现Action代码:

		package com.cgc.struts.test;

		import java.util.Map;

		import org.apache.struts2.dispatcher.SessionMap;

		import com.opensymphony.xwork2.ActionContext;

		/**
		 * <一句话功能简述>
		 * <功能详细描述>
		 * 
		 * @author  姓名 工号
		 * @version  [版本号, 2015-10-12]
		 * @see  [相关类/方法]
		 * @since  [产品/模块版本]
		 */
		public class ActionContextTestAction
		{
			public String execute()
			{
				//获取ActionContext对象
				ActionContext actionContext = ActionContext.getContext();
				
				//获取application对应的Map,并向其中添加一个属性
				Map applicationMap = actionContext.getApplication();
				applicationMap.put("applicationKey", "applicationValue");
				
				System.out.println(applicationMap.get("A"));
				
				//获取session并设置一个属性
				Map sessionMap = actionContext.getSession();
				sessionMap.put("sessionKey", "SessionValue");
				
				//是session失效,调用SessionMap的invalidate方法可以使session失效
				if(sessionMap instanceof SessionMap)
				{
					SessionMap sm = (SessionMap)sessionMap;
				   // sm.invalidate();
				}
				
				//获取request 并设置一个属性
				Map requestMap = (Map)actionContext.get("request");
				requestMap.put("requestKey","requestValue" );
				
				//获取 请求参数对应的Map,并获取指定的参数值
				//键值对    键是参数名  值是字符串数组
				//注意:1:getParameters返回  Map,而不是Map
				//因此要将其转成String[],
				//2:parameters的map只能读入  不能写入       不起作用
				
				Map parameters = actionContext.getParameters();
				String[] s = (String[])parameters.get("name");
				System.out.println(s[0]);
				
				parameters.put("age", 12);
				
				return "success";
			}
		}
1.2通过实现 Aware 接口访问 Web 资源

Action 类通过可以实现某些特定的接口, 让 Struts2 框架在运行时向 Action 实例注入 parameters, request, session 和 application 对应的 Map 对象: 

Demo代码如下:

public class AwareTestAction implements ApplicationAware,SessionAware,RequestAware,ParameterAware
		{
			private Map application = null;
			private Map session = null;
			private Map request = null;
			private Map parameter = null;
			
			public String excute()
			{
				//向application中设置一个属性
				application.put("applicationKey00","applicationValue00" );
				//从application中获取一个属性
				System.out.println(">"+application.get("A"));
				
				session.put("session00", "sessionValue00");
				request.put("request00", "requestValue00");
				parameter.put("parameter00", new String[]{"parameterValue00"});
				
				return "success";
			}

			/**
			 * 重载方法
			 * @param arg0
			 */
			@Override
			public void setApplication(Map application)
			{
				this.application = application;
			}

			/**
			 * 重载方法
			 * @param arg0
			 */
			@Override
			public void setParameters(Map parameter)
			{
				this.parameter = parameter;
			}

			/**
			 * 重载方法
			 * @param arg0
			 */
			@Override
			public void setRequest(Map request)
			{
				this.request = request;
			}

			/**
			 * 重载方法
			 * @param arg0
			 */
			@Override
			public void setSession(Map session)
			{
				this.session = session;
			}
		}
相比而言,使用实现接口的方式较好

2.与 Servlet 耦合的访问方式,既然有非耦合的方式,为什么我们还要用耦合的方式,是因为有时候我们需要直接对Web资源操作比如servlet,HttpServletRequest,直接访问 Servlet API 将使 Action 与 Servlet 环境耦合在一起,  测试时需要有 Servlet 容器, 不便于对 Action 的单元测试. 
2.1:从ServletActionContext中获取
代码如下:

	public class ServletActionContextTestAction
		{
			public String execute()
			{
				HttpServletRequest request = ServletActionContext.getRequest();
				HttpSession session = request.getSession();
				ServletContext servletContext = ServletActionContext.getServletContext();
				
				return "success";
			}
		}
2.2通过实现 ServletRequestAware, ServletContextAware 等接口的方式
代码如下:

		/**
		 * <一句话功能简述>通过实现ServletXXXAware接口的方式,可以由Struts2注入需要的Servlet相关对象 <功能详细描述>
		 * ServletRequestAware:注入HttpServletRequest对象
		 * ServletContextAware:注入ServletContext对象
		 * ServletResponseAware:注入HttpServletResponse对象
		 * 
		 * @author 姓名 工号
		 * @version [版本号, 2015-10-12]
		 * @see [相关类/方法]
		 * @since [产品/模块版本]
		 */
		public class ServletAwareAction implements ServletRequestAware, ServletContextAware, ServletResponseAware
		{
			private HttpServletRequest request = null;
			
			private HttpServletResponse response = null;
			
			private ServletContext servletContext = null;
			
			/**
			 * 重载方法
			 * 
			 * @param arg0
			 */
			@Override
			public void setServletRequest(HttpServletRequest request)
			{
				request = this.request;
			}
			
			/**
			 * 重载方法
			 * 
			 * @param arg0
			 */
			@Override
			public void setServletResponse(HttpServletResponse response)
			{
				this.response = response;
			}
			
			/**
			 * 重载方法
			 * 
			 * @param arg0
			 */
			@Override
			public void setServletContext(ServletContext servletContext)
			{
				this.servletContext = servletContext;
			}
			
		}

你可能感兴趣的:(框架-Struts)