zoukankan      html  css  js  c++  java
  • struts2之ModelDriven

    在Struts 2中,提供了另外一种直接使用领域对象的方式,就是让action实现com.opensymphony. xwork2.ModelDriven接口。ModelDriven让你可以直接操作应用程序中的领域对象(模型对象),允许你在Web层和业务逻辑层使用相同的对象。

    ModelDriven接口中只有一个方法,如下:

    @override
    public T getModel();

    方法返回一个用于接收用户输入数据的模型对象

     在页面中,这个模型对象中的属性可以直接通过属性名来访问(如username),而不需要使用形如“user.username”这种格式的表达式,在action中也不需要为这个模型对象提供JavaBean风格的getter和setter方法。但是必须要在action中进行new操作,ModelDriven要使用泛型。

    下面我们让在3.1节创建的LoginAction类实现ModelDriven接口,修改后的代码如例3-7所示。

    例3-7 LoginAction.java

    [java] view plain ?
    1. package org.sunxin.struts2.ch03.action;  
    2. import org.sunxin.struts2.ch03.model.User;  
    3. import com.opensymphony.xwork2.Action;  
    4. import com.opensymphony.xwork2.ModelDriven;  
    5. public class LoginAction implements Action,ModelDriven<User>  
    6. {   
    7. private User user = new User();  
    8.  @Override  
    9. public String execute() throws Exception  
    10. {  
    11. …  
    12. //省略  
    13. }  
    14.  @Override  
    15. public User getModel()  
    16. {  
    17. return user;  
    18. }  
    19. }  

    修改login.jsp,修改后的代码如例3-8所示。

    例3-8 login.jsp 

    [xhtml] view plain ?
    1. …  
    2. <form action="login.action" method="post">  
    3. <table>  
    4. <tr>  
    5. <td>用户名:</td>  
    6. <td><input type="text" name="username"></td>  
    7. </tr>  
    8. <tr>  
    9. <td>密码:</td>  
    10. <td><input type="password" name="password"></td>  
    11. </tr>  
    12. <tr>  
    13. <td><input type="reset" value="重填"></td>  
    14. <td><input type="submit" value="登录"></td>  
    15. </tr>  
    16. </table>  
    17. </form>  
    18. …  

    LoginAction实现了ModelDriven接口,表单字段就不需要再使用“user.”前缀了。

    修改success.jsp,修改后的代码如例3-9所示。

    例3-9 success.jsp

    [xhtml] view plain ?
    1. …  
    2. <body>  
    3. <h3><s:property value="username" />,欢迎您登录程序员之家网站(www.sunxin.org)。</h3>  
    4. </body>  
    5. …  

    那么什么时候应该直接使用领域对象,什么时候应该实现ModelDriven接口呢?

    这两种方式实际上并没有本质的区别,对于大多数的应用,使用任何一种方式都可以。

    此外,注意区别field-driven/model-driven:

    field-driven:
    属性驱动,action拥有自己的属性,这些属性一般是java的基本类型,并且提供属性的getter和setter方法。表单字段直接和action的属性对应。

    private UserModel um;  
    public void setUm(UserModel um){  
        this.um = um;  
    }  
    public UserModel getUm(){
        return this.um;
    }

     在jsp页面中,id:<input type=“text” name=“um.id”>  中间的um.id就是基于field-driven取值的。

    model-driven:
    实现了ModelDriven接口可以在action中直接获得例如User对象,它会将表单字段自动封装到所需对象(如User)里去。使用ModelDriven必须实现泛型的getModel方法,并实现泛型实例。 

    public class GroupAction implements ModelDriven<Group>{
       private Group group;
       public Group getGroup() {
          return group;
        }
       public void setGroup(Group group) {
          this.group = group;
       }
       @Override
       public Group getModel() {
          if(group==null) group = new Group();
          return group;
       }
       public String addInput() {
          //处理
          return "success";
       }
    }

      

    http://blog.csdn.net/heyutao007/article/details/5980607

    加深理解可以再看:

    http://www.cnblogs.com/Topless/archive/2012/01/17/2324980.html

    区别field-driven/model-driven:

    http://blog.sina.com.cn/s/blog_8b3c701b010103it.html

  • 相关阅读:
    Python基础之只接收关键字参数的函数
    Python基础之可接受任意数量参数的函数
    Django基础之创建admin账号
    GIT版本控制工具
    全站导航
    python中对url编码解码处理
    VUE安装及初始化报错解决办法
    使用Appium+python爬取手机App
    python发送QQ邮件
    docker部署flask项目
  • 原文地址:https://www.cnblogs.com/itommy/p/10610341.html
Copyright © 2011-2022 走看看