Struts2有四种方式获取Web中 request、session、application 的方式。
1、通过实现ServletRequestAware 接口通过IOC机制注入request(此方法最麻烦,不推荐使用)
/** * 通过实现ServletXxxAware 接口的方式可以由Struts2注入(setter方法)需要的Servlet 相关的对象 * ServletRequestAware:注入HttpServletRequest对象 * ServletContextAware:注入ServletContext对象(较常用) * ServletResponseAware:注入HttpServletResponse对象 * */ public class TestServletAwareAction implements ServletRequestAware,ServletContextAware,ServletResponseAware{ public String execute() { System.out.println("ServletContext:"+context); return "success"; } private ServletContext context; @Override public void setServletContext(ServletContext context) { System.out.println(context); this.context = context; } @Override public void setServletRequest(HttpServletRequest request) { System.out.println(request); } @Override public void setServletResponse(HttpServletResponse response) { System.out.println(response); } }
2、实现RequestAware、SessionAware、ApplicationAware接口,通过IOC机制来注入三个Map
public class TestAwareAction implements ApplicationAware,SessionAware,RequestAware,ParameterAware{ public String execute(){ //1.向application中加入一个属性:applicationKey2 - applicationValue2 application.put("applicationKey2", "applicationValue2"); //2.从application中读取一个属性 date,并打印 System.out.println("时间"+application.get("date")); //下面这些方法的用法同上 session.put("sessionKey2", "sessionValue2"); request.put("requestKey2", "requestValue2"); //获取请求参数 System.out.println("参数:"+parameters.get("name")[0]); return "success"; } private Map<String,Object> application; private Map<String,String[]> parameters; private Map<String,Object> request; private Map<String,Object> session; @Override public void setApplication(Map<String, Object> application) { this.application = application; } @Override public void setParameters(Map<String, String[]> parameters) { this.parameters = parameters; } @Override public void setRequest(Map<String, Object> request) { this.request = request; } @Override public void setSession(Map<String, Object> session) { this.session = session; } }
3、使用ServletActionContext类(此方法与Servlet耦合)
/** * 和Servlet API耦合的方式获取WEB资源 * 使用ServletActionContext可以从中获取到当前Action 对象需要的一切 Servlet API 相关的对象。 * 常用的方法: * 1.获取HttpServletRequest:ServletActionContext.getRequest(); * 2.获取HttpSession:ServletActionContext.getRequest().getSession(); * 3.获取ServletContext:ServletActionContext.getServletContext(); */ public class TestServletActionContextAction { public String execute() { HttpServletRequest request = ServletActionContext.getRequest(); HttpSession session = ServletActionContext.getRequest().getSession(); ServletContext servletContext = ServletActionContext.getServletContext(); System.out.println("execute..."); return "success"; } }
4、使用ActionContext类(此方法与Servlet解耦,推荐使用)
/** * 解耦的方式获取WEB资源 * 使用ActionContext * */ public class TestActionContextAction { public String execute() { //0.获取ActionContext对象,是Action的上下文对象, // 可以从中获取到当前Action需要的一切信息 ActionContext actionContext = ActionContext.getContext(); //1.通过调用ActionContext对象的getApplication()方法获取application 对应的 Map, // 并向其中添加一个属性 Map<String,Object> applicationMap = actionContext.getApplication(); //添加属性 applicationMap.put("applicationKey", "applicationValue"); //获取属性 System.out.println(applicationMap.get("applicationKey")); //2.session Map<String,Object> sessionMap = actionContext.getSession(); sessionMap.put("sessionKey", "sessionValue"); //3.request //ActionContext中并没有提供getRequest方法来获取request对应的Map, //需要手动调用get()方法传入request字符串来获取 Map<String,Object> requestMap = (Map<String, Object>) actionContext.get("request"); requestMap.put("requestKey", "requestValue"); //4.获取请求参数对应的Map,并获取指定的参数值 //键:请求参数的名字,值:请求参数的值对应的字符串数组 //注意:①getParameters的返回值为Map<String,Object>,而不是Map<String,String[]> // ②parameters 这个Map只能读,不能写入数据 Map<String,Object> parameters = actionContext.getParameters(); System.out.println(((String[])parameters.get("name"))[0]); //atguigu return "success"; } }