为了制止与 Servlet API 耦合在一起, 便利 Action 做单元测试, Struts2 对 HttpServletRequest, HttpSession 和 ServletContext 进行了封装, 结构了 3 个 Map 东西来替代这 3 个东西, 在 Action 中可以直接使用 HttpServletRequest, HttpSession, ServletContext 对应的 Map 东西来生存和读取数据。这里大家注意,struts1是没有供给与Servlet的API解耦的。
1.Struts2如何获取request、response、session、ServletContext在Struts2开发中,除了将请求参数自动设置到Action的字段中,我们往往也需要在Action里直接获取请求(Request)或会话(Session)的一些信息,甚至需要直接对JavaServlet Http的请求(HttpServletRequest),响应(HttpServletResponse)操纵.Struts2供给了三种用于获取这些东西的要领,,下面来一一介绍一下;
非IOC要领:通过ActionContext,ServletActionContext类直接获取,实现与Servlet解耦l ActionContext是 Action 执行的上下文东西, 在 ActionContext 中生存了 Action 执行所需要的所有东西, 包孕 parameters, request, session, application 等.
static ThreadLocal actionContext = new ActionContextThreadLocal()
(ActionContext) actionContext.get();来获取
l 获取 HttpServletRequest 对应的 Map 东西:public Object get(Object key): ActionContext 类中没有供给类似 getRequest() 这样的要领来获取 HttpServletRequest 对应的 Map 东西. 要得到 HttpServletRequest 对应的 Map 东西, 可以通过为 get() 要领通报 “request” 参数实现
ActionContext.get(org.apache.struts2.StrutsStatics.HTTP_REQUEST);
获取HTTPServletResponse,该获取同request相似;
ActionContext.get(org.apache.struts2.StrutsStatics.HTTP_RESPONSE);
l 获取 HttpSession 对应的 Map 东西:
public Map getSession()
l 获取 ServletContext 对应的 Map 东西:
public Map getApplication()
测试代码:获取request、response、session、application东西
@SuppressWarnings("serial")
public class ContextAction extends ActionSupport{
@Override
public String execute() throws Exception {
System.out.println("欢迎访谒ContextAction中的execute要领!");
/**request东西(与servletAPI解耦的方法)*//*
ActionContext.getContext().put("username", "request_username");
*//**session东西(与servletAPI解耦的方法)*//*
ActionContext.getContext().getSession().put("username", "session_username");
*//**application东西(ServletContext东西)(与servletAPI解耦的方法)*//*
ActionContext.getContext().getApplication().put("username", "application_username");
*/
//使用与ServletActionContext的方法操纵上述
ServletActionContext.getRequest().setAttribute("username", "request_username");
ServletActionContext.getServletContext().setAttribute("username", "application_username");
ServletActionContext.getRequest().getSession().setAttribute("username", "session_username");
System.out.println("request:"+ServletActionContext.getRequest());
System.out.println("response:"+ServletActionContext.getResponse());
System.out.println("session:"+ServletActionContext.getRequest().getSession());
System.out.println("servletContext:"+ServletActionContext.getServletContext());
//Action接口中常量 SUCCESS="success"
return SUCCESS;
}
}