• 在Action获取Scope对象


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

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

    获取的scope对象与容器无关,通过ActionContext获取。
    LoginAction代码如下

    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>

    login.jsp内容如下:

    <form action="<%=request.getContextPath() %>/login.action">

           用户名:<input type="text" name="username"><br>

           <input type="submit" value="login">   

    </form>

    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 implementsRequestAware,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赋值,但是在方式二中它是通过实现接口,在重写接口中的方法中完成对Maprequset的赋值,所以称之IOC方式。借助此例,略谈下依赖注入与控制反转:所谓依赖注入就是一个对象自己本身的初始化是依赖其它对象。比如这里Map request这些对象会依赖struts2来给其初始化,称为依赖注入,而依赖注入的就表示,这些对象的控制权不再由此类本身掌握,而是交给了别的对象,即是控制权反转了。强调:方式二是开发中主要用的方式,应重点掌握

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

    建立Login3Action,代码如下:
    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方式

    建立Login4Action,代码如下:

    package com.asm;
    public class Login4Action extends ActionSupport implementsServletRequestAware,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并修改登录页面便可发布测试

    版权声明:本文为博主原创文章,未经博主允许不得转载。

  • 相关阅读:
    eclispe安装tomcate没有srver解决
    反射常见方法
    让用户输入一个日期字符串,将其转换成日期格式, 格式是(yyyy/MM/dd,yyyyMMdd,yyyy-MM-dd)中的一种, 任何一种转换成功都可以; 如果所有的都无法转换,输出日期格式非法。
    List 接口中ArrayList Vector LinkedList 比较
    抽象类
    js核心知识
    JQgrid学习网站
    小练习---递归求5!
    map()
    小练习---阶乘
  • 原文地址:https://www.cnblogs.com/mrcharles/p/4731694.html
Copyright © 2020-2023  润新知