zoukankan      html  css  js  c++  java
  • struts2.1.6教程三、在Action获取Scope对象

    引言:在前面的Action操作中,关键就是Action中的exectue方法,但是此方法并没有request、session、application等对象作为参数,自然就不能利用这些对象来操作。下面我们建立struts2scope项目,并用四种方式来获取这些对象:

    方式一、与Servlet解耦合的非IOC方式

    package com.asm;
    public class LoginAction extends ActionSupport {
        private String username;
        ActionContext context;
        Map request;
        Map session;
        Map application;
        public String execute() throws Exception {
            context=ActionContext.getContext();
            request=(Map) context.get("request");
            session=context.getSession();
            application=context.getApplication();
            
            request.put("req", "requst属性");
            session.put("ses", "sesion属性");
            application.put("app", "application属性");
            return SUCCESS;
        }
        ...省略username的get/set方法
    }

    struts.xml配置如下:

    <struts>
        <package name="scope" extends="struts-default">
           <action name="login" class="com.asm.LoginAction">
               <result>/loginSuc.jsp</result>
    </action>
    </package>   
    
    </struts>

    loginSuc.jsp的主要内容如下:

    ${requestScope.req}
    ${sessionScope.ses}
    ${applicationScope.app}
    <h4>以下使用scope.getAttribute的形式来接受</h4>
            request:    <%=request.getAttribute("req") %><br>
            session:    <%=session.getAttribute("ses") %><br>
            application:<%=application.getAttribute("app") %><br>

    分析:通过ActionContext的getContext静态方法得到ActionContext对象,然后ActionContext对象调用get方法来获取一个存储在request范围中的对象。我们使用el或通过request.getAttribute这样的方式均可以获取对象值,这说明了这些Map request对象实际是存储在request范围内的对象。

    方式二、与Servlet解耦合的IOC方式

    我们建立Login2Action,主要代码如下:

    package com.asm;
    public class Login2Action extends ActionSupport implements RequestAware,SessionAware,ApplicationAware {
    private String username; Map request; Map session; Map application;
    public String execute() throws Exception { request.put("req", "requst属性"); session.put("ses", "sesion属性"); application.put("app", "application属性"); return SUCCESS; } public void setRequest(Map<String, Object> request) { this.request=request; } public void setSession(Map<String, Object> session) { this.session=session; } public void setApplication(Map<String, Object> application) { this.application=application; } ...省略username的get/set方法 }

    注册此Action的name为login2,随后修改登录提交为.../login2.action。便可以发布测试。说明:此方法其实和方式一很相似,只是在方式一中我们需要手动的为Map request赋值,但是在方式二中它是通过实现接口,在重写接口中的方法中完成对Map requset的赋值,所以称之IOC方式。借助此例,略谈下依赖注入与控制反转:所谓依赖注入就是一个对象自己本身的初始化是依赖其它对象。比如这里Map request这些对象会依赖struts2来给其初始化,称为依赖注入,而依赖注入的就表示,这些对象的控制权不再由此类本身掌握,而是交给了别的对象,即是控制权反转了。 强调:方式二是开发中主要用的方式,应重点掌握

    方式三、与Servlet耦合的非IOC方式

    package com.asm;
    public class Login3Action extends ActionSupport {
        private String username;
        HttpServletRequest request;
        HttpSession session;
        ServletContext application;
        public String execute() throws Exception {
            request = ServletActionContext.getRequest();
            session = request.getSession();
            application = ServletActionContext.getServletContext();
    
            request.setAttribute("req", "requst属性");
            session.setAttribute("ses", "sesion属性");
            application.setAttribute("app", "application属性");
            return SUCCESS;
        }
        ...省略username的get/set方法。
    }

    此方法获取的纯粹的Scope对象,它与容器相关,这些Scope对象操作更强。同样只需要注册此Action并修改登录页面便可进行测试

    方式四、与Servlet耦合的IOC方式

    package com.asm;
    public class Login4Action extends ActionSupport implements ServletRequestAware,ServletContextAware{
        private String username;
        ActionContext context;
        HttpServletRequest request;
        HttpSession session;
        ServletContext application;
        public String execute() throws Exception {
            context=ActionContext.getContext();
            session=request.getSession();    
            request.setAttribute("req", "requst属性");
            session.setAttribute("ses", "sesion属性");
            application.setAttribute("app", "application属性");
            return SUCCESS;
        }
        
        public void setServletRequest(HttpServletRequest request) {
            System.out.println("测试:"+request);
            this.request=request;
        }
        public void setServletContext(ServletContext application) {
            System.out.println("测试:"+application);
            this.application=application;
        }
        ...省略username的get/set方法
    }

    同样只需要注册此Action并修改登录页面便可发布测试

     强调:方式四是开发中主要用的方式,应重点掌握

    注意:方式二RequestAware和方式四ServletRequestAware

    实现的接口不一样,所以是月Servlet耦合和解耦合

    附:一般开发使用一个抽象类封装request和response,其他action继承就可以使用HttpServletRequest 和HttpServletResponse

    public abstract class BaseAction implements ServletRequestAware,
            ServletResponseAware {
    
        public HttpServletRequest request;
        public HttpServletResponse response;
    
        @Override
        public void setServletResponse(HttpServletResponse response) {
            this.response = response;
        }
    
        @Override
        public void setServletRequest(HttpServletRequest request) {
            this.request = request;
        }
    }
  • 相关阅读:
    UVa 1151 Buy or Build【最小生成树】
    UVa 216 Getting in Line【枚举排列】
    UVa 729 The Hamming Distance Problem【枚举排列】
    HDU 5214 Movie【贪心】
    HDU 5223 GCD
    POJ 1144 Network【割顶】
    UVa 11025 The broken pedometer【枚举子集】
    HDU 2515 Yanghee 的算术【找规律】
    Java基本语法
    Java环境变量,jdk和jre的区别,面向对象语言编程
  • 原文地址:https://www.cnblogs.com/crazylqy/p/4427788.html
Copyright © 2011-2022 走看看