zoukankan      html  css  js  c++  java
  • struts2与Servlet API解耦

    与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     @Override
    32     public void setSession(Map<String, Object> session) {
    33         this.sessionMap =session;
    34     }
    35     @Override
    36     public void setServletContext(ServletContext context) {
    37         this.sc = context;
    38     }
    39     @Override
    40     public void setServletResponse(HttpServletResponse response) {
    41         this.response = response;
    42     }
    43     @Override
    44     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>
    by hacket
  • 相关阅读:
    【看完想不会都难的系列教程】- (3) JQuery+JQueryUI+Jsplumb 实现拖拽模块,流程图风格
    数据库~大叔通过脚本生成poco实体
    Git~分支真的很轻
    jenkins~管道Pipeline里使用公用类库
    docker~run起来之后执行多条命令
    jenkins~管道Pipeline的使用,再见jenkinsUI
    通过数组初始化链表的两种方法:指向指针的引用node *&tail和指向指针的指针(二维指针)node **tail
    NYOJ 16 矩形嵌套(动态规划)
    SPOJ 416
    sqlserver,执行生成脚本时“引发类型为“System.OutOfMemoryException”的异常”(已解决)
  • 原文地址:https://www.cnblogs.com/hacket/p/3082502.html
Copyright © 2011-2022 走看看