struts2-与Servlet API解耦

来源:互联网 发布:布鲁金斯学会 知乎 编辑:程序博客网 时间:2024/04/29 14:44

与Servlet API解耦的访问方式

  为了避免与 Servlet API 耦合在一起, 方便 Action 做单元测试, Struts2 对 HttpServletRequest, HttpSession 和 ServletContext 进行了封装, 构造了 3 个 Map 对象来替代这 3 个对象, 在 Action 中可以直接使用 HttpServletRequest, HttpSession, ServletContext 对应的 Map 对象来保存和读取数据. 

访问request/session/application对象

  方法一:通过ServletActionContext类直接获取

    ActionContext 是 Action 执行的上下文对象, 在 ActionContext 中保存了 Action 执行所需要的所有对象, 包括 parameters, request, session, application 等. 

    a) 获取 HttpServletRequest 对应的 Map 对象

      •public Object get(Object key): ActionContext 类中没有提供类似 getRequest() 这样的方法来获取 HttpServletRequest 对应的 Map 对象.

       要得到 HttpServletRequest 对应的 Map 对象, 可以通过为 get() 方法传递 “request” 参数实现

    b) 获取 HttpSession 对应的 Map 对象: 

      •public Map getSession()

    c) 获取 ServletContext 对应的 Map 对象:

      •public Map getApplication()
 1 import java.util.Map; 2  3 import javax.servlet.ServletContext; 4 import javax.servlet.http.HttpServletRequest; 5 import javax.servlet.http.HttpServletResponse; 6  7 import org.apache.struts2.ServletActionContext; 8  9 import com.opensymphony.xwork2.ActionSupport;10 11 @SuppressWarnings("serial")12 public class ContextAction extends ActionSupport {13 14     public String test(){15         System.out.println("ContextAction*********test()");16         17         HttpServletRequest request = ServletActionContext.getRequest();18         request.setAttribute("username", "username_request");19         HttpServletResponse response = ServletActionContext.getResponse();20         21         Map  sessionMap = ServletActionContext.getContext().getSession();22         sessionMap.put("username","username_session");23         24         ServletContext  sc =  ServletActionContext.getServletContext();25         sc.setAttribute("username","username_context");26         27         return "attr";28     }29 }

    如果你只是想访问session的属性(Attribute),你也可以通过ActionContext.getContext().getSession()获取

  方法二:实现指定接口,由struts框架运行时注入:

  Action 类通过可以实现某些特定的接口, 让Struts2 框架在运行时向 Action 实例注入parameters, request, session 和 application 对应的 Map 对象: 

  

 1 import java.util.Map; 2  3 import javax.servlet.ServletContext; 4 import javax.servlet.http.HttpServletRequest; 5 import javax.servlet.http.HttpServletResponse; 6  7 import org.apache.struts2.ServletActionContext; 8 import org.apache.struts2.interceptor.ServletRequestAware; 9 import org.apache.struts2.interceptor.ServletResponseAware;10 import org.apache.struts2.interceptor.SessionAware;11 import org.apache.struts2.util.ServletContextAware;12 13 import com.opensymphony.xwork2.ActionSupport;14 15 @SuppressWarnings("serial")16 public class ContextAction2 extends ActionSupport implements ServletRequestAware,ServletResponseAware,ServletContextAware,SessionAware{17 18     HttpServletRequest request;19     HttpServletResponse response;20     Map  sessionMap;21     ServletContext  sc;22     23     public String test(){24         System.out.println("ContextAction*********test()");25         HttpServletRequest request = ServletActionContext.getRequest();26         request.setAttribute("username", "username_request");27         sessionMap.put("username","username_session");28         sc.setAttribute("username","username_context");29         return "attr";30     }31     @Override32     public void setSession(Map<String, Object> session) {33         this.sessionMap =session;34     }35     @Override36     public void setServletContext(ServletContext context) {37         this.sc = context;38     }39     @Override40     public void setServletResponse(HttpServletResponse response) {41         this.response = response;42     }43     @Override44     public void setServletRequest(HttpServletRequest request) {45         46     }47 }

 

  struts_context.xml

 1 <?xml version="1.0" encoding="UTF-8"?> 2 <!DOCTYPE struts PUBLIC 3     "-//Apache Software Foundation//DTD Struts Configuration 2.3//EN" 4     "http://struts.apache.org/dtds/struts-2.3.dtd"> 5 <struts> 6     <package name="context" namespace="/context"  extends="struts-default">  7          <action name="contextAction_test" class="cn.zengfansheng.struts.context.ContextAction" method="test"> 8             <result name="success"> 9                 <param name="location">/context/success.jsp</param>10             </result>11             <result name="attr">/context/attr.jsp</result>12          </action>13          <action name="contextAction2_test" class="cn.zengfansheng.struts.context.ContextAction2" method="test">14             <result name="success">15                 <param name="location">/context/success.jsp</param>16             </result>17             <result name="attr">/context/attr.jsp</result>18          </action>19     </package>20 </struts>

  attr.sjp

 1 <%@ page language="java" pageEncoding="utf-8"%> 2 <%@ taglib uri="/struts-tags"   prefix="s"%> 3 <html> 4   <head> 5     <title>My JSP 'index.jsp' starting page</title> 6     <meta http-equiv="description" content="This is my page"> 7   </head> 8   <body> 9     ${requestScope.username}<br>10     ${sessionScope.username}<br>11     ${applicationScope.username}<br>12   </body>13 </html>

 

 

 

 

 

 

0 0
原创粉丝点击