`
Puras
  • 浏览: 109854 次
  • 性别: Icon_minigender_1
  • 来自: 哪
社区版块
存档分类
最新评论

Grails--一个登录的小实例

阅读更多
这份指南的目标是展示如何创建一个简单的Grails登录实例.这不是第一份指南,你应该已经运行过Grails的Quick Start指南了,
如果没有可以查看Quick Start,了解Grails应用的入门知识.
一个复杂的,完整的权限的例子,可以查看下载的Grails里的CMS例子.
首先我们以User模型开始,包含email(用于登录)和密码.
这个模型用于登录并将其存到Session中.下面的例子只是显示了很少一部分信息:
class User { 
    Long id
    Long version

    String email
    String password

    String toString() {
        "$email"
    }

    static constraints = {
        email(email: true)
        password(blank: false, password: true)
    }
}

接下来我们添加一个简单的用户到grails-app/conf的启动里.这仅仅是创建一个用户实例用到测试登录,并保存写入的注册信息:

class ApplicationBootStrap {
     def init = { servletContext ->
    new User(email: "puras@163.com", password: "123456").save()
     }
     def destroy = {
     }
} 

接下来创建一个简单的Plant模型,如下面代码所示.这个模型是我们的测试模型,目的是用来做示范:
class Plant { 
    Long id
    Long version

    String description
    Boolean validated
    String hardiness
    Boolean evergreen
    String annual
    String genus
    String genusHybrid
    String species
    String speciesHybrid
    String variety
    String subSpecies
    String cultivar
    String forma

    static constraints = {
        hardiness(inList:["Hardy", "Half Hardy", "Tender"])
        annual(inList:["Annual", "Perennial", "Biennial"])
    }

    String toString() {
        "${this.class.name}: $id"
    }

    boolean equals(other) {
        if (other?.is(this)) return true
        if (!(other instanceof Plant)) return false
        
        if (!id || !other?.id || id != other?.id) return false

        return true
    }

    int hashCode() {
        int hashCode = 0
        hashCode = 29 * (hashCode + (!id ? 0 : id ^ (id >>> 32)))
    }
}

接下来,我们需要创建一个PlantController:
class PlantController {
    def beforeInterceptor = [action:this.&checkUser, except: ['index', 'list', 'show']]
    
    def scaffold = Plant

    def checkUser() {
        if (!session.user) {
            // i.e. user not logged in
            redirect(controller:'user', action:'login')
            return false
        }
    }
}

这个控制有下结额外的特征.首先,它添加了一个beforeInterceptor,在调用控制器的方法前先调用一个方法(这个概念类似面向方面编程).
在这个例子中,checkUser被调用,&仅仅是指向这个方法.这还有一个排除列表,使这个拦截器在index,list和show方法上失效.
标准的脚手架是在创建,修改,删除,保存和更新之前调用这个checkUser方法.在这个例子中,我们在创建,更新或是删除之前调用方法检查是否登录,
而在读取或展示Plants列表的时候不预处理.注意beforeInterceptor是如何在无效时返回false的,如果在Session中不包含User实体则返回false.
在我们没有添加 User实体之前,我们期待在执行Plant的
create/update/delete方法时进行重定向(排除list, index和show).
现在运行这个应用程序,并尝试试问http://localhost:8080/login/plant
(login是我这个应用的名称).你可以看到下面的界面(显示出来是因为list方法没有调用checkUser方法):

如果没有发生什么事件,先确认一下你是否执行了"grails run-app"并且在
启动的时候没有错误(比如端口和Tomcat冲突).如果依然不能工作,请重新尝试下GRails--Quick Start指南.
一旦你看到了上面的图片显示的内容, 点击New Plant链接.你将看到:
HTTP ERROR: 404
Not Found
RequestURI=/login/user/login

Powered by Jetty://

我们重定向到了user/login视图,但我们还没有创建它.所以,创建一个login.gsp:
<html>
<head>
<meta http-equiv="Content-Type" content="text/html;charset=UTF-8" />
<meta name="layout" content="main" />
<title>User Login</title>
</head>
<body>
    <div class="body">
        <g:form action="doLogin" method="post">
            <div class="dialog">
                <p>Entry your login details below:</p>
                <table class="userForm">
                    <tr class="prop">
                        <td valign="top" style="text-align:left;" width="20%">
                            <label for="email">Email:</label>
                        </td>
                        <td valign="top" style="text-align:left;" width="80%">
                            <input id="email" type="text" name="email" value="${user?.email}" />
                        </td>
                    </tr>
                    <tr class="prop">
                        <td valign="top" style="text-align:left;" width="20%">
                            <label for="password">Password:</label>
                        </td>
                        <td valign="top" style="text-align:left;" width="80%">
                            <input id="password" type="password" name="password" value="${user?.password}" />
                        </td>
                    </tr>
                </table>
            </div>
            <div class="buttons">
                <span class="formButton">
                    <input type="submit" value="Login"></input>
                </span>
            </div>
        </g:form>
    </div>
</body>
</html>

我们同样需要一个UserController,并且有一个login的方法:
class UserController {
    def login = {
    }
}

现在再次点击New Plant链接.你将看到如下的界面:

在我们没有登录时,进行的重定向,到了/user/login,排除list,index和show这几个可以忽略登录的方法.如果你尝试登录,你将得到:
HTTP ERROR: 404
Not Found
RequestURI=/login/user/doLogin

Powered by Jetty://

现在,我们需要向UserController里添加doLogin方法.这里是整个Controller的代码:
class UserController {
    def index = {
        redirect(controller:'user', action: 'login')
    }
    
    def login = {
    }
    
    def doLogin = {
        def user = User.findWhere(email:params['email'], password:params['password'])
        session.user = user
        if (user) 
            redirect(controller: 'plant', action: 'list')
        else
            redirect(controller: 'user', action: 'login')
    }
}

User.findWhere是执行"where email='email' and password='password'"的一个非常简单的方式.
我们存储对旬到session中,将会替换掉已经存在的对象.之后我们重定向到 plant/list(如果成功)或是user/login(如果失败,重新登录).
现在尝试进行登录,输入一个合法的用户:email->puras@163.com, password->123456(在启动文件里添加的测试数据),之后检查登录,
你将会看到plant的list页面.点击New Plant链接, 你将看到如下界面:

你也可以检查一下如果你输入了错误的密码,是否给你重定向到了login页面.

上面只是一个简单的小例子,你可以自己再添加一些其他的功能,以完善这个例子.

原文:http://www.blogjava.net/puras/articles/131091.html
译至:http://www.strattonenglish.co.uk/login_tutorial.pdf
分享到:
评论
3 楼 flybypower 2008-04-25  
不错。
我会一直支持的
2 楼 agile_boy 2007-07-23  
多谢 Puras 的贡献啊!
1 楼 Puras 2007-07-23  
这个格式还真难调整啊...

相关推荐

    grails-fck-editor-0.3.zip_grails_grails-fck-editor

    标题中的"grails-fck-editor-0.3.zip_grails_grails-fck-editor"表明这是一个与Grails框架相关的插件,具体来说是FCKeditor的一个版本。FCKeditor是一款广泛使用的开源富文本编辑器,它允许用户在网页上创建和编辑...

    grails-doc-CN-1.0.rar

    `grails-doc-CN-1.0.rar` 文件包含的是 Grails 1.0 版本的中文参考文档,对于那些不熟悉英文文档或者想要深入了解 Grails 的中文用户来说,这是一个极其宝贵的资源。 文档主要涵盖以下几个关键知识点: 1. **...

    grails-datastore-gorm-plugin-support-2.0.4.RELEASE.zip

    总之,"grails-datastore-gorm-plugin-support-2.0.4.RELEASE.zip"提供了一个宝贵的资源,让开发者有机会学习和实践Grails的ORM功能和Android的MVC设计模式。无论是对Grails框架的探索,还是对Android开发的深化,这...

    groovy-grails-tool-suite-3.6.4.RELEASE-e4.4.2-win32-x86_64.part1

    groovy-grails-tool-suite-3.6.4.RELEASE-e4.4.2-win32-x86_64.part1 共两个压缩包,解压后将扩展名.zip.bak改为.zip再次解压。

    grails-core源码

    在解压后的`grails-core-master`目录中,我们可以看到Grails的核心模块组织结构。通常,一个开源项目的源码结构反映了它的设计思路和功能划分。`src/main/groovy`包含了主要的源代码,`src/test/groovy`用于存放测试...

    Groovy&Grails - 指南.ppt

    在 `grails-app/domain` 创建 `User.groovy` 文件定义用户类,然后在 `grails-app/controllers/UserController.groovy` 编写控制器,处理用户的注册、登录等操作。在 `grails-app/views/user` 下创建相应的 GSP 页面...

    groovy-grails-tool-suite-3.6.4.RELEASE-e4.4.2-win32-x86_64.part2

    groovy-grails-tool-suite-3.6.4.RELEASE-e4.4.2-win32-x86_64.part2 共两个包,解压后需要将扩展名.zip.bak改名为.zip重新解压。 http://dist.springsource.com/release/STS/3.8.1.RELEASE/dist/ e4.6/spring-tool-...

    grails-quartz-0.4.1

    **Grails Quartz 0.4.1 插件详解** ...总的来说,`Grails-Quartz-0.4.1` 是一个经过实际验证的插件,它使得在`Grails` 应用中利用`Quartz` 进行任务调度变得更加简单,为开发者带来了更高效和可扩展的解决方案。

    grails-2.3.6.zip

    Grails 2.3.6是该框架的一个特定版本,发布于2014年,提供了许多改进和新特性,旨在优化开发流程。 1. **Groovy语言**: Grails的核心是Groovy语言,它是一种动态、类型安全的Java平台上的编程语言,语法简洁,具有...

    grails 中文文档+grails-fckeditor-0.9.5.zip插件

    FCKEditor是一款著名的在线文本编辑器,grails-fckeditor-0.9.5插件则是将其集成到Grails应用中的解决方案。以下是关键点: 1. 安装与配置:在Grails项目中添加插件依赖,然后通过配置文件调整编辑器的参数,如默认...

    grails-2.5.6

    Grails是一套用于快速Web应用开发的开源框架,它基于Groovy编程语言,并构建于Spring、Hibernate等开源框架之上,是一个高生产力一站式框架。 Grails这个独特的框架被视为是提升工程师生产效率的动态工具,因为其...

    grails-web-url-mappings-2.5.4.zip

    这个名为"grails-web-url-mappings-2.5.4.zip"的压缩包包含了Grails 2.5.4版本中的Web URL映射相关代码,让我们深入探讨这一关键组件。 Grails是一个基于Groovy语言的全栈式Java web框架,其设计理念是“简洁、生产...

    grails-4.0.3.rar

    给下载不方便的朋友提供一点点便利,最新版本。 Grails 4 ships with the following dependency upgrades: Groovy 2.5.6 GORM 7 and Hibernate 5.4 (now the default version of Hibernate for new applications) ...

    Grails-2.4.4-用户手册

    2. **创建新项目**:通过`grails create-app`命令创建项目,理解`grails-app`目录结构。 3. **编写Domain Class**:学习如何定义领域类,包括关系映射和验证规则。 4. **创建Controller**:了解如何创建控制器,处理...

    grails-acegi-0.5.zip

    4. `docs`、`grails-app`、`src`、`scripts`和`lib`目录则分别包含了插件的文档、应用代码、源代码、脚本以及依赖的库文件。 Grails Acegi 0.5插件提供了以下主要功能: - **用户认证**:支持多种认证机制,如...

    grails-docs-2.0.0

    `guide`目录包含了Grails框架的使用指南,如安装步骤、创建第一个应用、控制器、视图、服务、领域模型、URL映射、安全性和更多高级主题。这些指南对于初学者来说是宝贵的资源,能够帮助他们快速上手Grails开发。 `...

    grails-docs-1.0

    《Grails框架API文档详解——基于grails-docs-1.0》 Grails是一种基于Groovy语言的开源Web应用框架,它简化了Java开发,提供了丰富的功能和强大的工具,深受开发者喜爱。本文将深入探讨grails-docs-1.0版本的API...

    grails-2.4.4.zip

    Grails 2.4.4 是一个基于Java的开源Web应用框架,它利用Groovy语言的强大特性,为开发者提供了一种高效、灵活的开发环境。这个压缩包“grails-2.4.4.zip”包含了完整的Grails 2.4.4版本,使得开发者可以直接将其集成...

    grails-acegi-0.2.1.zip

    本文将详细探讨“grails-acegi-0.2.1.zip”这个插件,它是Grails框架中用于实现权限管理的Spring插件的一个早期版本。 Acegi Security是Spring框架的一个扩展,它提供了一套全面的、灵活的安全性解决方案。在Grails...

Global site tag (gtag.js) - Google Analytics