登录  
 加关注
查看详情
   显示下一条  |  关闭
温馨提示!由于新浪微博认证机制调整,您的新浪微博帐号绑定已过期,请重新绑定!立即重新绑定新浪微博》  |  关闭

杨柳千丝,绊惹春风

普通人日记

 
 
 

日志

 
 
关于我

性格还算开朗,为人还算不错。 长相一般,身高一般,能力一般,人是一般。 不会浪漫,不会情调,不会唱歌,不会跳舞,不会吸烟,不爱喝酒,不会开车,爱听老歌

Groovy 和Grails从入门到精通 第五章 创建用户界面(四)  

2010-09-01 21:09:19|  分类: 技术 |  标签: |举报 |字号 订阅

  下载LOFTER 我的照片书  |

实现topbar的功能

       你已拥有一个完整的版面布局了,现在是实现topbar功能的时候了。topbar的功能是实现用户登陆。当用户选择登陆链接时,出现登陆框。当用户登陆后,topbar显示的是用户名称和退出按钮。

 

注意:现在实现的登陆功能只是一个初级的简单识别用户,并不是提供了一个功能全面,安全稳健的系统。因为现在的登陆只是个临时提供一个为所有控制器活动的验证逻辑。在第七章介绍一个功能全面的登陆系统

 

 

登陆界面

创建登陆界面要在合适的目录中创建一个登陆gsp文件。Gsp文件中包含一个选择用户名的单选下拉框和一个提交按钮。当提交用户选择,框架就调用UserController.handleLogin活动进行登陆。图5-7是登陆页面。

Groovy 和Grails从入门到精通 第五章 创建用户界面(四) - 虹 - 杨柳千丝,绊惹春风
 

                                   5-7 登陆页面

让我们一起看下登陆链接:<g:link controller="user" action="login">Login</g:link>。当使用者点击登陆链接时,UserController登陆活动(login action)被调用。我们在下一小节解释登陆活动。

基于以上规约,login.gsp文件应该位于 grails-app/views/user目录。列表5-11显示了login.gsp文件内容:

列表5-11 登陆页面(login.gsp)

01 <html>

02 <head>

03 <title>Login Page</title>

04 <meta name="layout" content="main" />

05 </head>

06 <body>

07 <div class="body">

08 <g:if test="${flash.message}">

09 <div class="message">

10 ${flash.message}

11 </div>

12 </g:if>

13 <p>

14 Welcome to Your ToDo List. Login below

15 </p>

16 <form action="handleLogin">

17

18 <span class='nameClear'><label for="login">

19 Sign In:

20 </label>

21 </span>

22 <g:select name='userName' from="${User.list()}"

23 optionKey="userName" optionValue="userName"></g:select>

24 <br />

25 <div class="buttons">

26 <span class="button"><g:actionSubmit value="Login" />

27 </span>

28 </div>

29 </form>

30 </div>

31 </body>

32 </html>

 

1-5行定义了页面标题以及页面是被main版面布局载入的(the page is decorated by the main layout,这意味着main.gsplogin.gsp的容器。让我们看看列表5-926行(表5-9 main.gsp26 <div id="content">),在这里,login.gsp主体是通过<g:layoutBody>插入的。还记得主版面布局中有个默认的标题吧:<g:layoutTitle default=”Collab Todo” />。当login.gsp文件被主版本布局载入(decorated时,login.gsp标题将替代这个默认标题。

6-31行定义了页面的主体。9-12行显示一个闪过的信息(flash message),关于这点在“Flash and Flash Messages”这节介绍。16-29行创建了一个选择域结构。16行指出当选择域被提交时,UserControllerhandleLogin将被调用。在22-23行,Grailsselect标签创建HTML选择元素。userName域类的name属性被当做选择域的名称(后又被传递给登陆动作)。当赋值时,form属性的值放在一个Crails使用创造选择的集合(When evaluated, the form attribute results in a collection that Grails uses to create the options)。optionKeyoptionKey两个特殊的属性用来创建HTML <option>元素的ID和选择域显示的方本内容。25-28 行使用Grails <g:actionSubmit>标签创建提交按钮。

现在运行程序来看这个页面,你会得到404错误。这是因为UserController登陆动作没有创建,而topbar要通过登陆协作连接到登陆页面的。

 

登陆动作(action

UserController被动态脚手架安装了。现在要继续使用动态脚手架为UserController增加登陆动作。列表5-12列出的是更新后的UserController版本。

Listing 5-12. The login Action

class UserController {

def scaffold = User

def login = {}

}

在网络中通常是使用该action为重定向机制。根据规约,Grails使用action名字去查找同名的GSP文件。

现在点击登陆链接,将进入登陆页面,但用户名选择域是空的。回忆一下列5-11,调用User.list()获得用户集来填充选择域。到目前你还添加任何用户,所以这里为空。现在让我们创建两个用户来测试该框架功能。在主页中,选择UserController ?New User。之后,再选择用户登陆,用户名将出现在右上角,如图5-8

Groovy 和Grails从入门到精通 第五章 创建用户界面(四) - 虹 - 杨柳千丝,绊惹春风
 

                                   5-8 一个登陆的用户

接下来,通过UserController handleLogin行为实现登陆逻辑。

 

处理登陆和退出行为

你调用handleLogin action来登陆用户。当你调用这个action时,Login 框架传递给登陆用户的username类,用户对象与username会话相关联,这样完成了登陆。如果用户没有找到,将会产生一个错误消息,并将重定向到登陆界面。在现在这个特殊例子里面,登陆都会成功,但这仍是个好的练习。Logout action从会话中移除用户,因此用户退出登陆。列表5-13显示的是改进后的usercontroller

列表5-13改进后的usercontroller

class UserController {

def scaffold = User

def login = {}

def handleLogin = {

def user = User.findByUserName(params.userName)

if (!user) {

flash.message = "User not found for userName: ${params.userName}"

redirect(action:'login')

}

session.user = user

redirect(controller:'todo')

}

def logout = {

if(session.user) {

session.user = null

redirect(action:'login')

}

}

}

 

当用户登陆后,将被带到Todo List页面,并且在topbar上显示用户名和退出链接。列表5-5中的第8行显示了退出链接与UserController logout action的关联。

现在你已开始改进代码了,但你必须像做其它方面的改进一样,确保不要破坏这个框架。这几乎是不可能,但接下来的一些好事情是从Six Sigma(译注:六西格玛,是一项以数据为基础,追求几乎完美的质量管理方法)、Poka Yoke偷主意(马化腾说:模仿是最稳妥的创新)。Poka Yoke是日本单词,意思是“错误检验”。这偷来的主意就是让错误显现出来,以便预防错误。你将通过创建测试来完成这些工作。下一小节帮助你编写测试来检验你刚才写的代码。

 

  评论这张
 
阅读(1319)| 评论(0)

历史上的今天

评论

<#--最新日志,群博日志--> <#--推荐日志--> <#--引用记录--> <#--博主推荐--> <#--随机阅读--> <#--首页推荐--> <#--历史上的今天--> <#--被推荐日志--> <#--上一篇,下一篇--> <#-- 热度 --> <#-- 网易新闻广告 --> <#--右边模块结构--> <#--评论模块结构--> <#--引用模块结构--> <#--博主发起的投票-->
 
 
 
 
 
 
 
 
 
 
 
 
 
 

页脚

网易公司版权所有 ©1997-2018