Struts2中数据的封装

Struts2中数据的封装

Struts2框架是一个web层框架,web层主要是处理网页传过来的数据。
Struts2提供了数据封装的功能。

Struts2中有三种数据封装的方式:
(1)属性驱动:提供属性set方法的方式(不常用)
(2)属性驱动:页面中提供表达式方式(偶尔用)
(3)模型驱动:实现ModelDriven<T>接口(常用)


先定义一个User类:

package com.pipi.struts2.demo2;

// 注册时的用户信息类
public class User {

    private String name;
    private String password;
    private Integer age;
    private String birthday;

    public String getName() {
        return name;
    }

    public void setName(String name) {
        this.name = name;
    }

    public String getPassword() {
        return password;
    }

    public void setPassword(String password) {
        this.password = password;
    }

    public Integer getAge() {
        return age;
    }

    public void setAge(Integer age) {
        this.age = age;
    }

    public String getBirthday() {
        return birthday;
    }

    public void setBirthday(String birthday) {
        this.birthday = birthday;
    }

    public User() {
    }

    @Override
    public String toString() {
        return "User{" +
                "name='" + name + '\'' +
                ", password='" + password + '\'' +
                ", age=" + age +
                ", birthday=" + birthday +
                '}';
    }
}

1、属性驱动:提供属性set方法的方式(不常用)

编写JSP:
Struts中日期自动转换格式有点问题,这里的生日只能为text,写xxxx-xx-xx类型。

	<h3>方式一:属性驱动,提供set方法</h3>
	<form action="${ pageContext.request.contextPath }/userAction1.action" method="post">
	    名称:<input type="text" name="name" /><br />
	    密码:<input type="password" name="password" /><br />
	    年龄:<input type="number" name="age" /><br />
	    生日:<input type="text" name="birthday" /><br />
	    <input type="submit" value="注册" />
	</form>
	<hr />

编写Action类:

package com.pipi.struts2.demo2;

import com.opensymphony.xwork2.ActionSupport;

// 方式一:属性驱动,提供set方法
public class UserAction1 extends ActionSupport {

    // 提供对应的属性
    private String name;
    private String password;
    private Integer age;
    private String birthday;

    // 提供setter方法,不需要提供getter
    public void setName(String name) {
        this.name = name;
    }
    public void setPassword(String password) {
        this.password = password;
    }
    public void setAge(Integer age) {
        this.age = age;
    }
    public void setBirthday(String birthday) {
        this.birthday = birthday;
    }

    @Override
    public String execute() throws Exception {
        // 只要提供对应属性,提供setter方法,数据会自动接收到
        System.out.println(name);
        System.out.println(password);
        System.out.println(age);
        System.out.println(birthday);

        // 封装数据
        User user = new User();
        user.setName(name);
        user.setPassword(password);
        user.setAge(age);
        user.setBirthday(birthday);
        System.out.println(user);

        return NONE;
    }
}

附上:自定义的日期转换类:

package com.pipi.myutils;

import com.opensymphony.xwork2.conversion.TypeConversionException;

import java.text.ParseException;
import java.text.SimpleDateFormat;
import java.util.Date;

public class MyDateFormat {

    // 支持多种日期格式
    public static final SimpleDateFormat[] dateArray = {
            new SimpleDateFormat("yyyy-MM-dd"),
            new SimpleDateFormat("yyyy/MM/dd"),
            new SimpleDateFormat("yyyy.MM.dd"),
            new SimpleDateFormat("yyyy年MM月dd日")
    };

    // 字符串 转 日期
    public static Date StringToDate(String str) {
        // 遍历支持的日期格式,尝试进行转换
        for (int i = 0; i < dateArray.length; i++) {
            try {
                return dateArray[i].parse(str);
            } catch (ParseException e) {
                continue;
            }
        }

        //如果遍历完毕后仍没有转换成功,表示出现转换异常
        System.out.println("字符串格式有点问题,转换失败!");
        throw new TypeConversionException();
    }

    // 日期 转 字符串
    public static String DateToString(Date date) {
        // 返回yyyy-MM-dd形式的字符串
        return new SimpleDateFormat("yyyy-MM-dd").format(date);
    }
}

2、属性驱动:页面中提供表达式方式

编写JSP:
注意:表单中的name值的写法。
user是Action类中的属性名称,user.后面的是User对象的属性。

	<h3>方式二:属性驱动,页面中提供表达式</h3>
    <form action="${ pageContext.request.contextPath }/userAction2.action" method="post">
        名称:<input type="text" name="user.name" /><br />
        密码:<input type="password" name="user.password" /><br />
        年龄:<input type="number" name="user.age" /><br />
        生日:<input type="text" name="user.birthday" /><br />
        <input type="submit" value="注册" />
    </form>
    <hr />

编写Action类:

package com.pipi.struts2.demo2;

import com.opensymphony.xwork2.ActionSupport;

// 方式二:属性驱动,页面中提供表达式。需要在Action类中封装一个User属性
public class UserAction2 extends ActionSupport {

    // 封装一个User属性对象
    private User user;

    // 一定得提供setter and getter
    // 因为拦截器完成数据封装,需要创建User对象。通过get方法可以获取同一个对象,通过set方法将数据封装到同一个对象中。
    public User getUser() {
        return user;
    }

    public void setUser(User user) {
        this.user = user;
    }

    @Override
    public String execute() throws Exception {
        // 接收数据,到属性user中
        System.out.println(user);

        return NONE;
    }
}

3、模型驱动:采用模型驱动方式(最常用的)

编写JSP:

	<h3>方式三:模型驱动:采用模型驱动方式</h3>
    <form action="${ pageContext.request.contextPath }/userAction3.action" method="post">
        名称:<input type="text" name="name" /><br />
        密码:<input type="password" name="password" /><br />
        年龄:<input type="number" name="age" /><br />
        生日:<input type="text" name="birthday" /><br />
        <input type="submit" value="注册" />
    </form>
    <hr />

编写Action类:

package com.pipi.struts2.demo2;

import com.opensymphony.xwork2.ActionSupport;
import com.opensymphony.xwork2.ModelDriven;

// 方式三:模型驱动:采用模型驱动方式。实现ModelDriven<T>接口。
public class UserAction3 extends ActionSupport implements ModelDriven<User> {

    // 封装一个User属性,必须自己手动初始化
    private User user = new User();

    @Override
    public User getModel() {
        return user;
    }

    @Override
    public String execute() throws Exception {
        // 接收数据,封装到user属性中
        System.out.println(user);

        return NONE;
    }
}

模型驱动方式虽然是最常用的方式,但是也存在缺点。
就是只能同时向一个对象中封装数据。但通常就是往一个对象中存数据。

使用第二种页面表达式的方式,可以向多个对象中同时封装数据。


  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值