在Struts 2中,提供了另外一种直接使用领域对象的方式,就是让action实现com.opensymphony. xwork2.ModelDriven接口。ModelDriven让你可以直接操作应用程序中的领域对象(模型对象),允许你在Web层和业务逻辑层使用相同的对象。定义接口时,需要主要该接口时泛型定义,需要加入类名。
继承该接口,只用覆写一个方法:public T getModel()
@Override
public User getModel() {
// TODO Auto-generated method stub
return user;
}
为什么要使用ModelDriven接口呢?
方法①如果直接在Action中定义属性和setter、getter方法的话,在属性很多的时候,会造成代码重复量很大,因为每写一个Action,当这个Action用到了这些类属性时,都需要去定义一遍属性和setter、getter方法。
private String name;
private String pass;
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public String getPass() {
return pass;
}
public void setPass(String pass) {
this.pass = pass;
}
方法②将所有的类属性和setter、getter方法包装在一个类中。在Action中,定义该类的一个对象
(此时你不需要new一个对象,直接在后面写上该对象的setter、getter方法,struts2会自动装填该对象)。
private User user = null;
public void setUser(User user){
this.user = user;
}
public User getUser(){
return this.user;
}
public String execute() {
if (user.getName().equals("wqy") && user.getPass().equals("aaa")) {
return SUCCESS;
} else {
return ERROR;
}
}
这种方法可以减少action中的代码量,但是在JSP中装填属性则必须要采取一下格式:
name:<input type="text" size="10" name="user.name"/><br />
pass:<input type="password" size=10 name="user.pass"/><br />
<input type="submit" value="submit~" />
这种方法会增加jsp中的代码量,不够简洁。
方法③使用ModelDriven
private User user = new User();
public String execute() {
if (user.getName().equals("wqy") && user.getPass().equals("aaa")) {
return SUCCESS;
} else {
return ERROR;
}
}
@Override
public User getModel() {
// TODO Auto-generated method stub
return user;
}
此方法在jsp页面中表示也很简单,直接使用属性名即可。
要注意这里必须要new一个对象,否则会报空指针的错误。
ModelDrivenInterceptor是缺省的拦截器链的一部分,当一个请求经过ModelDrivenInterceptor的时候,
在这个拦截器中,会判断当前要调用的Action对象是否实现了ModelDriven接口,如果实现了这个接口,
则调用getModel()方法,并把返回值(本例是返回user对象)压入ValueStack。