• .Net转Java自学之路—Struts2框架篇二(数据操作)


    结果页面配置:

      1、全局结果页面:
        》result标签配置action方法的返回值到不同的路径中。
        》创建俩个action,执行默认的execute方法,让俩个action的方法都返回相同的success,返回success之后,配置到同一个页面中。

    <package name="demo" extends="struts-default" namespace="/">
        <action name="ATest" class="cn.test.action.AAction">
            <result name="success">/hello.jsp</result>
        </action>
        <action name="BTest" class="cn.test.action.BAction">
            <result name="success">/hello.jsp</result>
        </action>
    </package>

        若多个action,方法中的返回值都一样,到的页面也一样,这个时候可以使用全局结果页面配置。

    <package name="demo" extends="struts-default" namespace="/">
        <!-- 全局结果页面配置 -->
        <global-result>
            <result name="success">/hello.jsp</result>
        </global-result>
        
        <action name="ATest" class="cn.test.action.AAction">
        </action>
        <action name="BTest" class="cn.test.action.BAction">
        </action>
    </package>

      2、局部结果页面:

    <action name="ATest" class="cn.test.action.AAction">
        <result name="success">/hello.jsp</result>
    </action>

      同时配置了全局结果和局部结果页面,以局部结果页面为准。

      3、result标签type属性:

        》在result表中中除了name属性之外,还有一个type属性:如何到路径中(转发/重定向)。
          默认转发:转发。值:dispatcher 
          重定向:值 redirect 
        俩个属性值一般针对到页面中配置。
        若配置到其他的actin中用chain、redirectAction:
          chain:转发到action。一般不用,有缓存问题。
          redirectAction:重定向到Action。

    <action name="ATest" class="cn.test.action.AAction">
        <result name="success" type="redirectAction">
            BTest
        </result>
    </action>
    <action name="BTest" class="cn.test.action.BAction">
        <result name="success">/hello.jsp</result>
    </action>

    在action获取表单提交数据:

      1、使用ActionContext类获取:

        ActionContext.getContext();获取当前线程的ActionContext对象。
        Map<String,Object> getParameters();返回包含HttpServletRequest参数信息。

      2、使用ServletActionContext类获取:

        static HttpServletRequest getRequest();获取HttpServletRequest对象。
        static HttpServletResponse getResponse();获取HttServletResponse对象。
        static ServletContext getServletContext();获取ServletContext对象。
        static PageContext getPageContext();获取PageContext对象。

      3、使用接口注入方式获取:

        让action实现接口,为了得到request对象。接口:ServletRequestAware

      4、在action中操作域对象:

        使用ServletActionContext来操作域对象。

    Struts2提供获取表单数据方式:

      Action原始的实现方式:

    public String execute(){
        HttpServletRequest request=
            ServletActionContext.getRequest();
        String str1=request.getParameter("")
        String str2=request.getParameter("")
        String str3=request.getParameter("")
        SelfClass sc=new SelfClass();
        sc.setXXX(str1);
        sc.setXXX(str2);
        sc.setXXX(str3);
        return NONE;
    }

      而针对复杂的原始写法,封装了几种方式:属性封装、模型驱动封装、表达式封装。

      属性封装:

        》可以直接把表单提交数据封装到action的属性中。
        》步骤:
          a、在action成员变量位置定义变量;变量名称和表单输入项的name属性值保持一致。
          b、生成变量的set/get方法:

    class TestAction extends ActionSupport{
        private String uname;
        private String pwd;
        public String getUname(){
            return uname;
        }
        public void setUname(String uname){
            this.uname=uname;
        }
        public String getPwd(){
            return pwd;
        }
        public void setPwd(String pwd){
            this.pwd=pwd;
        }
        
        public String execute() throws Exception{
            return NONE;
        }
    }

        》使用属性封装获取表单数据到属性中,不能把数据直接封装到实体类对象中。

      模型驱动封装:

        》使用模型驱动方式,可以直接把表单数据直接封装到实体类对象中。
        》实现步骤:action实现接口 ModelDriven;实现接口中的getModel()方法把创建对象返回;在action中创建实体类对象。

    class TestAction extends ActionSupport implements ModelDriven{
        private User user=new User();
        
        public User getModel(){
            return user;
        }
        
        public String execute() throws Exception{
            return NONE;
        }
    }

          使用模型驱动封装的前提要求:表单输入项name属性值和实体类属性名称保持一致。
        》使用模型驱动和属性封装注意问题:
          在一个action中,获取表单数据可以使用属性封装或模型驱动封装。两者不能同时使用来获取同一个表单数据。若同时使用,只会执行模型驱动封装。

      表达式封装:

        使用表达式封装也可以把表单数据封装到实体类对象中。
        》在action中声明实体类。并生成实体类变量的get()/set()方法。
        》在表单输入项的name属性值中写表达式形式。

    class TestAction extends ActionSupport{
        private User user;
        public User getUser(){
            return user;
        }
        public void setUser(User user){
            this.user=user;
        }
        
        public String execute() throws Exception{
            return NONE;
        }
    }

          在表单的name中属性值为:user.uname

    <input type="text" name="user.uname" />

        》可以把表达式封装归类到属性封装中。

      比较表达式封装和模型驱动化封装:

        相同点:
          使用表达式封装和模型驱动封装都可以把数据封装到实体类中。
        不同点:
          1、使用模型驱动只能把数据封装到一个实体类对象中。在一个action中不能使用模型驱动把数据封装到不同的实体类对象中。
          2、表达式封装可以把数据封装到不同的实体类对象中。

    Struts2获取数据封装到集合中:

      封装到 list 集合:

    class TestAction extends ActionSupport{
        private List<User> list;
        public List<User> getList(){
            return list;
        }
        public void setList(List<User> list){
            this.list=list;
        }
        
        public String execute() throws Exception{
            return NONE;
        }
    }

      封装到 Map 集合:

    class TestAction extends ActionSupport{
        private Set<String,User> set;
        public Set<String,User> getSet(){
            return set;
        }
        public void setSet(Set<String,User> set){
            this.set=set;
        }
        
        public String execute() throws Exception{
            return NONE;
        }
    }
  • 相关阅读:
    设计模式-行为型模式,责任链模式(10)
    设计模式-结构型模式,代理模式(9)
    设计模式-结构型模式, mvc 模型视图控制器模式(8)
    设计模式-创建型模式,python享元模式 、python单例模式(7)
    设计模式-结构型模式,外观模式(6)
    设计模式- 结构型模式,装饰器模式(5)
    设计模式-结构型模式,适配器模式(4)
    设计模式-创建型模式,原型模式(3)
    设计模式- 创建型模式, 建造者模式(2)
    设计模式 -创建型模式 ,python工厂模式 抽象工厂模式(1)
  • 原文地址:https://www.cnblogs.com/zltao/p/10481811.html
Copyright © 2020-2023  润新知