Struts2 - 属性驱动与模型驱动

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属性值与我们定义接收数据信息的变量
名对应起来。
三、如何使用属性驱动?
:对于属性驱动的实现是非常简单的 ,实例如下
java代码
package cn.actionctr;


import java.util.Date;
import com.opensymphony.xwork2.ActionSupport;

public class OneAction 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";//这里我默认返回success
              }
}



index.jsp
<body>

	<div>
	<form action="one" 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="password" name="address" id="address"/></td>
	</tr>
	<tr>
		<td>Age:</td>
		<td><input type="text" name="age" id="age"/></td>
	</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>
			

</body>


jsp代码show.jsp
<body>
<!--此处简单显示  -->

用户名:${pname}<br>

</body>


配置Struts.xml
<?xml version="1.0" encoding="UTF-8" ?>
<!DOCTYPE struts PUBLIC
	"-//Apache Software Foundation//DTD Struts Configuration 2.3//EN"
	"http://struts.apache.org/dtds/struts-2.3.dtd">

<struts>
<package name="my-packag" extends="struts-default" namespace="/">
		<!-- 指定自己的类 -->
		<action name="one" class="cn.actionctr.OneAction">
			<!-- 如果返回success字符串,就转发到show.jsp -->
			<result>/jsps/show.jsp</result>
		</action>
	</package>

</struts>


web.xml
<?xml version="1.0" encoding="UTF-8"?>
<web-app xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns="http://java.sun.com/xml/ns/javaee" xsi:schemaLocation="http://java.sun.com/xml/ns/javaee http://java.sun.com/xml/ns/javaee/web-app_3_0.xsd" id="WebApp_ID" version="3.0">
  <display-name>Strusts</display-name>
  
  
  <filter>
  <filter-name>s2</filter-name>
  <filter-class>org.apache.struts2.dispatcher.ng.filter.StrutsPrepareAndExecuteFilter</filter-class>
  </filter>
  <filter-mapping>
  <filter-name>s2</filter-name>
  <url-pattern>/*</url-pattern>
  </filter-mapping>
  <welcome-file-list>
  
    <welcome-file>index.jsp</welcome-file>

  </welcome-file-list>
</web-app>


四、模型驱动
:模型驱动有三点不同
1.所属的Action需要实现ModelDriven接口,并且给定类型和实现接口中的getModel方法
2.需要一个封装所有属性的javabean(对应 1.中的给给定类型)
3.在struts.xml文件中描述此Action的地方让该Action实现一个拦截器 (ModelDrivenInterceptor)
:具体实例如下:
package cn.actionctr;

import cn.domain.Person;
import com.opensymphony.xwork2.ActionSupport;
import com.opensymphony.xwork2.ModelDriven;

	public class OneAction 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
<?xml version="1.0" encoding="UTF-8" ?>
<!DOCTYPE struts PUBLIC
	"-//Apache Software Foundation//DTD Struts Configuration 2.3//EN"
	"http://struts.apache.org/dtds/struts-2.3.dtd">

<struts>
<package name="my-packag" extends="struts-default" namespace="/">
		<!-- 指定自己的类 -->
		<action name="one" class="cn.actionctr.OneAction">
			<!-- 如果返回success字符串,就转发到show.jsp -->
			<result>/jsps/show.jsp</result>
			<interceptor-ref name="modelDriven"></interceptor-ref>
                
		<interceptor-ref name="defaultStack"></interceptor-ref>
		</action>
		
	</package>

</struts>


package cn.domain;


import java.util.Date;
public class Person {
		private String pname;
		private int page;
		private String address;
		

	

	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;
	}
}

猜你喜欢

转载自1398183621.iteye.com/blog/2257770