struts2中获得request response session等内置对象的方法
在我们熟知的struts操作中,无论是通过servlet中request获得传递的参数,设置编码方法,forward,redirect还是session的Attribute和response的输出过程,均通过配置和封装实现了与Servlet Api的解耦,让我们再开发中极大方便地个性化操作,但如果我们有特殊需要想要获得这些对象呢?
1.与Servlet解耦方式
1)IOC方式
这种方式主要用于action中,采用容器注入的方法得到对象
1 public class RegisterAction extends ActionSupport implements HttpServletRequest,HttpServletResponse,SessionAware,ApplicationAware{ 2 private Map<String,Object> request;//依赖注入,控制反转 3 private Map<String,Object> session; 4 private Map<String,Object> application; 5 6 public voidsetApplication(Map<String, Object> arg0) { 7 this.application = arg0; 8 } 9 public voidsetSession(Map<String, Object> arg0) { 10 this.session = arg0; 11 } 12 public voidsetRequest(Map<String, Object> arg0) { 13 this.request = arg0; 14 } 15 request.put("r1","r1"); 16 session.put("i1","i1"); 17 application.put("a1","a1"); 18 return SUCCESS; 19 }
若要注入某种对象,就要实现对应的Aware接口
2)非IOC方式
这种方式要使用到的一个类是ActionContext,ActionContext是指Action的上下文相当于一个容器(Map),里面保存了每次请求的信息 request response session servletContext params local(本地信息),这些信息均以键值对的方式保存。ActionContext只在一次请求中建立一次,且提供的静态方法保证线程安全,在filter建立和初始化的时候这些信息均为空。而且ActionContext可以在action之外的类中使用,可以在Action与action之间,和jsp之间传递信息。下面看获得信息的代码:
1 Action代码 2 //private ActionContext context ;//该方法还可以取得值栈(getValueStack()),使用push(obj)往值栈中放数据 3 private Map request; 4 private Map session ; 5 private Map application ; 6 7 public LoginAction1(){ 8 request = (Map)ActionContext.getContext().get("request"); //获取request 9 session = ActionContext.getContext().getSession(); //取得session 10 application = ActionContext.getContext().getApplication(); //取得application 11 12 request.put("r1","r1"); 13 session.put("i1","i1"); 14 application.put("a1","a1"); 15 return SUCCESS; 16 } 17 JSP代码 18 <s:property value="#request.r1" />|<%=request.getAttribute("r1") %><br> 19 <s:property value="#session.i1" />|<%=session.getAttribute("i1") %><br> 20 <s:property value="#application.a1" />|<%=application.getAttribute("a1") %><br> 21 <s:debug></s:debug>
这里的request session application和servlet中的概念不同,他们均是封装过的Map类型,与servlet中的同名内置对象相对应。
2.与servlet耦合的方式
1 public class LoginAction3 extends ActionSupport{ 2 3 private HttpServletRequest request; 4 private HttpSession session; 5 private ServletContext application; 6 public LoginAction3(){ 7 request = ServletActionContext.getRequest(); 8 session = request.getSession(); 9 application = session.getServletContext(); 10 }
这种方式和servlet发生耦合,理论上与开发思想相悖,但用起来很方便。
个人倾向于第二种方法,非Ioc且与Servlet解耦的方式,IOC方式要实现接口并靠容器注入总感觉不放心,哈哈,因为不太了解Aeare接口而且要实现的代码多。
浙公网安备 33010602011771号