struts2的action一般封装了用户请求参数属性和业务逻辑调度。
再struts2中可以将用户请求参数封装到一个javaBean中,即使用一个独立的Model实例来封装用户的请求参数和处理结果,这就是模型驱动。就是再struts2中建立一个类似“ActionForm"的javabean来封装数据。
相对应的在action中,一般都是把用户请求参数封装载action类的属性中,而该属性通过getter和setter方法,将参数在整个生命周期内进行传递,这就是属性驱动。
模型驱动例:
package bank;
public class BankModel {
//用户名
private String username;
// 定义银行账号
private String account;
// 定义账号余额
private double Balance;
// 开户城市
private String city;
public String getAccount() {
return account;
}
public void setAccount(String account) {
this.account = account;
}
public double getBalance() {
return Balance;
}
public void setBalance(double balance) {
Balance = balance;
}
public String getCity() {
return city;
}
public void setCity(String city) {
this.city = city;
}
public String getUsername() {
return username;
}
public void setUsername(String username) {
this.username = username;
}
}
建立了封装用户的请求参数JavaBean外,还需要建立一个处理用户请求的Action,该Action除了需要实现Action接口外,还需要实现一个ModelDriven接口,该接口为使用模式驱动的action建立一个Model对象来代替Action本身将数据存入值栈
.
package bank;
import com.opensymphony.xwork2.Action;
import com.opensymphony.xwork2.ModelDriven;
public class BankModelAction implements Action, ModelDriven<BankModel> {
private BankModel bm=new BankModel();
public String execute() throws Exception {
getModel().setAccount("123456");
getModel().setBalance(1000.50);
getModel().setCity("北京");
return SUCCESS;
}
public BankModel getModel() { //使用该方法来获得Model对象。
// TODO Auto-generated method stub
return bm;
}
}
再在配置文件中增加
<action name="BankModelAction"
class="bank.BankValueStackAction">
<result name="success">/bank/BankModel_success.jsp</result>
</action>
jsp
<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<%@ taglib prefix="s" uri="/struts-tags" %>
<html>
<head>
<title>用户登录界面</title>
<s:head />
</head>
<body>
<table>
<s:form id="id" action="BankModelAction.action">
<s:textfield name="username" label="登录名称:"/>
<s:submit value="登录"/>
</s:form>
</table>
</body>
</html>
输出页面
<%@ page contentType="text/html; charset=UTF-8"%>
<%@taglib prefix="s" uri="/struts-tags"%>
<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">
<html>
<head>
<title>Insert title here</title>
</head>
<body>
<h2><s:property value="username"/></h2>
<h2><s:property value="account"/></h2>
<h2><s:property value="Balance"/></h2>
<h2><s:property value="city"/></h2>
</body>
</html>
属性驱动例:
package bank;
import com.opensymphony.xwork2.Action;
public class BankValueStackAction implements Action {
private BankModel bm;
private String username;
public String execute() throws Exception {
//建立一个BankModel对象实例
BankModel bm1=new BankModel();
bm1.setAccount("123456");
bm1.setBalance(1000.50);
bm1.setCity("北京");
//set方法存入值栈
setBm(bm1);
return SUCCESS;
}
public String getUsername() {
return username;
}
public void setUsername(String username) {
this.username = username;
}
public BankModel getBm() {
return bm;
}
public void setBm(BankModel bm) {
this.bm = bm;
}
}
需要定义一个与用户请求相对应的属性:username,并定义用户封装处理结果的值对象bm.这样用户视图需要做一些修改。
<%@ page contentType="text/html; charset=UTF-8"%>
<%@taglib prefix="s" uri="/struts-tags"%>
<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">
<html>
<head>
<title>Insert title here</title>
</head>
<body>
<h2><s:property value="username"/></h2>
<h2><s:property value="bm.account"/></h2>
<h2><s:property value="bm.Balance"/></h2>
<h2><s:property value="bm.city"/></h2>
</body>
</html>
上使用了OGNL表达式来访问栈值数据.
模式驱动比较独立,属性驱动比较灵活。
因为在struts1的版本中,属性的拦截以及控制的处理是被封装为两个对立的ActionForm、Action来获取HttpServerRequest的参数、控制访问的MAPPING的。而在Struts2中我们可以直接通过Action来获取请求参数,并把处理的资源映射返回给struts.xml指向对应的视图资源或者模型或者控制器进行下一步的处理。发现Action在Struts2中负责了struts1的ActionForm以及Action的双重任务,那么、我们如果习惯了struts1的开放方式的,在Struts中提供,模型驱动的方式来分解Action的任务,这种模式是通过专门的JavaBean来封装请求。
我们来比较一下:属性驱动和模型驱动的区别
属性驱动的例子:
public class Login implements Action //继承Action接口 { private String username; private String password; // set,get方法 (在属性驱动里面是依靠方法获取请求参数) public void setUsername(String username) { this.username = username; } public String getUsername() { return this.username; } public void setPassword(String password) { this.password = password; } public String getPassword() { return this.password; } // 默认的方法 public String execute() throws Exception { return SUCCESS; } } |
模型驱动例子
//模型使用JavaBean的设计方式 //和Struts1的ActionForm是一样 public class UserBean { private String username; private String password; public void setUsername(String username) { this.username = username; } public String getUsername() { return this.username; } public void setPassword(String password) { this.password = password; } public String getPassword() { return this.password; } //实现Action public class Login implements Action,ModelDriver<UserBean> //必须继承ModelDriver { private UserBean model = new UserBean(); public String execute() throws Exception { if (getMode().getUsername().equals("scott") && getMode().getPassword().equeals("tiger") ) { return SUCCESS; } else { return ERROR; } } public UserBean getModel() { return model; } }
|
其实,模型驱动必须实现ModelDriver接口,以及必须实现getMode()方法,该方法把Action和以及对应的Model实例关联。配置属性驱动和模型驱动的方式一样,在struts.xml文件中配置对应的Action即可,那他怎么实现的?
那么,我们要看到Struts2是一个拦截器为核心的框架,在struts_default.xml文件里面可以发现对应的拦截器的设置。
而我们在属性驱动模型下在JSP中访问属性时:
<s:property value="username">
而在模型驱动模型下在JSP中访问属性时:
<s:property value ="model.usename">
但是,Struts2会自动识别使用何种驱动模式,省略model.系统自动会关联到model.username的属性值。
版权声明:本文为博主原创文章,未经博主允许不得转载。