在前面的文章中,我们为我们的应用程序安装了安全插件。除此之外,我们在使用应用程序时,可以登录和注销BootStrap.groovy文件中预定义的用户。
这一次,我们将创建我们自己的域类Status。这个类将更新现有用户的状态。
grails create-domain-class org.grails.twitter.Status
在grails-app/domain/org/grails/twitter路径下,创建并编辑Status.groovy文件,这是该文件刚被创建时的内容:
Status.groovy
package org.grails.twitter
class Status {
static constraints = {
}
}
我们在constraints闭包上面添加一些新的属性到 Struts类。
String message
Person author
Date dateCreated
我们添加了三个属性,即消息、作者和创建时间。修改后的文件内容如下:
Status.groovy
package org.grails.twitter
class Status {
String message
Person author
Date dateCreated
static constraints = {
}
接下来就是为 Status 类创建一个控制器类。
grails create-controller org.grails.twitter.Status
这个命令在app/controllers/org/grails/twitter目录下为我们自动创建一个新的控制器类文件 StatusController.groovy。
下一步为这个控制器设计视图。
在 grails-app/views/status目录下,新建一个index.gsp文件。可以拷贝粘贴下面的代码:
index.gsp
What Are You Doing?
What Are You Doing?
index.gsp的内容,我们将在运行应用程序时看到。它实际上为我们提供了一个HTML页面。在页面表单内有两个对象,一个文本域和一个提交按钮。
现在,让我们再次运行我们的应用程序。
grails run-app
现在你会发现,有一个新的控制器已添加:StatusController。点击该控制器的链接,你会被重定向到该控制器的视图,就是我们之前创建的index.gsp中。
在表单的文本框内输入任意文字,输入完成后点击Update Status按钮。
当你在浏览器看到这个错误不要惊讶。这是正常的,因为该应用程序正在我们的控制器中寻找pdateStatus定义。但目前我们还没有定义,这是正常的应用程序抛出一个异常,在这种情况下,错误404。
要解决这个问题,让我们编辑StatusController.groovy文件。无需停止服务器。
我们将下面的代码块插入到index闭包后面。
def updateStatus = {
def status = new Status(message: params.message)
status.author = lookupPerson()
status.save()
def messages = currentUserTimeline()
render template: 'messages', collection: messages, var: 'message'
}
这是对updateStatus定义的内容。 第2行将接收表单提交的值创建一个新的状态和使用消息。 第3行从一个未定义的的方法lookupPerson()(稍后,我们将它定义)来确定作者的值。 第4行的保存 status 对象。第5行定义了一个集合,将用于显示的现有的消息。 第6行呈现第5行所提供的所有消息。
让我们定义lookupPerson()
让我们定义lookupPerson()
private lookupPerson() {
Person.get(springSecurityService.principal.id)
}
这只是根据当前登录用户的ID创建一个新的Person对象。由于我们使用了springSecurityService对象,所以我们要在文件的顶部导入相关的类。 (稍后查看完整的代码)
private currentUserTimeline() {
def per = lookupPerson()
def query = Status.whereAny {
author { username == per.username }
}.order 'dateCreated', 'desc'
def messages = query.list(max: 10)
messages
}
接下来,我们添加index()闭包的内容:
def index() {
def msgs = currentUserTimeline()
return [messages: msgs] // this is a map. key=>value
}
当index页面加载时,显示所有的消息。
最后,我们希望这页被保护。这意味着,只有注册用户才可以访问这个页面。要做到这一点,我们将这行代码添加到类声明之前。
最后,我们希望这页被保护。这意味着,只有注册用户才可以访问这个页面。要做到这一点,我们将这行代码添加到类声明之前。
@Secured('IS_AUTHENTICATED_FULLY')
StatusController.groovy
package org.grails.twitter
import grails.plugins.springsecurity.Secured
@Secured('IS_AUTHENTICATED_FULLY')
class StatusController {
def springSecurityService
def index() {
def msgs = currentUserTimeline()
return [messages: msgs] // this is a map. key=>value
}
def updateStatus = {
def status = new Status(message: params.message)
status.author = lookupPerson()
status.save()
def messages = currentUserTimeline()
render template: 'messages', collection: messages, var: 'message'
}
private lookupPerson() {
Person.get(springSecurityService.principal.id)
}
private currentUserTimeline() {
def per = lookupPerson()
def query = Status.whereAny {
author { username == per.username }
}.order 'dateCreated', 'desc'
def messages = query.list(max: 10)
messages
}
}
在grails-app/views/status目录,创建一个新的的“_messages.gsp”文件。复制并粘贴下面的代码:
_messages.gsp
发布一个新的状态消息,看看会发生什么。
您将被重定向到新的页面,它会列出所有您已经发布的状态消息。
在接下来的教程中,我们将学习如何使用AJAX,以改善我们的更新状态。此外,越来越多的功能将被添加到我们的状态视图。