分而治之
这是模块化应用程序的两个很好的理由。 理想情况下,我们应该针对具有高内聚力和低耦合的组件。
Java语言已经证明自己很适合完成此类任务。 它提供了通过接口,抽象类等强制使用定义良好的API的通用方法。
Play框架开发人员认为,这对于开发通用库是完全合适的,但是在Web应用程序的情况下,可以通过其他方式最好地实现可重用性和模块化。 看一下摘自play框架的FAQ的摘录:
Java本身是一种非常通用的编程语言,最初并不是为Web应用程序开发而设计的。 编写通用且可重用的Java库并创建Web应用程序是非常不同的事情。 Web应用程序本身不必设计为可重用。 您需要更少的抽象,更少的配置。 Web应用程序确实存在可重用性,但是可通过Web服务API而不是语言级集成来实现。
因此,在可重用性方面,play为我们提供了更适合Web应用程序的解决方案。
播放模块
模块只是另一个Play框架应用程序。 唯一的区别是,模块并非要自己运行,而必须包含在包含应用程序中。
但是,模块和常规应用程序之间存在一些差异,主要是模块没有conf文件(必须由主应用程序提供),并且模块中的所有内容都是可选的。
这样做总比说好,所以像往常一样,我们将寻找一个很好的机会来制作一个简单的模块来演示其工作原理。
创建一个新的播放框架应用程序并将其部署到云中
众所周知,我们正在研究play framework site的西班牙语翻译 。 我们想向其中添加网络分析,以便我们可以看到人们如何使用它。
因此,为了遵循此示例,我们需要在Internet上某个位置部署一个play框架应用。 如今,有许多免费的Java托管选项可用。 在这里,您有一些教程可以在openshift , google application engine和heroku上进行部署。
首先让我们创建一个play框架应用程序,然后在〜/ devel / apps / module-test中创建该应用程序,您可以选择任意位置,只需确保适当地更新命令即可。 要创建应用,请在os提示符下运行以下命令:
sas@ubuntu:~/devel/apps/module-test$ play new analytics-app
~ _ _
~ _ __ | | __ _ _ _| |
~ | '_ \| |/ _' | || |_|
~ | __/|_|\____|\__ (_)
~ |_| |__/
~
~ play! 1.2.4, http://www.playframework.org
~
~ The new application will be created in /home/sas/Dropbox/Public/devel/play/apps/module-test/analytics-app
~ What is the application name? [analytics-app]
~
~ OK, the application is created.
~ Start it with : play run analytics-app
~ Have fun!
现在是将它部署到某个地方的好时机。 对于本教程,我们将在openshift上进行部署,您可以使用所需的任何主机(有关为openshift部署设置环境的更多信息,请遵循本教程 )
在〜/ devel / apps / module-test / openshift中创建一个新目录,转到该目录并运行:
rhc-create-app -l mymail@mail.com -p mypassword -t jbossas-7.0 -a analyticsapp
Attempting to create remote application space: analyticsapp
Now your new domain name is being propagated worldwide (this might take a minute)...
Pulling new repo down
[...]
Successfully created application: analyticsapp
接下来,我们将摆脱演示应用程序:
cd ~/devel/apps/module-test/openshift/analyticsapp
rm -fr pom.xml src
然后,我们会将新创建的应用程序编译并打包为爆炸战争。 转到〜/ devel / apps / module-test文件夹并运行:
cd ~/devel/apps/module-test
play war analytics-app -o openshift/analyticsapp/deployments/ROOT.war
~ _ _
~ _ __ | | __ _ _ _| |
~ | '_ \| |/ _' | || |_|
~ | __/|_|\____|\__ (_)
~ |_| |__/
~
~ play! 1.2.4, http://www.playframework.org
~
JPDA port 8000 is already used. Will try to use any free port for debugging
Listening for transport dt_socket at address: 53978
00:22:38,021 INFO ~ Starting /home/sas/Dropbox/Public/devel/play/apps/module-test/analytics-app
00:22:39,891 INFO ~ Precompiling ...
00:22:49,075 INFO ~ Done.
~ Packaging current version of the framework and the application to /home/sas/Dropbox/Public/devel/play/apps/module-test/openshift/analyticsapp/deployments/ROOT.war ...
~ Done !
~
~ You can now load /home/sas/Dropbox/Public/devel/play/apps/module-test/openshift/analyticsapp/deployments/ROOT.war as a standard WAR into your servlet container
~ You can't use play standard commands to run/stop/debug the WAR application...
~ ... just use your servlet container commands instead
~
~ Have fun!
~
现在我们只需要提交应用程序并将其推送到openshift上的git repo中:
cd ~/devel/apps/module-test/openshift/analyticsapp
touch deployments/ROOT.war.dodeploy
git add -A
git commit -m "deploy play framework app"
git push origin
注意:由于播放框架库的原因,第一次需要几分钟来推送应用程序。 以后的推送会更快,git足够聪明,只能发送更新的文件。
就是这样,您刚刚将第一个应用程序部署到了Red Hat的云中。 您可以在http://analyticsapp-opensas.rhcloud.com/上看到它运行(当然,您必须用自己的openshift用户名替换“ opensas”)。
Google Web分析和播放框架
将Google Web分析添加到Play应用程序非常简单。 您只需要一个gmail帐户,然后转到Google Analytics(分析)网站 ,单击“注册”,使用您的gmail帐户登录,并完成所有必需的数据。
在帐户名称中输入“ analytics-app”,在网站的URL中输入http://analyticsapp-opensas.rhcloud.com,同意条款和条件,然后单击“创建帐户”。
您将被带到您的analytics-app帐户页面,在那里您可以看到跟踪代码。 您只需要将其粘贴到您的应用中即可。 因此,请在〜/ devel / apps / module-test / analytics-app / app / views / main.html中打开文件,然后将跟踪代码粘贴到结束标签的前面,如下所示:
[...]
<script src="@{'/public/javascripts/jquery-1.6.4.min.js'}" type="text/javascript" charset="${_response_encoding}"></script>
#{get 'moreScripts' /}
<script type="text/javascript">
var _gaq = _gaq || [];
_gaq.push(['_setAccount', 'UA-XXXXXXXX-1']);
_gaq.push(['_trackPageview']);
(function() {
var ga = document.createElement('script'); ga.type = 'text/javascript'; ga.async = true;
ga.src = ('https:' == document.location.protocol ? 'https://ssl' : 'http://www') + '.google-analytics.com/ga.js';
var s = document.getElementsByTagName('script')[0]; s.parentNode.insertBefore(ga, s);
})();
</script>
</head>
<body>
[...]
注意:Google将为您提供您自己的UA-XXXXXXXX-1帐户代码,因此只需从Google Analytics(分析)帐户页面(而不是此页面)复制并粘贴代码!
现在,您只需要生成war文件夹,提交并再次将其推送到openshift即可部署您的更改。 每次进行更改时,都必须遵循以下相同步骤将其部署到openshift。
cd ~/devel/apps/module-test
play war analytics-app/ -o openshift/analyticsapp/deployments/ROOT.war
cd openshift/analyticsapp/
git add -A
git commit -m "added tracking code"
git push origin
在http://analyticsapp-opensas.rhcloud.com/上再次访问您的页面,并查看页面源代码以检查是否已添加跟踪代码。 您还可以在Google的分析页面上看到它的运行情况,单击“主页”,实时(BETA)和“概述”。 您应该只有一位访客(是的,是您!)。
到目前为止,我们已经创建了一个新的play应用程序并将其部署到openshift。 然后,我们创建了一个Google分析帐户,并将跟踪代码添加到我们的游戏应用程序中。 一切正常,Google正在跟踪我们的应用。 现在,我们将将该功能移至模块,以便我们可以从其他应用程序中重复使用它。
创建一个模块
要创建一个新模块,您必须使用“ new-module”播放命令,如下所示:
cd /home/sas/devel/apps/module-test/
play new-module analytics
现在,为了告诉我们的主要应用程序(在我们的分析应用程序中)包括此模块,我们必须配置一个本地存储库 。
像这样编辑〜/ devel / apps / module-test / analytics-app / conf / dependencies.yml:
# Application dependencies
require:
- play
- analytics -> analytics
repositories:
- My local modules:
type: local
artifact: ${application.path}/../[module]
contains:
- analytics
然后运行以下命令,告诉play解决依赖关系。
cd ~/devel/apps/module-test/analytics-app
play dependencies
~ _ _
~ _ __ | | __ _ _ _| |
~ | '_ \| |/ _' | || |_|
~ | __/|_|\____|\__ (_)
~ |_| |__/
~
~ play! 1.2.4, http://www.playframework.org
~
~ Resolving dependencies using /home/sas/devel/apps/module-test/analytics-app/conf/dependencies.yml,
~
~ analytics->analytics -> (from My local modules)
~
~ Installing resolved dependencies,
~
~ modules/analytics -> /home/sas/devel/apps/module-test/analytics/../analytics
~
~ Done!
~
现在,您可以在工作站上启动主应用程序:
cd ~/devel/apps/module-test/analytics-app
play run
您可以在http:// localhost:9000看到您的应用程序正在运行。
将跟踪代码移至可重复使用的标签
现在,我们将跟踪代码移动到模块中定义的标记中,因此我们将使用跟踪代码创建文件〜/ devel / apps / module-test / analytics / app / views / analytics.html,如下所示:
<script type="text/javascript">
var _gaq = _gaq || [];
_gaq.push(['_setAccount', 'UA-XXXXXXXX-1']);
_gaq.push(['_trackPageview']);
(function() {
var ga = document.createElement('script'); ga.type = 'text/javascript'; ga.async = true;
ga.src = ('https:' == document.location.protocol ? 'https://ssl' : 'http://www') + '.google-analytics.com/ga.js';
var s = document.getElementsByTagName('script')[0]; s.parentNode.insertBefore(ga, s);
})();
</script>
现在,用对代码的调用替换main.html中的跟踪代码,如下所示:
[...]
<script src="@{'/public/javascripts/jquery-1.6.4.min.js'}" type="text/javascript" charset="${_response_encoding}"></script>
#{get 'moreScripts' /}
#{analytics /}
</head>
[...]
从application.conf文件获取模块配置
我们的模块几乎准备就绪,只有一件事阻止了我们真正在其他应用程序上重用它:Google Analytics(分析)代码硬编码在我们的代码中!
因此,我们将从application.conf文件中读取它。 只需像这样编辑analytics.html标记:
%{
String code = play.Play.configuration.getProperty("analytics.code", "")
}%
#{if code!=""}
<script type="text/javascript">
var _gaq = _gaq || [];
_gaq.push(['_setAccount', '${code}}']);
_gaq.push(['_trackPageview']);
(function() {
var ga = document.createElement('script'); ga.type = 'text/javascript'; ga.async = true;
ga.src = ('https:' == document.location.protocol ? 'https://ssl' : 'http://www') + '.google-analytics.com/ga.js';
var s = document.getElementsByTagName('script')[0]; s.parentNode.insertBefore(ga, s);
})();
</script>
#{/if}
并将以下内容添加到您的主应用程序配置文件中,该文件位于〜/ devel / apps / module-test / analytics-app / conf / application.conf
analytics.code=UA-XXXXXXXX-1
防止在开发模式下跟踪
每次渲染页面时,即使我们在开发工作站上工作,此标记也将更新跟踪器!
因此,我们将进行一些小的改进,以防止模块在开发模式下工作时记录页面活动。
只需将以下条件添加到代码中:
%{
String code = play.Play.configuration.getProperty("analytics.code", "")
}%
#{if play.mode.isProd() && code!=""}
<script type="text/javascript">
var _gaq = _gaq || [];
[...]
Openshift故障排除
Openshift无法解析相对于模块位置的相对引用(实际上,任何部署的战争应用程序都会遇到相同的问题),因此您必须告知play将模块源复制到包含应用程序之前,战争文件夹。 只是发出:
cd ~/devel/apps/module-test/analytics-app
play dependencies --forceCopy
就是这样,现在您可以按常规方式部署到openshift:
cd ~/devel/apps/module-test
play war analytics-app/ -o openshift/analyticsapp/deployments/ROOT.war
cd openshift/analyticsapp/
git add -A
git commit -m "added analytics module"
git push origin
使用“ play run”在本地运行您的网站,还可以从http://analyticsapp-opensas.rhcloud.com/打开它,检查两个网站的源代码,您应该看到在openshift上运行的应用包含跟踪代码,与您的本地申请相反。
结论
在这篇文章中,我们看到了如何将play框架应用程序部署到openshift,更重要的是,如何将功能从应用程序转移到模块,以便从其他应用程序重用它。
您可以在本文中了解有关模块的更多信息,或阅读play框架文档 。
如果您说西班牙语,则可以帮助我们进行翻译 ,也可以在这里查看我们的工作…您可以确保您获得的每次点击都将得到跟踪!
参考: Play框架模块:在“ 玩转Play框架”中 ,我们的JCG合作伙伴 Sebastian Scarano进行了分而治之 ! 博客
相关文章 :
翻译自: https://www.javacodegeeks.com/2012/01/play-framework-modules-divide-and.html
分而治之