SpringMVC视图名称对大小写敏感吗?
最近开发过程中,碰到一个颇为头疼的问题:同样一套代码,在我本地机器上运行完全没有问题,在测试的机器上会返回500错误信息,在查看日志后,发现SpringMVC抛出了找不到视图的异常。
我重复在自己的机器上debug运行,发现controller的确返回了对应的视图,页面也成功跳转,怎样也重现不了那个500错误。经过检查,我发现controller里返回的视图是这样的:
return "frag/efrag";
而在我的frag目录下,文件名称是“eFrag.ftl”。
看来500错误的原因找到了,文件名不同,SpringMVC找不到名为“efrag”的视图。果然,我把测试机器上部署的工程里eFrag.ftl改名为efrag.ftl,500错误不再出现了。
但是问题还没有彻底解决,刚才已经说了,该500错误只在测试服务器上出现,在我本地开发机器上一切正常,完全无法复现该错误。经过检查,测试机器上的代码和我本机的代码属同一SVN版本,不存在代码差异的问题。
那问题到底出在哪呢?代码版本一样,运行结果却不同,那就只能是两台机器环境有差异了。但我们的tomcat、jdk以及spring包都是一样的版本……仔细思考后,发现两台机器环境的确不一样,它们之间唯一的不同就是——操作系统!我本机开发环境是windowsXP,而测试服务器环境是红帽linux。
查询一些资料后,我得知,SpringMVC的controller也是在servlet之上实现,servlet返回一个视图,是根据相对路径来查找对应的文件名,ftl文件当然是放在tomcat的路径下,那么,对于对文件名大小写不敏感的操作系统,efrag.ftl和eFrag.ftl是相同的文件。
看来原因彻底找到了,linux对文件名大小写敏感,windowsXP对文件名大小写不敏感。为了验证windows这一无聊的特性,我在windows下先建立了一个名为nnn.txt的文件,然后又在同一目录建立了一个新的txt并将其重命名为NNN.txt,发现windows弹出了这样的警告窗口:
确实,windowsXP把NNN.txt和nnn.txt视为同一文件,这表示,windowsXP对文件名大小写是不敏感的。
以前前辈们就告诉过我们,在windows上开发需要注意其与linux的差异,在做项目的过程中,这种问题还真没少出现过,比如MD5加密所用的库文件等问题。很多人认为java是跨平台的语言,是真正的“一次编写,到处运行”,但在javaEE的开发中,部署环境等问题一直是值得注意的,windows和linux的差异一定不能忽略
结论:linux是对文件名大小写敏感的,使用SpringMVC时,一定要保证controller返回的视图名称与实际文件名完全相同,大小写字母也不能忽略。
上一篇: JS实现简单拖拽效果
下一篇: 详解Angular 自定义结构指令