struts2进阶【3】——模型驱动与属性驱动

来源:互联网 发布:程序员客栈签约 编辑:程序博客网 时间:2024/06/06 06:40

一、为什么要使用属性驱动和模型驱动?

        struts2与struts很大的不同点在于,struts的execute方法提供了HttpServletRequest和HttpServletResponse方法在获取客户端提交的数据信息的时候需要使用HttpServletRequest的getParameter()方法,并且还需要进行必要的数据类型转换。如何客户端提交的数据量大的时候,我们则需要写很多的getParameter方法。这样代码量就相应的增加不少。但是struts2为我们提供了属性驱动和模型驱动,它不需要我们写很多的获取值的方法。而只需要我们在Action中定义相应的getter方法,在界面上以Action中的变量名作为表单元素的name属性值即可。


二、属性驱动和模型驱动有什么异同?

        1.属性驱动
        对于属性驱动,我们需要在Action中定义与表单元素对应的所有的属性,因而在Action中会出现很多的getter和setter方法
        2.模型驱动
        对于模型驱动,使用的Action对象需要实现ModelDriven接口并给定所需要的类型.而在Action中我们只需要定义一个封装所有数据信息的javabean
        3.属性和模型驱动的相同点
        当我们使用属性驱动和模型驱动的时候,必须将表单的元素中的name属性值与我们定义接收数据信息的变量 名对应起来。
  

三、如何使用属性驱动?

        对于属性驱动的实现是非常简单的 ,实例如下:
action:
package org.viancent.action;  import java.util.Date;  import com.opensymphony.xwork2.ActionSupport;  public class GetFieldAction extends ActionSupport {          private String pname;          private String address;          private int age;          private Date date;          public String getPname() {              return pname;          }          public void setPname(String pname) {              this.pname = pname;          }          public String getAddress() {              return address;          }                                public void setAddress(String address) {              this.address = address;          }          public int getAge() {              return age;          }          public void setAge(int age) {              this.age = age;          }          public Date getDate() {              return date;          }          public void setDate(Date date) {              this.date = date;          }                            @Override          public String execute() throws Exception {              return SUCCESS;                       }  }  
   
JSP:(register.jsp)  
   <div>     <form action="/struts2/register.action" method="post">         <table width="80%" align="center">     <tr>         <td>UserName:</td>         <td><input type="text" name="pname" id="pname"/>       </td>     </tr>     <tr>         <td>PassWord:</td>         <td><input type="text" name="address" id="address"/></td>     </tr>     <tr>         <td>Age:</td>         <td><input type="text" name="age" id="age"/></td>     </tr>     <tr>         <td>Date</td>         <td><input type="text" name="date" id="date"/></td>     </tr>     <tr>         <td colspan="2"><input type="submit" value="submit"/></td>     </tr>     </table>  </form>  </div>               //其他配置信息,相同  



四、模型驱动

        模型驱动有三点不同
        1.所属的Action需要实现ModelDriven接口,并且给定类型和实现接口中的getModel方法
        2.需要一个封装所有属性的javabean(对应 1.中的给给定类型)
        3.在struts.xml文件中描述此Action的地方让该Action实现一个拦截器 (ModelDrivenInterceptor)
        具体实例如下:
JavaBean(person)  
package org.viancent.domain;  import java.util.Date;  public class Person {         private String pname;         private int page;         private String address;         private Date date;      public Date getDate() {             return date;     }      public void setDate(Date date) {             this.date = date;     }      public String getPname() {             return pname;     }      public void setPname(String pname) {             this.pname = pname;     }      public int getPage() {             return page;     }      public void setPage(int page) {             this.page = page;     }      public String getAddress() {             return address;     }      public void setAddress(String address) {             this.address = address;     }  }  
Action:(RegisterAction)
package org.viancent.action;  import org.viancent.domain.Person;  import com.opensymphony.xwork2.ActionSupport;  import com.opensymphony.xwork2.ModelDriven;   public class RegisterAction extends ActionSupport implements  ModelDriven<Person/*这里需要填写Person对象*/> {                      private Person person =  new Person();                //定义Person对象用于承载getModel()方法返回的数据信息        //同时这里必须实例化对象,否则person的对象会为空                      public Person getPerson() {                 //实现person的getter方法,用于当请求转发后,其他界面数据访问             return person;     }      @Override     public Person getModel() {               //重写ModleDriven的方法,返回定义的person对象             return person;     }      @Override     public String execute() throws Exception {                //实现跳转                        System.out.println(person.getPage()+""+person.getDate());                  return SUCCESS;         }  }  
 struts.xml:
<action name="register"class="org.viancent.action.RegisterAction">     <result name="success">/result.jsp</result>         <result name="input">/show.jsp</result>         <interceptor-ref name="modelDriven"></interceptor-ref>                  //实现模型驱动的拦截器         <interceptor-ref name="defaultStack"></interceptor-ref>  </action>  
 JSP(register.jsp)
如上:属性驱动的JSP界面

五、总结

        1.属性驱动灵活,准确;模型驱动不灵活,因为很多时候,页面提交过来的参数并不属于模型中的属性,也就是说页面所提交过来的参数与模型中的属性并不一致,这是很常见的情况。
        2.模型驱动更加符合面向对象的编程风格,使得我们获得是对象而不是一个一个的离散的值。
        小结:推荐使用属性驱动编写Action。

1 0
原创粉丝点击