在Grails中创建一个简单的Twitter应用程序(第2部分)

在前面的文章中,我们为我们的应用程序安装了安全插件。除此之外,我们在使用应用程序时,可以登录和注销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页面。在页面表单内有两个对象,一个文本域和一个提交按钮。


   
   
在这一行,有两件事情,你应该记住。首先是action属性。该动作是点击提交按钮后发生的。这个action对应本视图在控制器内的一个动作。在这种情况下,必须有一个StatusController.groovy updateStatus定义。二是更新属性。这是点击提交按钮时,将要更新的对象名称​​。
现在,让我们再次运行我们的应用程序。
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()

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
}
这种方法只是返回一个Person中当前登录人的状态的集合。记录的最大数量为10,这些记录按降序排列。
接下来,我们添加index()闭包的内容:
def index() {
    def msgs = currentUserTimeline()
    return [messages: msgs] // this is a map. key=>value
}
当index页面加载时,显示所有的消息。
最后,我们希望这页被保护。这意味着,只有注册用户才可以访问这个页面。要做到这一点,我们将这行代码添加到类声明之前。
@Secured('IS_AUTHENTICATED_FULLY')
所有变化的结果,这应该是您的文件的内容。由于我们使用的是Security类,要导入,让程序可以找到grails.plugins.springsecurity包。
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
    }
 
}
给updateStatus做的最后一件事是创建一个页面,用于渲染结果。
在grails-app/views/status目录,创建一个新的的“_messages.gsp”文件。复制并粘贴下面的代码:
_messages.gsp

    
    
${message.author.realName} said ${message.message}
at
在浏览器刷新应用程序。无需重新启动该服务。效果立即发生。



发布一个新的状态消息,看看会发生什么。



您将被重定向到新的页面,它会列出所有您已经发布的状态消息。
在接下来的教程中,我们将学习如何使用AJAX,以改善我们的更新状态。此外,越来越多的功能将被添加到我们的状态视图。
  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值