我们之前写的Action扮演了两种角色,既用于封装用户请求参数又处理控制逻辑。一般情况下用户的请求参数和action的处理结果都应该封装在model对象中。这就是模型驱动模式。这里要说说属性驱动和模型驱动,前者是以Action作为信息的携带者来封装用户请求参数和处理结果的,后者是使用Model示例取而代之的。就单单从Action的层面上来讲,模型驱动实现了Model和Controller的分离。下面看一个简单的例子:
首先定义一个Model类(其实就是JavaBean),用其封装用户请求参数和处理结果。
public class UserBean {
private String username;
private String password;
private String tip;
public String getUsername() {
return username;
}
public void setUsername(String username) {
this.username = username;
}
public String getPassword() {
return password;
}
public void setPassword(String password) {
this.password = password;
}
public String getTip() {
return tip;
}
public void setTip(String tip) {
this.tip = tip;
}
}
接下来我们就要定义模型驱动的Action,该Action要实现一个ModelDrivern接口。代码实现如下:
public class LoginAction implementsAction, ModelDriven {
private UserBean model = new UserBean();
public String execute() throws Exception {
return SUCCESS;
}
public UserBean getModel() {
return model;
}
}
结果页面如下:
${model.username }
${model.password }
我们就很纳闷儿,为什么我们在Action中实例化了一个UserBean对象后,用户请求参数值就自动赋给该对象的相应属性了呢?其实Struts2中有内置的model-driven拦截器,它会拦截用户请求参数,将其赋给Action中的Model对象的属性。
其实在结果页面中获取action中Model对象的属性还可以使用下面的表达式语句。
${username }
${password }
因为此时我们通过<s:debug />标签会发现我们在Action中定义的Model对象已经被置于值栈的最顶端了。因此可以直接访问其属性。