Struts2的属性驱动与模型驱动的区别

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

  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界面

 

你可能感兴趣的:(Struts2的属性驱动与模型驱动的区别)