翻 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)