以下为实现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;
}
}