zoukankan      html  css  js  c++  java
  • 7.Struts2框架封装数据

    Struts2框架提供了很强大的数据封装的功能,不再需要使用Servlet的API完成手动封装了!!
    第一种方式:属性驱动
      > 提供对应属性的set方法进行数据的封装。--经常使用
        * 表单的哪些属性需要封装数据,那么在对应的Action类中提供该属性的set方法即可。
        * 表单中的数据提交,最终找到Action类中的setXxx的方法,最后赋值给全局变量。
    
        * 注意0:Struts2的框架采用的拦截器完成数据的封装。
        * 注意1:这种方式不是特别好:因为属性特别多,提供特别多的set方法,而且还需要手动将数据存入到对象中.
        * 注意2:这种情况下,Action类就相当于一个JavaBean,就没有体现出MVC的思想,Action类又封装数据,又接收请求处理,耦合性较高。
    /**
     * 属性驱动
     * @author Administrator
     */
    public class Regist1Action extends ActionSupport{
        
        private static final long serialVersionUID = -966487869258031548L;
        
        private String username;
        private String password;
        private Integer age;
        public void setUsername(String username) {
            this.username = username;
        }
        public void setPassword(String password) {
            this.password = password;
        }
        public void setAge(Integer age) {
            this.age = age;
        }
        
        public String execute() throws Exception {
            System.out.println(username+" "+password+" "+age);
            return NONE;
        }
    
    }
    <h3>属性驱动的方式</h3>
    
    <form action="${ pageContext.request.contextPath }/regist1.action" method="post">
        姓名:<input type="text" name="username" /><br/>
        密码:<input type="password" name="password" /><br/>
        年龄:<input type="password" name="age" /><br/>
        <input type="submit" value="注册" />
    </form>
    <!-- 属性驱动的方式 -->
    <action name="regist1" class="com.itheima.demo2.Regist1Action"/>
      > 在页面上,使用OGNL表达式进行数据封装。
        * 在页面中使用OGNL表达式进行数据的封装,就可以直接把属性封装到某一个JavaBean的对象中。
        * 在页面中定义一个JavaBean,并且提供set方法:例如:private User user;
        * 页面中的编写发生了变化,需要使用OGNL的方式,表单中的写法:<input type="text" name="user.username">
        * 注意:只提供一个set方法还不够,必须还需要提供user属性的get和set方法!!!
          > 先调用get方法,判断一下是否有user对象的实例对象,如果没有,调用set方法把拦截器创建的对象注入进来,
    /**
     * 属性驱动方式,把数据封装到JavaBean的对象中
     * @author Administrator
     */
    public class Regist2Action extends ActionSupport{
        
        private static final long serialVersionUID = 6556880331550390473L;
        
        // 注意二:属性驱动的方式,现在,要提供是get和set方法
        private User user;
        public User getUser() {
            System.out.println("getUser...");
            return user;
        }
        public void setUser(User user) {
            System.out.println("setUser...");
            this.user = user;
        }
        
        public String execute() throws Exception {
            System.out.println(user);
            return NONE;
        }
    
    }
    <h3>属性驱动的方式(把数据封装到JavaBean的对象中)</h3>
    <!-- 注意一:页面的编写规则,发生了变化,使用的OGNL表达式的写法 -->
    <form action="${ pageContext.request.contextPath }/regist2.action" method="post">
        姓名:<input type="text" name="user.username" /><br/>
        密码:<input type="password" name="user.password" /><br/>
        年龄:<input type="password" name="user.age" /><br/>
        <input type="submit" value="注册" />
    </form>
    <!-- 属性驱动方式,把数据封装到JavaBean对象中 -->
    <action name="regist2" class="com.itheima.demo2.Regist2Action"/>
    第二种方式:模型驱动--经常使用
      > 使用模型驱动的方式,也可以把表单中的数据直接封装到一个JavaBean的对象中,并且表单的写法和之前的写法没有区别!
      > 编写的页面不需要任何变化,正常编写name属性的值
      > 模型驱动的编写步骤:
        * 手动实例化JavaBean,即:private User user = new User();
        * 必须实现ModelDriven<T>接口,实现getModel()的方法,在getModel()方法中返回user即可!!
    /**
     * 模型驱动的方式
     *     实现ModelDriven接口
     *  必须要手动实例化对象(需要自己new好)
     * @author Administrator
     */
    public class Regist3Action extends ActionSupport implements ModelDriven<User>{
        
        private static final long serialVersionUID = 6556880331550390473L;
        
        // 必须要手动实例化
        private User user = new User();
        // 获取模型对象
        public User getModel() {
            return user;
        }
        
        public String execute() throws Exception {
            System.out.println(user);
            return NONE;
        }
    
    }
    <h3>模型驱动方式</h3>
    <form action="${ pageContext.request.contextPath }/regist3.action" method="post">
        姓名:<input type="text" name="username" /><br/>
        密码:<input type="password" name="password" /><br/>
        年龄:<input type="password" name="age" /><br/>
        <input type="submit" value="注册" />
    </form>
    <!-- 模型驱动的方式 -->
    <action name="regist3" class="com.itheima.demo2.Regist3Action"/>

    Struts2把数据封装到集合中

    1. 封装复杂类型的参数(集合类型 Collection 、Map接口等)
    2. 需求:页面中有可能想批量添加一些数据,那么现在就可以使用上述的技术了。把数据封装到集合中
    3. 把数据封装到Collection中
      * 因为Collection接口都会有下标值,所有页面的写法会有一些区别,注意:
        > <input type="text" name="products[0].name" />
        * 在Action中的写法,需要提供products的集合,并且提供get和set方法。
    /**
     * 属性驱动的方式,把数据封装到List集合中
     * @author Administrator
     */
    public class Regist4Action extends ActionSupport{
        
        private static final long serialVersionUID = 6556880331550390473L;
        
        private List<User> list;
        public List<User> getList() {
            return list;
        }
        public void setList(List<User> list) {
            this.list = list;
        }
        
        public String execute() throws Exception {
            for (User user : list) {
                System.out.println(user);
            }
            return NONE;
        }
    
    }
    <h3>向List集合封装数据(默认情况下,采用是属性驱动的方式)</h3>
    <!-- 后台:List<User> list -->
    <form action="${ pageContext.request.contextPath }/regist4.action" method="post">
        姓名:<input type="text" name="list[0].username" /><br/>
        密码:<input type="password" name="list[0].password" /><br/>
        年龄:<input type="password" name="list[0].age" /><br/>
        
        姓名:<input type="text" name="list[1].username" /><br/>
        密码:<input type="password" name="list[1].password" /><br/>
        年龄:<input type="password" name="list[1].age" /><br/>
        <input type="submit" value="注册" />
    </form>
    <!-- 把数据封装到List集合中 -->
    <action name="regist4" class="com.itheima.demo2.Regist4Action"/>
    4. 把数据封装到Map中
        * Map集合是键值对的形式,页面的写法
            > <input type="text" name="map['one'].name" />
        * Action中提供map集合,并且提供get和set方法
    /**
     * 属性驱动的方式,把数据封装到map集合中
     * @author Administrator
     */
    public class Regist5Action extends ActionSupport{
        
        private static final long serialVersionUID = 6556880331550390473L;
        
        private Map<String, User> map;
        public Map<String, User> getMap() {
            return map;
        }
        public void setMap(Map<String, User> map) {
            this.map = map;
        }
    
        public String execute() throws Exception {
            System.out.println(map);
            return NONE;
        }
    
    }
    <h3>向Map集合封装数据(默认情况下,采用是属性驱动的方式)</h3>
    <form action="${ pageContext.request.contextPath }/regist5.action" method="post">
        姓名:<input type="text" name="map['one'].username" /><br/>
        密码:<input type="password" name="map['one'].password" /><br/>
        年龄:<input type="password" name="map['one'].age" /><br/>
        
        姓名:<input type="text" name="map['two'].username" /><br/>
        密码:<input type="password" name="map['two'].password" /><br/>
        年龄:<input type="password" name="map['two'].age" /><br/>
        <input type="submit" value="注册" />
    </form>
    <!-- 把数据封装到map集合中 -->
    <action name="regist5" class="com.itheima.demo2.Regist5Action"/>
  • 相关阅读:
    configparser模块
    xml文件解析
    shutil模块 + shelve模块 二合一版
    hashlib模块
    subprocess模块和sys模块
    re模块
    os模块
    random模块
    time模块、datetime模块讲解
    洛谷P3414 SAC#1
  • 原文地址:https://www.cnblogs.com/NEWHOM/p/6785685.html
Copyright © 2011-2022 走看看