model driven 英[ˈdrɪvn]
driven 是drive的被动形态
package com.action;
import com.model.UserModel;
import com.opensymphony.xwork2.ActionContext;
import com.opensymphony.xwork2.ActionSupport;
import com.opensymphony.xwork2.ModelDriven;
public class LoginAction extends ActionSupport implements ModelDriven<UserModel>{
private static final long serialVersionUID = 1L;
//创建UserModel实例
private UserModel user=new UserModel();
public void setUser(UserModel user) {
this.user = user;
}
//getter方法,必须实现
public UserModel getModel() {
// TODO Auto-generated method stub
return user;
}
//重载execute方法
public String execute() throws Exception {
//得到ActionContext实例
ActionContext context=ActionContext.getContext();
//将(“user”,user)放入ActionContext中
context.put("user", user);
return SUCCESS;
}
}
第一次接触带着泛型的接口,这个ModelDriven接口里面虽然看不到源代码,但是里面肯定是用了泛型T定义了里面的东西,大概是这样
interface ModelDriven<T>{
T...
}
再说这个代码,如果用来接收表单参数,这个表单参数而又很多的时候,就需要定义一大堆的属性,然后又是一大堆的get set方法,那么action既要接收参数,又要处理相关的业务逻辑,基于模块化的思想,把接收参数的这个功能分割开来,做成一个新的类
package com.model;
public class UserModel {
//UserModel类的name、age、address、telephone属性
private String name;
private String age;
private String address;
private String telephone;
//各个getter、setter方法
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public String getAge() {
return age;
}
public void setAge(String age) {
this.age = age;
}
public String getAddress() {
return address;
}
public void setAddress(String address) {
this.address = address;
}
public String getTelephone() {
return telephone;
}
public void setTelephone(String telephone) {
this.telephone = telephone;
}
}
使用了model之后提交参数就应该这么写
<input type=text name="name"/>
<input type=text name="age"/>
...
其实也可以不用这个接口,只是定义UserModel,然后也是在action里面定义private UserModel user;
但是不用这个接口的话,表单的提交参数就要改改
<input type=text name="user.name"/>
<input type=text name="user.age"/>
..
和前面相比较,也只是多了一个user前缀而已,所以用不用这个接口嘛,凭个人喜好吧