• 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;
        }
    }
  • 相关阅读:
    设置WebSphere字符集参数
    防SQL注入
    改变radio/checkbox默认样式
    数据完整性约束错误
    Java项目多数据源配置
    No row with the given identifier exists:错误另解
    ICTCLAS20160405分词系统调试过程
    centos7 忘记root密码
    java之Junit
    javaweb之登录
  • 原文地址:https://www.cnblogs.com/crazylqy/p/4427788.html
Copyright © 2020-2023  润新知