其实就是获取PAGE/SESSION/APPLICATION的MAP对象,包括parameters,request
两种方式1.和SERVLET API 解耦的方式:只能访问有限的Servlet API对象,切只能访问有限的方法
>使用ActionContext
例如:
package com.ben.strut2.action;
//使用ActionContext
import java.util.Map;
import com.opensymphony.xwork2.ActionContext;
public class TesActionContextAction{
public String excute(){ //Action父类方法,默认执行,默认返回success
//0.获取ActionContext对象
//ActionContext是Action的上下文对象,可以从中获取到
//当前Action对象一切需要的信息
ActionContext actionContext=ActionContext.getContext();
//1.获取APPLICATION对应的Map并向其中添加 一个属性
Map<String,Object> applicationMap = actionContext.getApplication();
//设置属性值 注意是put和get而不是getAttribute
applicationMap.put("applicationKey","applicationValue");//设置属性 在网页中可以获取
//获取属性,在网页中设置属性值
Object date = applicationMap.get("date");
System.out.println("date:"+date);
//2.获取session对应的Map并向其中添加 一个属性
Map<String,Object> applicationSession = actionContext.getSession();
//设置session属性值
applicationSession.put("sessionKEY", "sessionValue");
//3 request
//request是已经初始化过的key-value,所以只需要get("request")就好
Map<String,Object> requestMap =(Map<String,Object>)actionContext.get("request");
requestMap.put("requestKey", "requestValue");
//4获取请求参数对应的MAp
//键:请求参数的名字,值:请求参数的值对应的字符串数组
//注意;1.getParameters的返回值为Map<String,Object>类型不是String[]>,所以在后面数组获取
//2.parameters这个MAP只能读,不能写入数据,如果写入,但不出错,但不起作用
Map<String,Object> parameters =actionContext.getParameters();
System.out.println(((String[])parameters.get("name"))[0]);
return "success";
}
}
>实现XxxAware接口
package com.ben.strut2.action;
//AWARE使用actionContext
import java.util.Map;
import org.apache.struts2.interceptor.ApplicationAware;
public class TestAwareAction implements ApplicationAware {
public String execute(){
//1、向application中加入一个属性applicationKey2-applicationValue
application.put("applicationKey2","applicationValue2");
//2.从application中读一个属性applicationKey2
application.get("date");
return "success";
}
private Map<String, Object> application=null;
@Override
public void setApplication(Map<String, Object> application) {
// TODO Auto-generated method stub
this.application=application;
}
}
使用建议:若一个Action类中有多个action方法,且多个方法都需要使用域对象的Map或parameters,建议使用
aware接口方式
第二种方式:通过与Servlet耦合的访问方式
直接访问Servlet API将使Action与Servlet环境耦合在一起,测试时需要有Servlet容器,不便于对Action单元的测试
。
直接获取HttpServletRequest对象:
-ServletActionContext.getRequest()
直接获取HttpSession对象
-ServletActionContext.getRequest().getSession()
直接获取ServletContext对象
-ServletActionContext.getServletContext()
例子:package com.ben.strut2.action;
import javax.servlet.ServletContext;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpSession;
import org.apache.struts2.ServletActionContext;
public class TextServletActionContext {
public String execute(){
/*
* ServletActionContext:可以从中获取到当前Action
*常用的方法:
*1.获取HttpServletRequest对象:ServletActionContext.getRequest()
*2.获取HttpSession对象:ServletActionContext.getRequest().getSession()
*3.获取ServletContext对象:ServletActionContext.getServletContext();
*/
HttpServletRequest request = ServletActionContext.getRequest();
HttpSession session = ServletActionContext.getRequest().getSession();
ServletContext servletContext = ServletActionContext.getServletContext();
System.out.println("execute...");
return "success";
}
}
2.通过实现ServletRequestAware,ServletContextAware等接口的方式
例子: