Grails 1.1 的动态编码方案(Dynamic Encoding Methods)

翻 by: Nainse 2009年6月3日9:16:48

概述
从版本0.4开始,Grails加入了对动态编/解码的支持,Grails自身拥有一些内置的编码器,也支持开发人员贡献出来的在运行时被组织好的
简单机械的编码方法。

编码器 类
一个Grails的编码器类,可以只包含一个encode或decode方法,或者两个都包含。Grails框架在启动的时候会动态的在
/grails-app/utils/目录下搜寻并加载编码器。

Grails会在grails-app/utils/下查找以Codec为类名后缀的类作为编码器(这些都是遵循了Grails规约的命名方案)。例如,Grails框架自带的HTMLCodec.groovy类。(在Grails这艘豪华游轮上,还有一个utils舱,这里的成员都有固定的服装(类有固定的后缀名),能让我们一看就知道他们各个都是干啥工作地(类的功能))

如果某编码器包含一个名叫encode的闭包(def encode = {//some codes}),则Grails会在String类中动态的声明一个用来描述改编码器的encode闭包的方法,这个闭包会以该编码器的名字(去掉Codec后缀的编码器的名字),如HTMLCodec定义了一个encode闭包,Grails在String类中贴上一个encodeAsHTML的标签来描述该HTMLCodec中的encode闭包。

在HTMLCodec和URLCodec编码器中同时也定义了decode闭包,所以在String类中,Grails也会贴上decodeHTML和decodeURL的标签。这些动态编码器的方法可以在Grails应用的任何地方被调用。例如:一个report对象包含了一个description属性,这个description属性的值可能包含了一些HTML文档定义过的特殊字符,如果我们想在页面上展现这些字符,就需要一些编码转换。在GSP中我们可以:

${report.description.encodeAsHTML()}

解码的时候我们可以:

value.decodeHTML()。

 

Grails中标准的编码器

  HTMLCodec
  -------------------------------------------------------
  该编码器是用来对HTML文档中定义的标准标签和特殊字符的编码和解码用的。也是为了确保在不额外创建任何html标签,不破坏html页面布局的情况下,能安全、真实地呈现你所提供的值。例如:如果你有“Don't you know that 2 > 1 ?”,它将不能安全在html页面中被展示,因为“>”像是html标签的关闭符号的关系,尤其是你用包含有这个字符(>)字符串作为html标签的属性值的时候更为糟糕,例如在html的input标签中可以:

<input type="text" name="common.message" value="${common.message.encodeAsHTML()}"/>

 ----------注意--------------
HTMLCodec的encode方法不能重新编码 撇号(`)和单引号('),所以,为了不使 撇号或者单引号弄乱你的页面你不得不使用双引号(")
来替代。
----------------------

  URLCodec
  -------------------------------------------------------
  无论你是通过link或是action来创建一个url,你都需要对该url进行编码,这样能屏蔽掉其中对url来说无效的字符,从而使该url能准确的传达你的本意。假如你有这么一个值“Apple & Blackberry”要通过GET方法在url中传递出去,那么它很可能很难完成你交给的这个任务,因为“&”将会影响url中参数的分割,此时就需要url编码器来对它进行编码:

<a href="http://www.baidu.com/lastSearch=${lastSearch.encodeAsURL()}" >Last Search</a>

 

  BASE64Codec
  -------------------------------------------------------
  提供了基于BASE64加密的编码和解码方法,如:
  
  

Your registrations code is: ${user.registrationCode.encodeAsBASE64()}

   
  JAVASCRIPTCodec
  -------------------------------------------------------
  用例:
  
  

Elment.update('${elmentId}', '${render(template:"common/message").encodeAsJavaScript()}')

   
用户自制编码器
  每一个应用缔造者都享有定制自己的编码器的权利,这个自制编码器将和Grails框架自带的编码器一道被加载。前面说过怎么在定制一个自己的编码器,还记得吗?那好,我们从新来复习一遍这个很惬意的过程:

1.在grails-app/utils/目录下创建一个名字为XXXCodec.groovy(记得Codec的后缀名哦,它就像是轮船或火车上乘务人员的服装一样)
2.在该类中声明encode或decode的闭包或两者都声明

(你可以:

def encode = { str ->//...} 

 或

static encode = { str -> //...}

 )

以上两步完成之后,XXXCodec类的样貌可以是:

class XXXCodec {
  static encode = { str ->
    //convert the string to some sepcial encode and return the result
  }
}

 之后,我们就可以在整个应用的每一个角落里呼叫它来为我们服务了:

someObject.someAttribute.encodeAsXXX()

 下面是一个 密码编码器 的 完全例子:

import java.security.MessageDigest
import sun.misc.BASE64Encoder
import sun.misc.CharacterEncoder

class PasswordCodec {
  
  def encode = {
    str ->
    //用 SHA 加密密码
    MessageDigest md = MessageDigest.getInstance('SHA')
    md.update(str.getBytes('UTF-8'))
    //把SHA加密产生的字节数组交给BASE64在加密一把,并返回该字符串
    return(new BASE64Encoder()).encode(md.digest())
  }
}

 (想了解Java的简单的加密算法技术,可以到:http://www.groovycn.cn/thread-154-1-1.html

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值