教学文库网 - 权威文档分享云平台
您的当前位置:首页 > 文库大全 > 实用文档 >

play手把手教你创建一个博客项目-06.增加特征(tagging)支持

来源:网络收集 时间:2026-09-07
导读: play手把手教你创建一个博客项目-基于play1.2.4官方文档翻译而来 06.增加特征(tagging)支持 我们的博客上线运行后将包含非常多的博文,那么,要想快速找到某篇博文将越来越困难。为了能按主题进行分类,我们将为博客增加tagging支持。 创建Tag(以下简称特

play手把手教你创建一个博客项目-基于play1.2.4官方文档翻译而来

06.增加特征(tagging)支持

我们的博客上线运行后将包含非常多的博文,那么,要想快速找到某篇博文将越来越困难。为了能按主题进行分类,我们将为博客增加tagging支持。 创建Tag(以下简称特征)模型对象

Tag模型类自身其实非常简单:

package models;

import java.util.*;

import javax.persistence.*;

import play.db.jpa.*;

@Entity

public class Tag extends Model implements Comparable<Tag> {

public String name;

private Tag(String name) {

http://doc.guandang.net = name;

}

public String toString() {

return name;

}

public int compareTo(Tag otherTag) {

return http://doc.guandang.netpareTo(http://doc.guandang.net);

}

}

由于我们打算用findOrCreateByName(String name)工厂方法来实现懒散式特征创建或得到这些特征。那么,让我们把它添加到Tag类里: public static Tag findOrCreateByName(String name) { Tag tag = Tag.find("byName", name).first();

if(tag == null) {

tag = new Tag(name);

}

return tag;

play手把手教你创建一个博客项目-基于play1.2.4官方文档翻译而来

}

Tagging posts

是时候创建Tag模型与Post模型的关系了,让我们在Post类里创建正确的关系: …

@ManyToMany(cascade=CascadeType.PERSIST)

public Set<Tag> tags;

public Post(User author, String title, String content) {

http://doc.guandang.netments = new ArrayList<Comment>();

this.tags = new TreeSet<Tag>();

this.author = author;

this.title = title;

this.content = content;

this.postedAt = new Date();

}

请注意,在这里我们使用了TreeSet以可预知的顺序来保存特征列表 (事实上是按字母顺序的,这是基于我们之前compareTo实现)。

在这里,我们仅使用单向关系。

同时,我们将添加很多帮助方法来使特征管理简单化,第一个用于tag一个Post: …

public Post tagItWith(String name) {

tags.add(Tag.findOrCreateByName(name));

return this;

}

下一个用于通过指定的tag找回所有的博文:

public static List<Post> findTaggedWith(String tag) {

return Post.find(

"select distinct p from Post p join p.tags as t where http://doc.guandang.net = ?", tag

).fetch();

}

play手把手教你创建一个博客项目-基于play1.2.4官方文档翻译而来

是时候测试这些新代码了,让我们重新启动服务器到测试模式:

$ play test

在basicTest类里添加@Test:

@Test

public void testTags() {

// Create a new user and save it

User bob = new User("bob@http://doc.guandang.net", "secret", "Bob").save();

// Create a new post

Post bobPost = new Post(bob, "My first post", "Hello world").save(); Post anotherBobPost = new Post(bob, "Hop", "Hello world").save();

// Well

assertEquals(0, Post.findTaggedWith("Red").size());

// Tag it now

bobPost.tagItWith("Red").tagItWith("Blue").save();

anotherBobPost.tagItWith("Red").tagItWith("Green").save();

// Check

assertEquals(2, Post.findTaggedWith("Red").size());

assertEquals(1, Post.findTaggedWith("Blue").size());

assertEquals(1, Post.findTaggedWith("Green").size());

}

检查其是否正常工作。

下面的内容比上面的要难一点

好了,如果打算用多个tag来找回博文又该怎么做?看起来,这样难一点! 下面我将给你一些非常有用的JPQL查询,这些查询可能对你的web项目有用: …

public static List<Post> findTaggedWith(String... tags) {

return Post.find(

"select distinct p from Post p join p.tags as t where http://doc.guandang.net in (:tags) group by p.id, p.author, p.title, p.content,p.postedAt having count(t.id) = :size"

).bind("tags", tags).bind("size", tags.length).fetch();

}

play手把手教你创建一个博客项目-基于play1.2.4官方文档翻译而来

最棘手的部分就是我们必须使用having count语句来对联合查询视图进行过滤,仅让完全拥有全部tag的博文通过。

请注意,在这里我们不能使用Post.find("…", tags, tags.count)签名进行查询。这是因为tags已经是变量参数(vararg)了。

测试程序如下:

assertEquals(1, Post.findTaggedWith("Red", "Blue").size());

assertEquals(1, Post.findTaggedWith("Red", "Green").size());

assertEquals(0, Post.findTaggedWith("Red", "Green", "Blue").size()); assertEquals(0, Post.findTaggedWith("Green", "Blue").size()); …

特征(tag)云

哪里有tags,哪里就需要一个tag云。让我们在Tag类里添加一个方法来生成tag云:

public static List<Map> getCloud() {

List<Map> result = Tag.find(

"select new map(http://doc.guandang.net as tag, count(p.id) as pound) from Post p join p.tags as t group by http://doc.guandang.net order by http://doc.guandang.net"

).fetch();

return result;

}

在这里,我们使用了hibernate的一个现成特性,这个特性允许我们从一个JPA查询里返回一个定制对象。这个在List里的结果包含了一个Map,Map中的每个tag都带有两个key:tag用作tag名称,pound用作tag统计结果。 测试代码为:

List<Map> cloud = Tag.getCloud();

assertEquals(

"[{tag=Blue, pound=1}, {tag=Green, pound=1}, {tag=Red, pound=2}]", cloud.toString()

);

为博客UI添加tags(特征)

play手把手教你创建一个博客项目-基于play1.2.4官方文档翻译而来

现在,我们就可以用新的特征填充物来为浏览博客增加一个新的途径。和以前一样,为了高效工作,我们需要在最初的数据集里添加许多tags。

修改/yabe/conf/initial-data.yml文件,添加一些tags用于测试: …

Tag(play):

name: Play

Tag(architecture):

name: …… 此处隐藏:4501字,全部文档内容请下载后查看。喜欢就下载吧 ……

play手把手教你创建一个博客项目-06.增加特征(tagging)支持.doc 将本文的Word文档下载到电脑,方便复制、编辑、收藏和打印
本文链接:https://www.jiaowen.net/wenku/1802468.html(转载请注明文章来源)
Copyright © 2020-2025 教文网 版权所有
声明 :本网站尊重并保护知识产权,根据《信息网络传播权保护条例》,如果我们转载的作品侵犯了您的权利,请在一个月内通知我们,我们会及时删除。
客服QQ:78024566 邮箱:78024566@qq.com
苏ICP备19068818号-2
Top
× 游客快捷下载通道(下载后可以自由复制和排版)
VIP包月下载
特价:29 元/月 原价:99元
低至 0.3 元/份 每月下载150
全站内容免费自由复制
VIP包月下载
特价:29 元/月 原价:99元
低至 0.3 元/份 每月下载150
全站内容免费自由复制
注:下载文档有可能出现无法下载或内容有问题,请联系客服协助您处理。
× 常见问题(客服时间:周一到周五 9:30-18:00)