增加CRUD功能

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

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

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

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

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

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

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

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

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

修改yabe\conf\dependencies.yml

在require后面添加依赖的模块

  1. # Application dependencies
  2. require:
  3. - play -> crud

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

运行dependencies命令,安装模块

 为CRUD模块添加路由

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

  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实体类对应的控制器

  1. package controllers;
  2. public class Users extends CRUD {
  3. }

Post实体类对应的控制器

  1. package controllers;
  2. public class Posts extends CRUD {
  3. }

Comment实体类对应的控制器

  1. package controllers;
  2. public class Comments extends CRUD {
  3. }

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

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

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

在User实体中复写toString()

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

刷新页面

 为模型添加验证

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

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

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

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

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

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

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

为Post实体加入验证

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

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

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

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

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

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

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

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

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

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

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

通过message转换窗体显示的Label

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

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

  1. # You can specialize this file for each language.
  2. # For example, for French create a messages.fr file
  3. #
  4. title=Title
  5. content=Content
  6. postedAt=Posted at
  7. author=Author
  8. post=Related post
  9. tags=Tags set
  10. name=Common name
  11. email=Email
  12. password=Password
  13. fullname=Full name
  14. isAdmin=User is admin

原始的页面

转换后的页面

(七)play之yabe项目【CRUD】的更多相关文章

  1. (四)play之yabe项目【页面】

    (四)play之yabe项目[页面] 博客分类: 框架@play framework   主页面 显示当前发表博客的完整内容,以及历史博客列表 Bootstrap Job 一个play job任务就是 ...

  2. (八)play之yabe项目【身份验证】

    (八)play之yabe项目[身份验证] 博客分类: 框架@play framework   添加身份验证 play提供了一个模块-Secure(安全模块),用来做身份验证 允许Secure模块 修改 ...

  3. (九)play之yabe项目【发表博文】

    (九)play之yabe项目[发表博文] 博客分类: 框架@play framework   发表一篇博文 填充管理页面 从主页链接到管理页面时,只简单显示了登陆用户的名称 现在对显示的内容加以丰富 ...

  4. (六)play之yabe项目【验证码】

    (六)play之yabe项目[验证码] 博客分类: 框架@play framework   添加验证码功能 在Application.java中添加一个action:captcha() /** * 添 ...

  5. (三)play之yabe项目【数据模型】

    (三)play之yabe项目[数据模型] 博客分类: 框架@play framework   创建项目 play new yabe What is the application name? [yab ...

  6. 一张图搞定OAuth2.0 在Office应用中打开WPF窗体并且让子窗体显示在Office应用上 彻底关闭Excle进程的几个方法 (七)Net Core项目使用Controller之二

    一张图搞定OAuth2.0   目录 1.引言 2.OAuth2.0是什么 3.OAuth2.0怎么写 回到顶部 1.引言 本篇文章是介绍OAuth2.0中最经典最常用的一种授权模式:授权码模式 非常 ...

  7. 七天接手react项目-起步

    七天接手react项目-起步 背景 假如七天后必须接手一个 react 项目(spug - 一个开源运维平台),而笔者只会 vue,之前没有接触过 react,此刻能做的就是立刻展开一个"7 ...

  8. 七天接手react项目 系列 —— react 脚手架创建项目

    其他章节请看: 七天接手react项目 系列 react 脚手架创建项目 前面我们一直通过 script 的方式学习 react 基础知识,而真实项目通常是基于脚手架进行开发. 本篇首先通过 reac ...

  9. 七天接手react项目 系列

    七天接手react项目 背景 假如七天后必须接手一个 react 项目(spug - 一个开源运维平台),而笔者只会 vue,之前没有接触过 react,此刻能做的就是立刻展开一个"7天 r ...

随机推荐

  1. 电商O2O-11种最佳运营模式

    免费模式,是在这种矛盾下应运而生的新型模式.免费模式在未来的几年中,将会不断的渗透到各个行业中,这不单单是加速了行业内部的洗牌速度,更是加速了行业之间的洗牌速度. 未来,免费模式会让行业之间的界限变得 ...

  2. 译:在C#中使用LINQ To SQL

    译文出处:http://www.codeproject.com/Tips/871938/LINQ-To-SQL-Using-Csharp 今天在这个话题中,我给大家分享一个在c#编程中非常有趣和十分有 ...

  3. JavaScript - 2个等号与3个等号的区别

    简言之,== equality 等同,=== identity 恒等. ==, 两边值类型不同的时候,要先进行类型转换,再比较. ===,不做类型转换,类型不同的一定不等. 或: = 赋值运算符 == ...

  4. windows环境下配置php和redis

    Redis 是完全开源免费的,遵守BSD协议,是一个高性能的key-value数据库. 一.Window 下安装 下载地址:https://github.com/dmajkic/redis/downl ...

  5. Haskell 与范畴论

    说到 Haskell,这真是一门逼格极高的编程语言,一般初学者如果没有相关函数式编程的经验,入门直接接触那些稀奇古怪的概念,简直要跪下.现在回想起来,隐隐觉得初学者所拥有的命令式编程语言(impera ...

  6. ThinkJS 项目用 WebStorm 来设置断点与调试

    1. 前置条件.已按ThinkJS 2.0 文档 之 <创建项目> 建好项目. 说明a: 本示例创建项目名为wagang,使用es6配置: thinkjs new wagang --es6 ...

  7. `cocos2dx非完整` 日志模块 增量更新

    在上一篇文章中,说到了"流程"的由来,以及我对流程的使用. 这一片就是对流程的应用.前一篇文章中说到了三条流程 check_log_measure, check_env_measu ...

  8. 自己动手搭建 CAS(Central Authentication Service) 环境,为了单点登录(Single Sign On , 简称 SSO )

    介绍 刚刚搭建 CAS 成功了,现在记录下来,怕以后忘记,同时也给需要帮助的人.CAS 搭建需要服务端和客户端,服务端是 Java 写的,如果自己搭建则需要安装与配置 Java 环境.客户端可以是多种 ...

  9. AssetBundle系列——资源的加载、简易的资源管理器

    每个需要进行资源管理的类都继承自IAssetManager,该类维护它所使用到的所有资源的一个资源列表.并且每个资源管理类可以重写其资源引用接口和解引用接口. 每个管理器有自己的管理策略,比如Scen ...

  10. Linux的一些命令

    程序 # rpm -qa                # 查看所有安装的软件包 系统 # uname -a               # 查看内核/操作系统/CPU信息 # head -n 1 / ...