`
romejiang
  • 浏览: 96663 次
  • 性别: Icon_minigender_1
  • 来自: ...
社区版块
存档分类
最新评论

Grails从零开始开发项目四

阅读更多


i18n机制
 
Grails提供了健全的i18n机制,具体文件看看/grails-app/i18n目录就明白。默认会生成各个语言的properties文件。
Grails的很多地方都与i18n有关。
其中包括,域对象的约束,控制层的返回错误信息,gsp中的字符显示。


对象的约束:
blank约束对应于className.propertyName.blank properties文件中的 key,className和propertyName是你的类名称和属性名称
login(blank:false)
className.propertyName.blank
Controller里你会看到返回的错误信息。
读取properties文件中 default.created.message 这个key信息。
flash.message = "${message(code: 'default.created.message', args: [message(code: 'pricing.label', default: 'Pricing'), pricingInstance.id])}"
在gsp文件中一些字符需要用taglib从properties文件中读取。
<g:message code="default.list.label" args="[entityName]" />
这些工作很细碎,繁杂。还好Grails非常强大的插件机制和脚手架概念。
所以有一款插件:i18n-templates,可以帮你生成这些i18n需要的代码。

在安装i18n-templates插件之前,首先安装Grails的脚手架模板,
grails install-templates  

然后安装i18n-templates
grails plugin-install   i18n-templates

i18n-templates帮你把Grails的脚手架页面中所有硬code的信息都转换成从i18n中读取的信息,所以你在使用
grails generate-all ,grails generate-controller, grails generate-views  跟脚手架有关的命令时它都会调用i18n-templates脚手架模板文件,生成包括i18n的gsp和controller文件。
同时它提供了一个新命令,帮你吧所有i18n的字段和内容生成好。但你还需要吧这些信息copy到i18n文件中。

grails generate-i18n-messages <domainClass>
grails generate-i18n-messages "*"
这个命令读取你的域对象,生成域所需要的properties信息,前提是你必须把每个字段都放在constraints中,哪怕是空呢。

具体看插件介绍页面。
http://grails.org/plugin/i18n-templates

Grails插件

Grails的一个优点就是社区建设的比较完善,提供了非常完美严谨各种机制,这让很多的人都融入到Grails社区建设中来。其中插件机制是非常重要的一块,在web开发各个领域优秀的开源项目基本都有相应的Grails插件。
下面是我整理了一些不错的插件,并简单介绍一下怎么用这些插件。


blueprint-css :css插件
file-uploader : 一个简单的上传插件
i18n-templates : 前面说过了
jquery : 基本web开发离不开的js框架,也是最好用的js框架
lookups

http://www.grails.org/Lookups+Plugin 处理静态变量的插件。会吧静态数据放在properties 文件中,并管理他们。
例如:性别属性的内容,男女,地区的内容=可能就是几十个省市。用来保存缓存修改这种数据。
每一个只对应Lookup 和LookupValue字段,并分别保存在两个properties 文件中。
修改Config.groovy中的 lookups.cache.size.kb = 32 值,更改lookups缓存的大小

通过这两个地址管理:
http://localhost:8080/Taurus/lookup                添加数组的定义
http://localhost:8080/Taurus/lookupValue     添加数组中的数据

<g:lookupSelect id="status" name="status" realm="order.status"
value="${sales.status}"/>
<g:lookupValue realm="order.status" value="${sales.status}"/>

def lst = Lookup.codeList("order.status") // List of code/value pairs as maps
def val = Lookup.valueFor("order.status", 23) // The value for code 23

static constraints = {
    status(blank:false, validator: {val, obj ->
        return Lookup.valueFor("order.status", val) != null
    })
}
 



message-digest
: 提供一系列编码
加密编码,支持SHA1 and SHA1Hex MD5,使用非常简单就下面四种。
"some string".encodeAsSHA1()
"some string".encodeAsSHA1Hex()
"some string".encodeAsMD5()
"some string".encodeAsMD5Hex()

pdf : 将普通的页面输出成pdf,如果要求不高这个插件足够


tag插件
http://www.grails.org/plugin/taggable
拥有tag的实体需要继承下面接口

import org.grails.taggable.*

class Vehicle implements Taggable {
}
 



tag插件提供的一些方法

//添加TAG
def v = Vehicle.get(1)

v.addTag("red")
.addTag("sporty")
.addTag("expensive")

// Alternatively
v.setTags(['red', 'sporty', 'expensive'])

// Or
v.addTags(['electric', 'hybrid'])


///查询:
def v = Vehicle.get(1)
println v.tags

def vehicles = Vehicle.findAllByTag("sporty") // Also takes params eg [max:5]
def count = Vehicle.countByTag("sporty")

assert 3 == Vehicle.totalTags
assert ['expensive', 'red','sporty'] == Vehicle.allTags


//Tag分析:
def tags = "red,sporty,expensive"
def v = Vehicle.get(1)

v.parseTags(tags)
assert ['expensive', 'red','sporty'] == v.tags

tags = "red/sporty/expensive"

v.parseTags(tags, "/")
assert ['expensive', 'red','sporty'] == v.tags


//域对象的其他方法:

getAllTags

getTotalTags

countByTag { String tag ->

findAllByTag { String name->

findAllByTag { String name, Map args->

findAllByTagWithCriteria { String name, Closure crit ->

findAllTagsWithCriteria { Map params, Closure criteria ->
 



在配置文件中配置tag的数据库表名等信息,Config.groovy:
grails.taggable.tag.table="MY_TAGS"
grails.taggable.tagLink.table="MY_TAG_LINKS"


image-tools
http://grails.org/plugin/image-tools  超好用的图片处理工具,没啥说的,好,基于JAI。早就在找这东西了~~
安装方法:
grails install-plugin http://www.arquetipos.co.cr/blog/files/grails-image-tools-1.0.4.zip

def imageTool = new ImageTool()
imageTool.load(f.getBytes())         //载入二进制图片数据

imageTool.load("/path/to/image.jpg") //从文件载入图片

imageTool.saveOriginal() //保存

imageTool.thumbnail(640) // 缩略图

imageTool.writeResult("smaller.640.jpg", "JPEG") //另存为

var arr = imageTool.getBytes("JPEG")

imageTool.swapSource()

//添加水印:

imageTool.loadAlpha("alpha.jpg")
imageTool.loadMask("mask.jpg")
imageTool.applyMask()

//恢复原图:
imageTool.restoreOriginal()
例子:
def imageTool = new ImageTool()
imageTool.load("/path/to/image.jpg")
// Reduces the image size
imageTool.thumbnail(640)
// Saves the result
imageTool.writeResult("image_smaller.jpg", "JPEG")
// Crops it to a square
imageTool.square()
/*
* Swaps the resulting image with the main one, so that we continue to
* operate on the square crop.
*/
imageTool.swapSource()
// Creates a copy of the original for later restore
imageTool.saveOriginal()
/*
* Iterate through the thumbnail sizes that we want
*
*/
[178, 133, 69].each {
def tempName = "image.${it}.jpg"
/*
* Creates and saves the thumbnail. It needs to be temporarily saved
* and re-loaded before applying the masking operation, because of
* something that seems to be a JAI glitch.
* See the following link for details:
* http://ricardo.strangevistas.net/jai-and-masking-operations.html
*/
imageTool.thumbnail(it)
imageTool.writeResult(tempName, "JPEG")
imageTool.load(tempName)
// Loads the alpha and mask, and applies them
imageTool.loadAlpha("Alpha_${it}.jpg")
imageTool.loadMask("Mask_${it}.jpg")

imageTool.applyMask()
// Finally, save it and restore the original so that we can continue
// to operate on the unmodified image
imageTool.writeResult(tempname, "JPEG")
imageTool.restoreOriginal()
}
 

include 插件
http://grails.org/plugin/include 让gsp支持包含标签
<inc:include url="/user/list"/> <inc:include url="/resource.html"/>

jcaptcha 验证码插件
http://grails.org/plugin/jcaptcha 验证码插件。以前一直在用。以前写过关于它的使用文章。或者参考其他的文章
http://romejiang.iteye.com/blog/212622


swfupload上传插件
http://grails.org/plugin/super-file-upload    使用js+flash(swfupload)的上传插件,但没有使用最新的swfupload。

有三个标签,首先使用generateConfiguration 配置标签。

<sfu:generateConfiguration fileSize="30" form="bookForm" buttonImageFile="/buttons/browse-button-sprite.png" buttonWidth="104" buttonHeight="30"/>

然后上传标签
<sfu:fileUploadControl/>
最后进度条标签
<sfu:fileUploadProgressBar/>
并在 form中加上 return sfuSubmitForm(this);
<form id="bookForm" name="bookForm" onsubmit="return sfuSubmitForm(this);">

acegi 安全插件
acegi : 安全、登陆、权限插件,使用的Spring Security,针对Spring Security进行了包装,让Spring Security更加简单好用。
http://grails.org/plugin/acegi 权限和验证框架。
http://www.infoq.com/cn/articles/grails-acegi-integration  
http://www.grails.org/AcegiSecurity+Plugin+-+Customizing+with+SecurityConfig 配置文件解释
acegi插件infoq的文章已经讲的很明白了,我只说一些他没有涉及的一些东西。

authenticateService提供的一些方法

org.springframework.security.context.SecurityContextHolder.context.authentication.principal 获取已登陆的用户对象

authenticateService.principal() 只是获得一个当前登陆用的代理
authenticateService.userDomain() 这个才是返回当前登陆的用户域对象,但是需要注意这是登陆时存放在内存里的,在登陆后更新过的用户信息不会体现,所以应该注意在有时你需要: User.get(authenticateService.userDomain()?.id)
 
authenticateService.encodePassword(String passwd) acegi负责了用户注册和管理,密码都是加密过的,这个acegi所用的加密方法。
authenticateService.isLoggedIn() 判断是否登陆。

权限组
权限组前缀必须是ROLE_有人所可以不用,但我很早前试过好像不行,就没有尝试。
使用url设置权限时,最好低级的组权限高级的组
例如这样:

配置信息
defaultRole = 'ROLE_USER' 默认的权限组

使用acegi需要运行的生成命令:
grails create-auth-domains User Role Requestmap
grails generate-manager
grails generate-registration


quartz定时插件
grails install-plugin quartz // 安装
grails create-job  job-name // 生成job

 

class MyJob {
  static triggers = {
    simple name: 'mySimpleTrigger', startDelay: 60000, repeatInterval: 1000 
  }

def group = "MyGroup"

def execute(){ print "Job run!" }


}
 



一些定时触发器规则的例子:
        simple name:'simpleTrigger', startDelay:10000, repeatInterval: 30000, repeatCount: 10
        cron name:'cronTrigger', startDelay:10000, cronExpression: '0/6 * 15 * * ?'
        custom name:'customTrigger', triggerClass:MyTriggerClass, myParam:myValue, myAnotherParam:my

0
0
分享到:
评论
2 楼 fenglin_Java 2012-04-06  
能问个问题吗?能大概说下你做项目的时候注册是怎么做的吗?验证怎么验证的呢?用插件做的,还是什么呢?我本来是想用jquery做的,后来发现grails自带验证功能,我就用grails做了,但是做着做着发现很多情况不好实现,现在做的没头绪了。能请教一下你是怎么做的吗?
1 楼 wenxiang_tune 2011-09-17  
谢谢,灰常不错,我将继续关注。。。。

相关推荐

    Grails从零开始开发项目二

    在本节中,我们将深入探讨"Grails从零开始开发项目二"的相关知识点,这是一个关于使用Grails框架进行Web应用开发的学习过程。Grails是一种基于Groovy语言的开源Web应用框架,它以其高效的开发速度和丰富的插件生态...

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

    2. 快速上手:文档通常包含安装指南、教程、API参考等,为开发者提供从零开始到项目开发的全程指导。 3. 进阶学习:除了基础内容,中文文档还可能涉及更高级的主题,如性能优化、测试策略、插件开发等,帮助开发者...

    grails app

    《构建Grails应用程序:从零开始》 在IT行业中,Grails是一个基于Groovy语言的开源Web应用框架,它利用了Java平台的优势,提供了一种高效、简洁的开发方式。本压缩包文件“grails app”包含了一步步搭建Grails应用...

    Grails基础教程.pdf

    - **Hubbub快速启程**:从零开始创建一个简单的应用实例。 - **GORM的介绍**:Grails对象关系映射(GORM)是一种强大的ORM框架,简化了数据访问层的开发。 **5.2 第一个领域类对象** - **通过测试储存和获得用户**...

    Grails,移动互联网时代服务器端开发的利器

    Grails拥有丰富的插件生态系统,可以快速扩展功能,如安全、缓存、报表等,无需从零开始编写代码。 5. **模板引擎** GSP(Grails Server Pages)模板引擎允许开发者使用Groovy语法编写视图,与控制器和模型紧密...

    Java程序员使用Grails的十大优势

    使用Grails意味着开发者不必从零开始学习新的框架或语言,而是可以在现有基础上进一步发展。这种做法不仅节约了时间,还提高了生产力。因此,对于那些希望在已有技能集上进行扩展的Java开发者来说,Grails是一个理想...

    Getting Started with Grails

    - **集成性**:深度集成了Spring、Hibernate等框架,利用它们的强大功能而不需从零开始。 - **易用性**:丰富的脚本命令和自动化生成机制,让开发者能够快速搭建应用原型。 - **社区支持**:拥有活跃的开发者社区,...

    Grails1.0_final_doc_and_API

    这部分内容可以帮助开发者从零开始学习Grails,涵盖了从安装环境到创建第一个应用程序的所有步骤。其中,你将了解到: 1. **Groovy基础**:Grails的基础是Groovy语言,它是一种动态的、面向对象的编程语言,语法...

    Grails 2 A Quick-Start Guide (Pragmatic Programmers 2013)

    - **项目实战案例**:通过一个具体的项目案例,从零开始逐步构建一个完整的Web应用程序,涵盖从环境搭建到部署上线的整个过程。 - **最佳实践指导**:提供了一系列开发过程中可能会遇到的问题及解决方案,以及如何...

    Grails.2.A.Quick-Start.Guide.pdf

    3. **项目迭代开发**:通过一个具体案例,从零开始构建一个完整的Grails应用程序。书中详细介绍了从需求分析到功能实现的全过程,包括数据库设计、控制器编写、视图渲染等多个环节。 4. **进阶主题**:涉及更高级的...

    Apress.Beginning.Groovy.and.Grails.From.Novice.to.Professional.Jun.2008

    Grails的插件系统允许开发者扩展功能,如安全、国际化、缓存等,而无需从零开始。此外,Grails的测试支持也非常完善,包括单元测试、集成测试和功能测试,确保了软件质量。 通过阅读《Apress.Beginning.Groovy.and....

    Apress.Beginning.Groovy.and.Grails.From.Novice.to.Professional.2008.rar

    这本书的核心目标是帮助读者从零基础开始,逐步掌握这两门语言的精髓,从而在实际开发中游刃有余。 Groovy是一种基于Java平台的、动态类型的编程语言。它简化了Java的语法,提高了开发效率,同时又能够无缝地与Java...

    Groovy入门]第一讲.项目演示与搭建Groovy开发环境

    这些资源将详细解释如何从零开始构建一个Groovy项目,以及如何解决在搭建环境中可能遇到的问题。 总之,Groovy作为一门强大且易学的编程语言,为Java开发者提供了新的工具和可能性。通过项目演示和环境搭建,你可以...

    richui-two:适用于 Grails 2.3.4 的 RichUI Grails 插件版本 > *

    通过这个插件,开发者无需从零开始编写前端代码,而是可以直接利用预封装的 UI 组件,如按钮、表单、数据网格、对话框等,快速构建功能丰富的页面。 在 "richui-two" 版本中,特别强调了对 Grails 2.3.4 的兼容性。...

    应用框架在JSP开发中的应用

    应用框架是一组预先定义好的规则、设计模式和类库,开发者可以基于这些规则来构建应用程序,而无需从零开始编写所有代码。它们通常包含用于处理请求、管理会话、数据持久化、安全性、国际化等功能的组件。在JSP开发...

    grails-spring-security-ui

    通过此插件,开发者可以快速构建出符合标准的安全管理界面,而无需从零开始编写大量的前端代码。 1. **安装与配置** 在Grails项目中,我们可以通过在`build.gradle`文件中添加依赖来安装`grails-spring-security-...

    web开发框架XiaomiRose.zip

    一个从零开始的创业公司,在大家技术背景不一的情况下,rose很简单快速地传达到了大家中间。本手册致力于让php开发人员也能快速使用上java开发高性能服务。如果在阅读过程中有任何疑问,欢迎来信咨询:czhttp@gmail....

    Spring Recipes, 3rd Edition 2014.10最新版本

    读者可以将书中的代码和配置文件直接应用到自己的项目中,稍作修改后使用,这样可以节省大量的从零开始构建项目的精力。 《Spring Recipes, 第三版 2014.10最新版本》适合那些希望深入学习并掌握Spring框架的企业...

Global site tag (gtag.js) - Google Analytics