-------B/S应用中的Controller必须访问Web资源
1.和Servlet API 解耦方式
(只能访问其有限的方法,如:读取参数,读写请求参数,使session失效)
Struts2对HttpServletRequest,HttpSession,ServletContext进行了封装
构造了3个Map对象来替代这三个对象,在Action类中可以直接使用
使用Awave接口的方式,可以不用多次获取ActionContext
ActionContext中保存了Action执行所需要的所有对象,包括parameters,
request,session,application
2.和Servlet API 耦合方式
(可以访问更多的Servlet API对象,且可以调用其原生方法)
1.和Servlet API 解耦方式
(只能访问其有限的方法,如:读取参数,读写请求参数,使session失效)
Struts2对HttpServletRequest,HttpSession,ServletContext进行了封装
构造了3个Map对象来替代这三个对象,在Action类中可以直接使用
(1)使用ActionContext
package com.struts2.action;
import java.util.Map;
import org.apache.struts2.dispatcher.SessionMap;
import com.opensymphony.xwork2.ActionContext;
public class TestActionContextAction {
public String execute(){
// 获取ActionContext对象
ActionContext actionContext = ActionContext.getContext();
// 获取application对应的Map,并添加属性
Map<String,Object> applicationMap = actionContext.getApplication();
//设置属性
applicationMap.put("applicationKey","applicationValue");
//获取属性
Object date = applicationMap.get("date");
System.out.println("date"+date);
//获取session
Map<String,Object> sessionMap = actionContext.getSession();
sessionMap.put("sessionKey", "sessionValue");
//调用invalidate方法,是session失效
if(sessionMap instanceof SessionMap){
SessionMap sm = (SessionMap)sessionMap;
sm.invalidate();
}
//获取request
Map<String, Object> requestMap = (Map<String, Object>) actionContext.get("request");
requestMap.put("requestKey", "requestValue");
//获取parameter
//parameters这个Map只能读,不能写入
Map<String,Object> parameters = actionContext.getParameters();
System.out.println(((String[])parameters.get("name"))[0]);
return "success";
}
}
(2)实现XxxAwave接口
public class TestAwave implements ApplicationAware{
private Map<String,Object> application;
@Override
public void setApplication(Map<String, Object> application) {
this.application = application;
}
public String execute(){
application.put("applicationKey2", "applicationValue2");
return "success";
}
}
若一个Action类中有多个action方法,且多个访问只能需要使用域对象,则建议使用Awave接口的方式,可以不用多次获取ActionContext
ActionContext中保存了Action执行所需要的所有对象,包括parameters,
request,session,application
2.和Servlet API 耦合方式
(可以访问更多的Servlet API对象,且可以调用其原生方法)
(1)使用ServletActionContext
(2)实现ServletXxxAction接口
直接访问 Servlet API 将使 Action 与 Servlet 环境耦合在一起, 测试时需要有 Servlet 容器, 不便于对 Action 的单元测试