zoukankan      html  css  js  c++  java
  • Struts2 与Servlet API解耦,耦合的访问方式

    一.与Servlet API解耦的访问方式

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

    ActionContext - 请求上下文 。就是struts2封装的request.包含了request,session,application上面这三个都是Map.

    public class LoginAction implements Action{
        private String username;
        private String password;
        public String getUsername() {
            return username;
        }
        public void setUsername(String username) {
            this.username = username;
        }
        public String getPassword() {
            return password;
        }
        public void setPassword(String password) {
            this.password = password;
        }
        
        public String execute() throws Exception {
            if (username.equals("1")&&password.equals("1")) {
                //解耦合 记录session
                Map<String, Object> session = ActionContext.getContext().getSession();
                session.put("uname", username);
                return SUCCESS;
            }else {
                return LOGIN;
            }
        }
    }
         
    <!--登录

    登陆成功后,记录用户名到Session中,登陆失败,跳会登陆页面

     -->
            <action name="loginAction" class="cn.happy.action.LoginAction">
                <result name="success">
                s.jsp
                </result>
                <result name="login">
                login.jsp
                </result>
            </action>

    2:向Action中注入ServletAPI对象对应的Map对象

    public class LoginAction implements Action,SessionAware {
        private String username;
        private String password;
        private Map<String,Object> map;
        public String execute() throws Exception {
            if (username.equals("1")&&password.equals("1")) {
                //注入map集合
                map.put("uname", username);
                return SUCCESS;
            }else {
                return LOGIN;
            }
        }
           
        public void setSession(Map<String, Object> map) {
            
            this.map=map;
        }
    }

    二.与Servlet API耦合的访问方式

    直接访问 Servlet API将使Action类与Servlet API耦合在一起,Servlet API对象均由Servlet容器来构造,与这些对象绑定在一起,测试过程中就必须有Servlet容器,这样不便于Action类的测试,但有时候,确实需要访问这些对象,Struts2同样提供了直接访问ServletAPI对象的方式。

    要直接获取Servlet API对象可以使用org.apache.struts2.ServletActionContext类,该类是ActionContext类的子类。

    //通过ActionContext的子类ServletActionContext实现

    public class LoginAction implements Action {
        private String username;
        private String password;
        public String execute() throws Exception {
            if (username.equals("1")&&password.equals("1")) {
               HttpSession session = ServletActionContext.getRequest().getSession();
                session.setAttribute("uname", username);
                return SUCCESS;
            }else {
                return LOGIN;
            }
        }

    //向Action实例注入Servlet API对象

    public class LoginAction implements Action,ServletRequestAware{
        private HttpServletRequest Request;   
         private String username;
        private String password;
        public String execute() throws Exception {
            if (username.equals("1")&&password.equals("1")) {
             //记录session
              HttpSession session=request.getSession();
              session.setAttribute("uname",username);
                return SUCCESS;
            }else {
                return LOGIN;
            }
        }        
    public void setServletRequest(HttpServletRequest arg0) {
            this.request=request;
            
        }
  • 相关阅读:
    【树链剖分】【线段树】bzoj2157 旅游
    【高斯消元】【异或方程组】poj1222 EXTENDED LIGHTS OUT
    【树链剖分】【线段树】bzoj3626 [LNOI2014]LCA
    【dfs】bzoj3563 DZY Loves Chinese
    【高斯消元】【异或方程组】【bitset】bzoj1923 [Sdoi2010]外星千足虫
    【高斯消元】bzoj1013 [JSOI2008]球形空间产生器sphere
    【博弈论】bzoj1115 [POI2009]石子游戏Kam
    【最近公共祖先】【树链剖分】CODEVS 1036 商务旅行
    【块状树】【博弈论】bzoj3729 Gty的游戏
    【博弈论】【SG函数】bzoj1777 [Usaco2010 Hol]rocks 石头木头
  • 原文地址:https://www.cnblogs.com/s1294/p/5834360.html
Copyright © 2011-2022 走看看