(七)play之yabe项目【CRUD】
增加CRUD功能
使用CRUD能干嘛?---->
在页面对模型进行增删改查操作,这样有什么实际意义呢?
不使用CRUD模块的功能,只要模型继承了Model类,就有save(),delete()等方法可以调用了
这个CRUD对开发有什么帮助?
用于快速生成一个基本的管理区域,如初始化一个登陆用户,很方便。
到目前为止,我对CRUD功能的理解只能这样:
提供一个可视化的对象管理界面,就好比数据库的客户端,play在后台执行SQL为我们处理数据
而我们可以在页面进行增删改查的操作,不用再写增删改查的代码了!
为了使用CRUD功能,需要导入play的CRUD依赖
修改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
原始的页面

转换后的页面

(七)play之yabe项目【CRUD】的更多相关文章
- (四)play之yabe项目【页面】
(四)play之yabe项目[页面] 博客分类: 框架@play framework 主页面 显示当前发表博客的完整内容,以及历史博客列表 Bootstrap Job 一个play job任务就是 ...
- (八)play之yabe项目【身份验证】
(八)play之yabe项目[身份验证] 博客分类: 框架@play framework 添加身份验证 play提供了一个模块-Secure(安全模块),用来做身份验证 允许Secure模块 修改 ...
- (九)play之yabe项目【发表博文】
(九)play之yabe项目[发表博文] 博客分类: 框架@play framework 发表一篇博文 填充管理页面 从主页链接到管理页面时,只简单显示了登陆用户的名称 现在对显示的内容加以丰富 ...
- (六)play之yabe项目【验证码】
(六)play之yabe项目[验证码] 博客分类: 框架@play framework 添加验证码功能 在Application.java中添加一个action:captcha() /** * 添 ...
- (三)play之yabe项目【数据模型】
(三)play之yabe项目[数据模型] 博客分类: 框架@play framework 创建项目 play new yabe What is the application name? [yab ...
- 一张图搞定OAuth2.0 在Office应用中打开WPF窗体并且让子窗体显示在Office应用上 彻底关闭Excle进程的几个方法 (七)Net Core项目使用Controller之二
一张图搞定OAuth2.0 目录 1.引言 2.OAuth2.0是什么 3.OAuth2.0怎么写 回到顶部 1.引言 本篇文章是介绍OAuth2.0中最经典最常用的一种授权模式:授权码模式 非常 ...
- 七天接手react项目-起步
七天接手react项目-起步 背景 假如七天后必须接手一个 react 项目(spug - 一个开源运维平台),而笔者只会 vue,之前没有接触过 react,此刻能做的就是立刻展开一个"7 ...
- 七天接手react项目 系列 —— react 脚手架创建项目
其他章节请看: 七天接手react项目 系列 react 脚手架创建项目 前面我们一直通过 script 的方式学习 react 基础知识,而真实项目通常是基于脚手架进行开发. 本篇首先通过 reac ...
- 七天接手react项目 系列
七天接手react项目 背景 假如七天后必须接手一个 react 项目(spug - 一个开源运维平台),而笔者只会 vue,之前没有接触过 react,此刻能做的就是立刻展开一个"7天 r ...
随机推荐
- 代码片段:基于 JDK 8 time包的时间工具类 TimeUtil
摘要: 原创出处:www.bysocket.com 泥瓦匠BYSocket 希望转载,保留摘要,谢谢! “知识的工作者必须成为自己时间的首席执行官.” 前言 这次泥瓦匠带来的是一个好玩的基于 JDK ...
- 导出 C/C++ API 给 Lua 使用[转]
导出 C/C++ API 给 Lua 使用 cocos2d-x 和 quick-cocos2d-x 的底层代码都是使用 C++ 语言开发的.为了使用 Lua 脚本语言进行开发,我们利用 tolua ...
- iOS 数据持久化(扩展知识:模糊背景效果和密码保护功能)
本篇随笔除了介绍 iOS 数据持久化知识之外,还贯穿了以下内容: (1)自定义 TableView,结合 block 从 ViewController 中分离出 View,轻 ViewControll ...
- 客户端cmd打开mysql,执行插入中文报错或插入中文乱码解决方案
最近在制作一个安装包,需要安装的时候执行mysql脚本儿,做了一个批处理,但是发现总是执行到 插入中文的时候报错,或者插入中文是乱码. 网上查了好多资料,说是把编码改成GBK什么的,终究还是不成功. ...
- seajs中spm压缩工具使用
seajs是个好东西,用起来很方便,但是她的压缩工具spm确不被网友看好,因为使用起来很麻烦,捯饬了一天多,终于勉强能压缩了,这里就简单记录一下. 按照地址:http://www.zhangxinxu ...
- ASP.NET MVC 中如何用自定义 Handler 来处理来自 AJAX 请求的 HttpRequestValidationException 错误
今天我们的项目遇到问题 为了避免跨站点脚本攻击, 默认我们项目是启用了 validateRequest,这也是 ASP.NET 的默认验证规则.项目发布后,如果 customError 启用了,则会显 ...
- 下载安装与配置 Java JDK 7
1. 去 Oracle 的官网下载 JDK,我下载的是:jdk-7u25-windows-x64.exe 大小为:90.6M 2. 双击它安装. 3. 安装完后,JDK 配置如下: 01 02 - ...
- Linux高级编程--08.线程概述
线程 有的时候,我们需要在一个基础中同时运行多个控制流程.例如:一个图形界面的下载软件,在处理下载任务的同时,还必须响应界面的对任务的停止,删除等控制操作.这个时候就需要用到线程来实现并发操作. 和信 ...
- C# DES加密解密用法
主要用到C#提供的以下三个类:MemoryStream 内存流DESCryptoServiceProvider 加密服务提供者类CryptoStream 讲数据流连接到加密转换的流 下面是简易代码,已 ...
- poj 3486 A Simple Problem with Integers(树状数组第三种模板改段求段)
/* 树状数组第三种模板(改段求段)不解释! 不明白的点这里:here! */ #include<iostream> #include<cstring> #include< ...