(七)play之yabe項目【CRUD】

 增長CRUD功能javascript

使用CRUD能幹嗎?---->java

在頁面對模型進行增刪改查操做,這樣有什麼實際意義呢?數據庫

不使用CRUD模塊的功能,只要模型繼承了Model類,就有save(),delete()等方法能夠調用了app

這個CRUD對開發有什麼幫助?框架

  用於快速生成一個基本的管理區域,如初始化一個登錄用戶,很方便。eclipse

到目前爲止,我對CRUD功能的理解只能這樣:ide

提供一個可視化的對象管理界面,就比如數據庫的客戶端,play在後臺執行SQL爲咱們處理數據函數

而咱們能夠在頁面進行增刪改查的操做,不用再寫增刪改查的代碼了!post

 

爲了使用CRUD功能,須要導入play的CRUD依賴ui

修改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   

 

 原始的頁面


 
 

 

轉換後的頁面

  
 

相關文章
相關標籤/搜索