使每一个线程都可以独立地改变自己的副本

时间:2022-04-16 06:59:33

  为了制止与 Servlet API 耦合在一起, 便利 Action 单元测试, Struts2 HttpServletRequest, HttpSession ServletContext 进行了封装, 结构了 3 Map 东西来替代这 3 个东西, Action 中可以直接使用 HttpServletRequest, HttpSession, ServletContext 对应的 Map 东西来生存和读取数据。这里大家注意,struts1是没有供给与ServletAPI解耦的。

1.Struts2如何获取request、response、session、ServletContext

  在Struts2开发中,除了将请求参数自动设置到Action的字段中,我们往往也需要在Action里直接获取请求(Request)或会话(Session)的一些信息,甚至需要直接对JavaServlet Http的请求(HttpServletRequest),响应(HttpServletResponse)操纵.Struts2供给了三种用于获取这些东西的要领,,下面来一一介绍一下;

非IOC要领:通过ActionContext,ServletActionContext类直接获取,实现与Servlet解耦

ActionContext Action 执行的上下文东西, ActionContext 中生存了 Action 执行所需要的所有东西, 包孕 parameters, request, session, application .

static ThreadLocal actionContext = new ActionContextThreadLocal()
(ActionContext) actionContext.get();来获取

获取 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);

获取 HttpSession 对应的 Map 东西:

public Map getSession()

获取 ServletContext 对应的 Map 东西:

public Map getApplication()

测试代码:获取requestresponsesessionapplication东西

@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; } }