Struts2中Action的数据如何获取的

引言

我们在使用struts2的时候,发现只要实现一个和 用户表单相对应的Action那么我们就可以在execute()方法中直接使用该请求的参数,存放在request域中的数据是谁帮我们完成了和Action中的对应哪?以及他们是如何对应的哪?

对于第一个问题大家都可能已经知道这位好人就是拦截器,我们的request域中存放的参数,已经由拦截器帮我们映射完毕了,那么下边就看一下是怎么映射的。

基本的数据对应方式

Struts2中提供了两种页面数据和Action对应的方式:属性驱动(FieldDriven)和模型驱动(ModelDriven);

属性驱动又分为两种:一种是基本数据类型的属性对应,另一种是JavaBean风格的属性对应。

(1)属性驱动(基本数据类型的属性对应)
就是我们需要建立一个与request域中对应的Java类,并要有get、set方法。
例如:登录表单如下

 <form action="helloworld/userAction.action" method="post">
        <input type="hidden" name="submitFlag" value="login" /> 
        用户名:<input type="text" name="account"><br> 
        密码:<input type="password" name="password"><br>
        <input type="submit" value="提交">
    </form>

那么我们就需要写一个Action和这个表单对应:

public class UserAction extends ActionSupport {

    private String submitFlag;
    private String account;
    private String password;
    //省去get和set方法
}

可以看出表单中的数据适合action相对应的,这样的话struts2会自动从request对象中把数据取出来,然后按照名称进行对应,自动设置到Action的属性里边去。

(2)属性驱动(直接使用域对象)
我们可以想到当我们表单中有很多数据的时候,那么我们的action中的数据会很多,不便于维护,这就是属性驱动的优势了,我们可以把这些属性封装到一个bean中然后再action中使用这个bean就可以了,具体如下:
表单和上一个相同:
bean中的参数和表单中相对应:

public class UserModel{
    private String submitFlag;
    private String account;
    private String password;
    //省去get和set方法
}

然后我们在action中使用的时候,就可以这样用了:

public class UserAction extends ActionSupport {
    private UserModel userModelTest = new UserModel(); //使用的是User的model,是和表单对应的
    public UserModel getUserModel() {
        return userModelTest ;
    }
    public void setUserModel(UserModel userModelTest ) {
        this.userModelTest = userModelTest ;
    }
}

这样的话我们的表单也要进行相应的改变,具体如下:

 <form action="helloworld/userAction.action" method="post">
        <input type="hidden" name="userModelTest.submitFlag" value="login" /> 
        用户名:<input type="text" name="userModelTest.account"><br> 
        密码:<input type="password" name="userModelTest.password"><br>
        <input type="submit" value="提交">
    </form>

(3)模型驱动
这种方式就是让Action实现ModelDriven的接口,这个接口实现一个getModel的方法,这个方法返回的就是Action所使用的数据模型对象。
例如:表单中的参数和前边一样

public class UserAction extends ActionSupport implements ModelDriven{

    private UserModel userModelTest = new UserModel();
    public UserModel getUserModel() {
        return userModelTest;
    }
    public void setUserModel(UserModel userModelTest) {
        this.userModelTest = userModelTest;
    }
    public Object getModel() {
        return userModelTest;
    }
}

这样的话我们的表单就不需要(2)中的那种点的形式了,也要进行相应的改变,具体如下:

 <form action="helloworld/userAction.action" method="post">
        <input type="hidden" name="submitFlag" value="login" /> 
        用户名:<input type="text" name="account"><br> 
        密码:<input type="password" name="password"><br>
        <input type="submit" value="提交">
    </form>

那么为什么这里不需要我们点出来了那(更确切的是为什么我们不需要前缀了),这是因为使用ModelDriven的方式,一个Action只能对应一个Model,因此不需要添加前缀。

上边的三种方式的优缺点大家都可以直接看出来了,不在细说。另外三种方式都可以混合使用。

传入非String类型的值

我们知道在实际的情况中并非传入的都是String类型的,好在Struts2能帮助用户自动完成基本类型的转换。
这里不是很难理解,不做说明。

如何处理传入多个值

比如我们注册的时候,需要填写用户的爱好,有一个checkbox会有多个值,我们怎么处理?
有两种方法:定义一个String类型的数组,提供get、set方法即可;另外就是定义一个私有的集合类型的属性,提供相应的get和set方法即可。

另外如果传入的值得个数不确定我们只能使用集合来进行处理。

  • 2
    点赞
  • 7
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 1
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

徐刘根

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值