Grails1.3.x至1.4.0(2.0)升级实践

 

这几天把一个Grails做的Web应用从1.3.7升级到1.4.0(目前还是M1),有很多兼容性问题,应用几乎都跑不起来,怪不得官方已经准备把1.4.0改成2.0发布。但幸运的是应用比较简单,问题并不多,也不很严重,可以通过修改少量代码来移植,下面讲述我遇到的问题以及解决过程,希望对准备升级的程序员有一些参考价值。主要有以下几项:

 

 

1. 自定义的js文件无法导入使用,且在IDE中修改js文件Web服务器不会自动加载(reload)

自定义的js原来用<g:javascript library="xxxxx"/>方式导入的,现在已经无效了,改为以下方式导入:

<g:javascript src="xxxxxx.js"/>

 或者使用Resources插件对js资源进行管理:

<r:external dir="js" file="xxxxx.js"/>
 

刷新页面,可以看到生成了<appname>/static/js/xxxxx.js,而不是原来的<appname> /js/xxxxx.js,而对<appname>?js/xxxxx.js的访问会自动重定向到static的资源上,这是Resource插件在起作用,此时的js文件(当然也包括其他资源,如CSS, images)作为了静态资源,任何对js文件的改动都不会对运行时的Web服务器生效。为了便于开发调试,需要在 Config.grovvy中加入设置

grails.resources.debug = true

 重启服务器后再修改js的内容时,服务器会自动reload资源。此时观察生成的代码,变成了

<appname>/js/xxxxx.js?_debugResources=y&n=1310271245143
 

 

 

2. formRemote标签(所有Ajax风格的标签)渲染报错

 

我使用了formRemote之类的标签无刷新提交表单,该标签会生成Ajax风格的HTML form,1.3.7之前的版本默认使用prototype作为Ajax工具,而1.4.0使用jQuery。升级后渲染页面会产生如下错误信息:

 

No javascript provider is configured at ......
 

这是因为默认的javascript框架从prototype改为jQuery,导致一些标签和JS功能无法正常使用。

首先需要安装jQuery插件和Resources插件(安装方法不赘述),然后在GSP页面中加入如下代码,显式设置JS框架为jQuery,

 

 

<g:setProvider library="jquery"/>

 

在layout/main.gsp中按照下面方式加入<r:layoutResource/>标签:

 

<head>
  <g:layoutHead />
  <r:layoutResources/>
</head>

 

此时刷新页面,查看网页代码可以发现已经生成了基于jQuery的代码。

 


3. 默认的开发数据库从HSQL改为H2。

因为之前我就把测试数据库改为了H2,因此在这个上面没有出现任何兼容性问题。不过H2确实是值得推荐的内存数据库,体积很小,但是功能齐全,开箱即用,与HSQL完全相同的工作模式和使用方法,配置方式都是一样的,但是比HSQL更加稳定(至少我是这么认为的,HSQL我无法开箱即用,我只是要做测试而已),功能更多。更为有趣的是,它自带了一个Web版本管理查询界面,用起来也很顺手。

 

 

4. createLinkTo(url="/")标签使用出错。

createLinkTo标签在1.4中被废弃,文档建议改用resource,而实际情况应该使用createLink标签,将代码改为createLink(uri:'/')即可。

 

 

5. 在Controller内定义的方法 def foo() 调用报错

错误信息为:

groovy.lang.MissingMethodException: No signature of method: xxx.yyy.foo() is applicable for argument types: (java.lang.String) values: [XXXXXX]
 

把方法定义def foo()改为 protected foo() 形式的定义即可。这个有点奇怪,是因为闭包的问题?还是def定义的可访问性原因?反正我没搞清楚,不想太深究。

 

 

你可能感兴趣的:(JavaScript,jquery,框架,Web,grails)