(七)play之yabe项目【CRUD】

来源:互联网 发布:监控app软件排行 编辑:程序博客网 时间:2024/05/16 08:45


增加CRUD功能

使用CRUD能干嘛?---->

在页面对模型进行增删改查操作,这样有什么实际意义呢?

不使用CRUD模块的功能,只要模型继承了Model类,就有save(),delete()等方法可以调用了

这个CRUD对开发有什么帮助?

  用于快速生成一个基本的管理区域,如初始化一个登陆用户,很方便。

到目前为止,我对CRUD功能的理解只能这样:

提供一个可视化的对象管理界面,就好比数据库的客户端,play在后台执行SQL为我们处理数据

而我们可以在页面进行增删改查的操作,不用再写增删改查的代码了!

 

为了使用CRUD功能,需要导入play的CRUD依赖

修改yabe\conf\dependencies.yml

在require后面添加依赖的模块

Html代码  收藏代码
  1. # Application dependencies  
  2.   
  3. require:  
  4.     - play -> crud  

注意:dependencies文件中不能使用TAB键,只能使用空格键!!!!!!

 

 运行dependencies命令,安装模块



 

 为CRUD模块添加路由

这条路由将把所有CRUD内建路由导入到/admin为前缀的URL路径中

Html代码  收藏代码
  1. #import CRUD module  
  2. *       /admin              module:crud  

 

 刷新eclipse工程,可看到新增了一个modules文件夹,其下放了一个crud的文件

该文件存放了一个路径,指向了本地play解压目录中的\modules\crud文件夹

E:\technology-hqh\soft\play-1.2.5\modules\crud

 

要想将模块导入,还需要重新执行eclipsify命令

E:\technology-hqh\proj\play-framework\yabe>play eclipsify

刷新工程,这时模块才真正被导入到IDE中,项目中才能找到CRUD这个类!

 

 

 

声明模型所对应的控制器

按照默认约定,控制器的名称为对应模型的复数形式,如User--->Users

 当然,也可以自定义名称,只需要使用注解标明这个控制器对应的模型即可

但是,一般还是用默认的算了!呵呵,没那么多精力去研究,先跟着例子跑一遍再说!

 

User实体类对应的控制器

Java代码  收藏代码
  1. package controllers;  
  2.   
  3. public class Users extends CRUD {  
  4.   
  5. }  

 Post实体类对应的控制器

 

Java代码  收藏代码
  1. package controllers;  
  2.   
  3. public class Posts extends CRUD {  
  4.   
  5. }  

 Comment实体类对应的控制器

 

Java代码  收藏代码
  1. package controllers;  
  2.   
  3.   
  4. public class Comments extends CRUD {  
  5.   
  6. }  

 

 

打开http://localhost:9000/admin/,即可看到系统中所有声明控制器的实体对象了



 

点击User实体,可以查看当前的对象

这些User对象看起来有点不友好,只有一个简单的序号(id?)来区分,可以对其进行定制

 

在User实体中复写toString()

Java代码  收藏代码
  1. @Override  
  2. public String toString() {  
  3.        return "User [" + fullname + "]";      
  4. }  

 

 刷新页面



 

 为模型添加验证

 既然可以在页面操作对象了,对应的数据校验功能也不可少

使用play,对字段进行校验,只需要使用注解即可,连javascript都不用写

得益于play.data.validation.*这个包下的东东!

 

对User类的email字段和password进行验证

Java代码  收藏代码
  1. package models;  
  2.   
  3. import java.util.ArrayList;  
  4. import java.util.List;  
  5.   
  6. import javax.persistence.Entity;  
  7. import javax.persistence.OneToMany;  
  8.   
  9. import play.data.validation.Email;  
  10. import play.data.validation.Required;  
  11. import play.db.jpa.Model;  
  12.   
  13. @Entity  
  14. public class User extends Model {  
  15.       
  16.     @Email  
  17.     @Required  
  18.     public String email;  
  19.       
  20.     @Required(message="input your pwd now!")  
  21.     public String password;  
  22.       
  23.     public String fullname;  
  24.       
  25.     public boolean isAdmin;  
  26.       
  27.     //@OneToMany 声明User与Post之间是1对多的关系  
  28.     //mappedBy="author" 表示将通过对方(User)的author字段来进行关联关系的维护  
  29.     @OneToMany(mappedBy="author")  
  30.     public List<Post> posts;  
  31.       
  32.       
  33.     public User(String email,String password, String fullname) {  
  34.         this.email = email;  
  35.         this.password = password;  
  36.         this.fullname = fullname;  
  37.         this.posts = new ArrayList<Post>(0);  
  38.     }  
  39.       
  40.     /** 
  41.      * 联合email和password两个条件查询User 
  42.      * @param email 
  43.      * @param password 
  44.      * @return 
  45.      */  
  46.     public static User connect(String email, String password) {  
  47.         return find("byEmailAndPassword", email, password).first();  
  48.     }  
  49.       
  50.     /** 
  51.      * 添加Post的动作放到User中,这样可以把Post设置到User的List<Post>集合中 
  52.      * 这样实现了双方都持有对方的引用了 
  53.      * @param title 
  54.      * @param content 
  55.      * @return 
  56.      */  
  57.     public User addPost(String title, String content) {  
  58.         Post post = new Post(title,content,this).save();  
  59.         this.posts.add(post);  
  60.         this.save();  
  61.         return this;  
  62.     }  
  63.   
  64.     @Override  
  65.     public String toString() {  
  66.         return "User [" + fullname + "]";  
  67.     }  
  68.       
  69.       
  70.       
  71. }  

 

 什么都不输,保存一个User对象

会提示错误信息到页面的,play真实个大好人啊,什么活都给干了!

 

为Post实体加入验证

Java代码  收藏代码
  1. package models;  
  2.   
  3. import java.util.ArrayList;  
  4. import java.util.Date;  
  5. import java.util.List;  
  6.   
  7. import javax.persistence.CascadeType;  
  8. import javax.persistence.Entity;  
  9. import javax.persistence.Lob;  
  10. import javax.persistence.ManyToOne;  
  11. import javax.persistence.OneToMany;  
  12.   
  13. import play.data.validation.MaxSize;  
  14. import play.data.validation.Required;  
  15. import play.db.jpa.Model;  
  16.   
  17. @Entity  
  18. public class Post extends Model {  
  19.       
  20.     @Required  
  21.     public String title;  
  22.       
  23.     @Required  
  24.     public Date postedAt;  
  25.       
  26.     //@Lob标注:声明这是一个超大文本数据类型,用于存储发布的博客内容  
  27.     @Lob  
  28.     @Required  
  29.     @MaxSize(100000000)  
  30.     public String content;  
  31.       
  32.     //@ManyToOne:声明Post与User之间是多对一的关系  
  33.     //一个用户可以发布多个博客,一个博客只能被一个用户所发布  
  34.     @Required  
  35.     @ManyToOne  
  36.     public User author;  
  37.       
  38.     //1篇博客对应多个评论  
  39.     //删除某篇博客,则级联删除其评论  
  40.     @OneToMany(mappedBy="post", cascade=CascadeType.ALL)  
  41.     public List<Comment> comments;  
  42.       
  43.     public Post() {  
  44.         System.out.println("create Post");  
  45.         this.postedAt = new Date();  
  46.     }  
  47.   
  48.     public Post(String title, String content, User author) {  
  49.         this.comments = new ArrayList<Comment>(0);  
  50.         this.title = title;  
  51.         this.content = content;  
  52.         this.author = author;  
  53.         this.postedAt = new Date();  
  54.     }  
  55.       
  56.     /** 
  57.      * 在Post中实现评论的添加保存操作 
  58.      * 同时更新Post所持有的Comment的集合! 
  59.      */  
  60.     public Post addComment(String author, String content) {  
  61.         //保存对方  
  62.         Comment newComment = new Comment(author, content, this).save();  
  63.         //把对方加入到自己管理的集合中  
  64.         this.comments.add(newComment);  
  65.         //同步到数据库  
  66.         this.save();  
  67.         return this;  
  68.     }  
  69.       
  70.       
  71.     /** 
  72.      * 前一篇博文 
  73.      */  
  74.     public Post previous() {  
  75.         return Post.find("postedAt < ? order by postedAt desc", postedAt).first();  
  76.     }  
  77.       
  78.     /** 
  79.      * 后一篇博文 
  80.      */  
  81.     public Post next() {  
  82.         return Post.find("postedAt > ? order by postedAt asc", postedAt).first();  
  83.     }  
  84. }  

 

 

 注意:使用CRUD在页面操作,对象的创建过程:

1.调用默认构造函数生成一个对象

2.查询数据库,把数据赋值到这个对象

3.页面呈现此对象的相关属性

 

如果在页面新创建一个对象,则不会查询数据库

1.调用默认构造函数生成一个对象

2.为对象赋值(如果默认构造函数中有这样做)

3.页面呈现各个字段为空的对象,如果有为字段设置默认值,可在默认构造函数中操作

4.页面输入数据,保存对象

这里想说的是:对于createTime这样的字段值,一般是后台new Date()创建的,在页面使用CRUD貌似还不能对其进行控制,因为页面会呈现这个字段出现让用户输入(是否可以通过js控制其disabled状态呢?)暂时有这样一个疑问!有人知否?或者play提供了禁止编辑的注解,是什么???

 

 

 

 

通过message转换窗体显示的Label

yabe\conf\messages中加入需要转换的字符串

play会自动将页面显示的字符进行替换

Xml代码  收藏代码
  1. # You can specialize this file for each language.  
  2. # For example, for French create a messages.fr file  
  3. #  
  4. title=Title    
  5.   
  6. content=Content   
  7.   
  8. postedAt=Posted at   
  9.   
  10. author=Author    
  11.   
  12. post=Related post   
  13.   
  14. tags=Tags set   
  15.   
  16. name=Common name   
  17.   
  18. email=Email    
  19.   
  20. password=Password   
  21.   
  22. fullname=Full name   
  23.   
  24. isAdmin=User is admin   

 

 原始的页面


 
 

 

转换后的页面

 

 

 

 

 


0 0
原创粉丝点击