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)