在Struts1中 通过使用actonform 类接受用户输入的数据,为了避免业务逻辑层依赖于Struts框架, 我们需要提供一个对应的领域对象( POJO) 然后 在actionform 和领域对象之间进行数据复制,这使程序中的javabean 对象泛滥, 在Struts2 中直接支持使用领域对象来接收用户数据,
public class LoginAction implements Action{
private User user;
public String execute() throws Exception {
// 业务处理
}
set/get。。
}
Struts2 访问Servlet API 对象
如何访问request,session, application 等
如果要却得servlet api 中的一些对象,如request ,response或session 等 , 怎么做?
1 非IOC 方式 ,
要获取上述 对象 ,通过使用com.opensymphony.xwork2.ActionContext类
2 , IOC 方式
首先告诉IOC 容器(Container)想取得某个对象的意图,试过实现相应的接口。
与Servlet API 解耦的访问方式,
非 IOC 访问方式
为了避免与Servlet API 耦合在一起, 方便Action 类做单元测试,Struts2 对HTTPservletrequest,httpsession, 和servletcontext 进行了封装,构造了三个map 对象来替代这三种对象,在Action 中,直接使用HTTPservletrequest,HTTPsession,servletContext 对象的map 对象来保存和读取数据,要获取这三个对象, 可以使用com.opensymphony.xwork2.ActionContext类
//1 IOC 的解耦方式获取servlet api
ActionContext actionContext = ActionContext.getContext();
//1 获取session
Map<String,Object>session = actionContext.getSession();
// 添加数据
session.put("s1", "这是session");
//2 获取application
Map<String, Object>application = actionContext.getApplication();
//添加数据
application.put("a1", "这是application");
// 3 request
actionContext.put("r1", "这是request");
//在jsp 页面 通过EL 表达式获取域的内容
// ${requestScop.r1} ${sessionScop.s1} ${applicatonScop.a1}
IOC 方式:
除了利用AcionContext来获取request,session,application对象这种方式外,还可以采用在action类中实现某些特定的接口的方式,让Struts2框架在运行时想Action实例注入request,session,application 对象,与之有关的三个接口和方法如下所示;
与servlet api耦合的访问方式
非IOC 方式
前面采用MAP 对象来封装Servlet API 。 如果要想在action类中直接使用HTTPservletrequest ,HTTPservletresponse,servletContext对象, 可以使用 org.apache.struts2,servletactionContext 类,该类是ActionContex的子类,在这个类中定义了两个静态方法
IOC 方式:
除了利用ServletActionContext来获取 HttpServletRequest对象和ServletContext对象这种方式外,Action类还可以实现ServletRequestAware和ServletContextAware接口,由Struts2 框架向Action 实例注入HttpServletRequest和ServletContext对象。