配置PlayFramework的静态资源使用CDN路径

  在互联网应用中,我们通常都需要将动态请求与静态请求分离,或使用独立域名,或使用子域名,或使用CDN分发。同时为了减少生产部署与开发环境切换时更改大量文件,一般都通过修改一个配置文件来实现。

  但偏偏现在大部分框架都没有提供这样一个模块实现,那只好自己简单处理一下。同样在PlayFramework中一样没有这样的设置。google group( http://groups.google.com/group/play-framework/browse_thread/thread/1d681f866477ac6b )中有关于这个问题的描述, 刚开始我也一样,想修改routes中的staticDir:public 配置, 但不成功于是找到这个帖子。作者非常明确地告诉我@{..}语法只工作在相同域名下。跟着,我想将我的子域名配置在application.conf中,通过读取它添加到资源路径上。我认为,我只需要在模板(Template engine)中找办法成功读取到application.conf就算成功了。

  结果,我找到了它:#{script ‘jquery.js’ /} (http://www.playframework.org/documentation/1.0.3/templates),它的作用是生成<script type=”text/javascript” language=”javascript”  src=”/public/javascripts/jquery.js”></script>这个js的引用,查找源代码(play/framework/templates/tags/script.tag)可以知道,你的js文件是必须放到/public/javascripts下的,到这里我已经对Tags这个功能眼前一亮了,我知道我找的就是它。只要我创建一个Tags,我就可以在静态资源前加上子域名了。

(其实 #{script ‘jquery.js’} 跟main.html这个默认布局里的<script src=”@{‘/public/javascripts/jquery-1.4.2.min.js’}” type=”text/javascript” charset=”utf-8”></script>产生的效果是一样的)

试着做了一个实现,在项目路径/app/views/创建tags目录,复制script.tag源代码改名建立一个script_cdn.tag,16行加入 _domain = play.configuration.getProperty("script_cdn", "");
在最后一行/public/前加入 #{if _domain}${_domain}#{/if}
保存,并在application.conf中加入(请将=号后面改成你本机的地址)script_cdn=http://aquarius.local:9000
现在已经完成了,你可以在页面调用它看看 #{script_cdn 'jquery.js' /}

  样式表也可以如法炮制,看看stylesheet.tag去吧。

完整的script_cdn.tag

*{
* insert a script tag in the template.
* by convention, referred script must be put under /public/javascripts
* src (required) : script filename, without the leading path "/public/javascripts"
* id (opt.) : sets script id attribute
* charset (opt.) : sets source encoding - defaults to UTF-8
* #{script id:'datepicker' , src:'ui/ui.datepicker.js', charset:'utf-8' /}
}*
%{
( _arg ) && ( _src = _arg);
if(! _src) {
throw new play.exceptions.TagInternalException("src attribute cannot be empty for script tag");
}
_domain = play.configuration.getProperty("script_cdn", "");
}%
<script type="text/javascript" language="javascript"#{if _id} id="${_id}"#{/if}#{if _charset} charset="${_charset}"#{/if} src="#{if _domain}${_domain}#{/if}/public/javascripts/${_src}"></script>

原文地址:https://www.cnblogs.com/ibook360/p/2311811.html