1 与 Servlet API 解耦的访问方式
为降低与 Servlet API 耦合, Struts2 构造 Map 对象来替代 servlet 对象(包括 HttpServletRequest、HttpSession 、 ServletContext ), 在 Action 中可直接使用 servlet 对象对应的 Map 对象来存取数据。
2 访问 servlet 对象的两种方式
(1)方式一:借助 ServletActionContext 类直接获取
ActionContext 是 Action 执行上下文环境,每个上下文基本上都是一个对象容器,包含了动作执行所需的对象(session、参数等)。ActionContext 是 threadlocal 的,存放在每个线程中的值唯一,线程安全。
ServletActionContext 直接继承 ActionContext,提供了直接与 Servlet 相关对象访问的功能,可取得的对象有:
(1)javax.servlet.http.HttpServletRequest : HTTPservlet请求对象
(2)javax.servlet.http.HttpServletResponse : HTTPservlet响应对象
(3)javax.servlet.ServletContext : Servlet上下文信息
(4)javax.servlet.ServletConfig : Servlet配置对象
(5)javax.servlet.jsp.PageContext : Http页面上下文
这些对象基本上都是通过静态方法来获得。
ActionContext 与 ServletActionContext 比较:
ActionContext 主要负责值的操作;ServletActionContext 主要负责获取 Servlet 对象。原则是:优先使用 ActionContext,只有 ActionContext 不能满足功能要求时才使用ServletActionContext,尽量使 Action 与 Web 无关,利于 Action 的测试和复用。需要注意:使用 ActionContext 时,不要在 Action 的构造函数里使用 ActionContext.getContext()。
(2)方式二:实现指定接口,由 struts 框架运行时注入
(与 Spring 框架的 ioc 原理相同)
实现 Aware 接口利用了依赖注入的方式能够让应用程序有更好的重用性。
Struts2 提供了4种分别用来访问 ServletContext、HttpServletRequest、HttpServletResponse、HttpSession 对象的接口
org.apache.struts2.util.ServletContextAware;
org.apache.struts2.interceptor.ServletRequestAware;
org.apache.struts2.interceptor.ServletResponseAware;
org.apache.struts2.interceptor.SessionAware;
依赖框架注入,故使用时,要提供对应的 set 方法。
代码示例:
import java.util.Map;
import javax.servlet.ServletContext;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import org.apache.struts2.interceptor.ServletRequestAware;
import org.apache.struts2.interceptor.ServletResponseAware;
import org.apache.struts2.interceptor.SessionAware;
import org.apache.struts2.util.ServletContextAware;
import com.opensymphony.xwork2.ActionSupport;
/*访问servlet对象
* 方式二:实现指定接口,由struts框架运行时注入:
*/
public class DecoupleAction_2 extends ActionSupport implements
ServletRequestAware, ServletResponseAware, ServletContextAware,
SessionAware
{
// 运行过程:
// 构造方法--->setXXX方法--->execute()
// 无参数的构造器
public DecoupleAction_2()
{
}
private HttpServletRequest request = null;
private HttpServletResponse response = null;
Map<String, Object> session = null;
private ServletContext application = null;
//提供setXXX方法,运行时,由框架注入
public void setSession(Map<String, Object> session)
{
// TODO Auto-generated method stub
this.session = session;
}
public void setServletContext(ServletContext application)
{
// TODO Auto-generated method stub
this.application = application;
}
public void setServletResponse(HttpServletResponse response)
{
// TODO Auto-generated method stub
this.response = response;
}
public void setServletRequest(HttpServletRequest request)
{
// TODO Auto-generated method stub
this.request = request;
}
// action 入口
@Override
public String execute() throws Exception
{
System.out.println(request);
request.setAttribute("username", "zhang in request.");
System.out.println(response);
System.out.println(session);
session.put("username", "zhang in session.");
System.out.println(application);
application.setAttribute("username", "zhang in application.");
return "success";
}
}