一、为什么要使用属性驱动和模型驱动?
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; } }