增長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後面添加依賴的模塊
- # Application dependencies
- require:
- - play -> crud
注意:dependencies文件中不能使用TAB鍵,只能使用空格鍵!!!!!!
運行dependencies命令,安裝模塊
爲CRUD模塊添加路由
這條路由將把全部CRUD內建路由導入到/admin爲前綴的URL路徑中
- #import CRUD module
- * /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實體類對應的控制器
- package controllers;
- public class Users extends CRUD {
- }
Post實體類對應的控制器
- package controllers;
- public class Posts extends CRUD {
- }
Comment實體類對應的控制器
- package controllers;
- public class Comments extends CRUD {
- }
打開http://localhost:9000/admin/,便可看到系統中全部聲明控制器的實體對象了
點擊User實體,能夠查看當前的對象
這些User對象看起來有點不友好,只有一個簡單的序號(id?)來區分,能夠對其進行定製
在User實體中複寫toString()
- @Override
- public String toString() {
- return "User [" + fullname + "]";
- }
刷新頁面
爲模型添加驗證
既然能夠在頁面操做對象了,對應的數據校驗功能也不可少
使用play,對字段進行校驗,只須要使用註解便可,連javascript都不用寫
得益於play.data.validation.*這個包下的東東!
對User類的email字段和password進行驗證
- package models;
- import java.util.ArrayList;
- import java.util.List;
- import javax.persistence.Entity;
- import javax.persistence.OneToMany;
- import play.data.validation.Email;
- import play.data.validation.Required;
- import play.db.jpa.Model;
- @Entity
- public class User extends Model {
- @Required
- public String email;
- @Required(message="input your pwd now!")
- public String password;
- public String fullname;
- public boolean isAdmin;
- //@OneToMany 聲明User與Post之間是1對多的關係
- //mappedBy="author" 表示將經過對方(User)的author字段來進行關聯關係的維護
- @OneToMany(mappedBy="author")
- public List<Post> posts;
- public User(String email,String password, String fullname) {
- this.email = email;
- this.password = password;
- this.fullname = fullname;
- this.posts = new ArrayList<Post>(0);
- }
- /**
- * 聯合email和password兩個條件查詢User
- * @param email
- * @param password
- * @return
- */
- public static User connect(String email, String password) {
- return find("byEmailAndPassword", email, password).first();
- }
- /**
- * 添加Post的動做放到User中,這樣能夠把Post設置到User的List<Post>集合中
- * 這樣實現了雙方都持有對方的引用了
- * @param title
- * @param content
- * @return
- */
- public User addPost(String title, String content) {
- Post post = new Post(title,content,this).save();
- this.posts.add(post);
- this.save();
- return this;
- }
- @Override
- public String toString() {
- return "User [" + fullname + "]";
- }
- }
什麼都不輸,保存一個User對象
會提示錯誤信息到頁面的,play真實個大好人啊,什麼活都給幹了!
爲Post實體加入驗證
- package models;
- import java.util.ArrayList;
- import java.util.Date;
- import java.util.List;
- import javax.persistence.CascadeType;
- import javax.persistence.Entity;
- import javax.persistence.Lob;
- import javax.persistence.ManyToOne;
- import javax.persistence.OneToMany;
- import play.data.validation.MaxSize;
- import play.data.validation.Required;
- import play.db.jpa.Model;
- @Entity
- public class Post extends Model {
- @Required
- public String title;
- @Required
- public Date postedAt;
- //@Lob標註:聲明這是一個超大文本數據類型,用於存儲發佈的博客內容
- @Lob
- @Required
- @MaxSize(100000000)
- public String content;
- //@ManyToOne:聲明Post與User之間是多對一的關係
- //一個用戶能夠發佈多個博客,一個博客只能被一個用戶所發佈
- @Required
- @ManyToOne
- public User author;
- //1篇博客對應多個評論
- //刪除某篇博客,則級聯刪除其評論
- @OneToMany(mappedBy="post", cascade=CascadeType.ALL)
- public List<Comment> comments;
- public Post() {
- System.out.println("create Post");
- this.postedAt = new Date();
- }
- public Post(String title, String content, User author) {
- this.comments = new ArrayList<Comment>(0);
- this.title = title;
- this.content = content;
- this.author = author;
- this.postedAt = new Date();
- }
- /**
- * 在Post中實現評論的添加保存操做
- * 同時更新Post所持有的Comment的集合!
- */
- public Post addComment(String author, String content) {
- //保存對方
- Comment newComment = new Comment(author, content, this).save();
- //把對方加入到本身管理的集合中
- this.comments.add(newComment);
- //同步到數據庫
- this.save();
- return this;
- }
- /**
- * 前一篇博文
- */
- public Post previous() {
- return Post.find("postedAt < ? order by postedAt desc", postedAt).first();
- }
- /**
- * 後一篇博文
- */
- public Post next() {
- return Post.find("postedAt > ? order by postedAt asc", postedAt).first();
- }
- }
注意:使用CRUD在頁面操做,對象的建立過程:
1.調用默認構造函數生成一個對象
2.查詢數據庫,把數據賦值到這個對象
3.頁面呈現此對象的相關屬性
若是在頁面新建立一個對象,則不會查詢數據庫
1.調用默認構造函數生成一個對象
2.爲對象賦值(若是默認構造函數中有這樣作)
3.頁面呈現各個字段爲空的對象,若是有爲字段設置默認值,可在默認構造函數中操做
4.頁面輸入數據,保存對象
這裏想說的是:對於createTime這樣的字段值,通常是後臺new Date()建立的,在頁面使用CRUD貌似還不能對其進行控制,由於頁面會呈現這個字段出現讓用戶輸入(是否能夠經過js控制其disabled狀態呢?)暫時有這樣一個疑問!有人知否?或者play提供了禁止編輯的註解,是什麼???
經過message轉換窗體顯示的Label
在yabe\conf\messages中加入須要轉換的字符串
play會自動將頁面顯示的字符進行替換
- # You can specialize this file for each language.
- # For example, for French create a messages.fr file
- #
- title=Title
- content=Content
- postedAt=Posted at
- author=Author
- post=Related post
- tags=Tags set
- name=Common name
- email=Email
- password=Password
- fullname=Full name
- isAdmin=User is admin
原始的頁面
轉換後的頁面