Struts2属性驱动与模型驱动

来源:互联网 发布:电竞椅 知乎 编辑:程序博客网 时间:2024/05/28 05:13

1属性驱动是指用Action的属性来封装来回请求的参数.

2.模型驱动     模型驱动是指使用JavaBean来封装来回请求的参数.(个人理解

建议使用模型驱动,因为相比struts 1的Action类,struts 2的Action类承担了太多的责任:既用于封装来回请求的参数,   也保

护了控制逻辑,这使它的结构不够清晰.这就是模型驱动的优势.

 3.到底是用属性驱动和是模型驱动呢?  这个问题困扰了很多Struts2的初学者,我这里提供一些

建议:  (1)请你统一整个系统中的Action使用的驱动模型,即要么都是用属性驱动,要么都是用

模型驱动。  (2)如果你的DB中的持久层的对象与表单中的属性都是一一对应的话,那么就使用模

型驱动吧,毕竟看起来代码要整洁得多。  (3)如果表单的属性不是一一对应的话,那么就应该使

用属性驱动,否则,你的系统就必须提供两个Bean,一个对应表单提交的数据,另一个用与持久层。


以下是博主写的例子:

属性驱动:

1、在action中声明属性,属性的名称和页面元素中name属性的值保持一致

2、action中的属性必须有set和get方法

package test;public class DriverAction2{    private User user;        public String execute(){        return "success";    }    public User getUser() {        return user;    }    public void setUser(User user) {        this.user = user;    }}

jsp页面form表单


    <form action="login.action" method="post">   姓名 <input type="text" name="user.username"><br/>   密码 <input type="text" name="user.password"><br/>   年龄 <input type="text" name="user.age"><br/>    <input type="submit" value="submit">    </form>

可以看到值栈



模型驱动:


1、action实现一个接口ModelDriver

 2、在action中声明一个属性,该属性会封装页面中的数据,并且用new的方法

给该属性创建对象
填充接口中的方法getModel,返回该属性的值


package test;import com.opensymphony.xwork2.ModelDriven;public class ModelAction implements ModelDriven<User>{//直接实例化对象private User user=new User();public String execute(){return "success";}@Overridepublic User getModel() {// TODO Auto-generated method stubreturn user;}}



从上图可以看出,ModelDriverInterceptor有两个作用:

1、  当前请求的action必须实现ModelDriver接口

2、  把model对象放入到了栈顶


可以看到值栈显示object 为User封装类 property name 为user的属性


总结:

当表单中数据提交到对应的action中时,struts2容器会创建action,并且把action放入到栈顶,实

现ModelDriven的action类在对象栈中会有一个属性为model(username,password),之后

ModelDrivenInterceptor类会把action中的model属性放入栈顶(这样model属性直接可以访问了),

之后再由ParameterInterceptor类负责把页面上表单中的值赋值给对象栈中的属性,由该类中的

doInterceptor方法返回invocation.invoke()放行,回到action中,最后由jsp页面通过ognl表达

式显示对应的信息。


原创粉丝点击