引言
我们在使用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方法即可。
另外如果传入的值得个数不确定我们只能使用集合来进行处理。