读书笔记模型驱动与属性驱动

来源:互联网 发布:gpa加权平均分算法 编辑:程序博客网 时间:2024/06/04 18:46

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的属性值。


本文来自CSDN博客,转载请标明出处:http://blog.csdn.net/wrewrter/archive/2009/03/18/3999985.aspx

原创粉丝点击