使用 Grails 构建富 Internet 应用程序,第 1 部分: 使用 Grails 和 Flex 构建 Web 应用程序
2009-11-19 00:00:00 来源:WEB开发网您首先注意到的可能是布尔标志 transactional。Grails 构建在大量成熟的技术之上,包括 Spring。它使用 Spring 的声明性事务来修饰带有事务的服务。如果您想执行数据更新,或希望其他事务服务能够使用这个服务,那么就要启用这个功能。您希望这个服务是只读的。它不会取代数据访问,因为您已经拥有处理这方面内容的域模型。
第一个服务操作获取所有新闻。第二个操作获取特定类别的新闻。在这里用到 GORM 的 where-样式的查找程序。它允许您传入一个名称/值对映射,以在 SQL 查询中构造一个 WHERE 子句。第三个操作让您可以使用特定标记搜索新闻。在这里使用的是 GORM 的动态查找程序。这样,您就可以将查询子句作为查找程序方法的名称的一部分。所以使用 findAllByTags 在标记列上执行查询。此外,还有注意 like 后缀;这是区分大小写的 SQL LIKE 子句。它允许您查找所有标记参数作为标记属性的子字符串的新闻。例如,如果一个新闻被标记为 “BarackObama”,它将在搜索 “obama” 时显示出来。
您创建了 3 种简单但强大的新闻搜索方式。注意,它们的语法都很简洁。如果您是一位 Java 程序员,就知道正常情况下要编写多少代码才能实现这些功能。搜索服务是很强大的,但现在还没有可供搜索的内容。您还需要一个用于管理每则新闻的服务,我称之为 Story 服务,如清单 3 所示。
清单 3. Story 服务
class StoryService {
boolean transactional = true
def create(story) {
story.votesFor = 0
story.votesAgainst = 0
log.info("Creating story="+story.title)
if(!story.save(flush:true) ) {
story.errors.each {
log.error(it)
}
}
log.info("Saved story="+story.title + " id=" + story.id)
story
}
def voteFor(storyId){
log.info("Getting story for id="+storyId)
def story = Story.get(storyId)
log.info("Story found title="+story.title + "
votesFor="+story.votesFor)
story.votesFor += 1
if(!story.save(flush:true) ) {
story.errors.each {
log.error(it)
}
}
story
}
def voteAgainst(storyId){
log.info("Getting story for id="+storyId)
def story = Story.get(storyId)
log.info("Story found title="+story.title + "
votesAgainst="+story.votesAgainst)
story.votesAgainst += 1
if(!story.save(flush:true) ) {
story.errors.each {
log.error(it)
}
}
story
}
}
更多精彩
赞助商链接