播放框架模块:分而治之

通常情况是您开始开发应用程序并继续满足要求。 当您的应用程序变得更大时,您开始意识到将其分为不同组件的便利。 而且,当您开发第二个或第三个应用程序时,您开始认识到可以在不同应用程序之间重用的某些功能。

这是模块化应用程序的两个很好的理由。 理想情况下,我们应该针对具有高内聚力和低耦合的组件。

Java语言已经证明自己很适合完成此类任务。 它提供了通过接口,抽象类等强制使用定义良好的API的通用方法。
Play框架开发人员认为,这对于开发通用库是完全合适的,但是在Web应用程序的情况下,可通过其他方式最好地实现可重用性和模块化。 看一下摘自play框架的FAQ的摘录:

Java本身是一种非常通用的编程语言,最初并不是为Web应用程序开发而设计的。 编写通用且可重用的Java库并创建Web应用程序是完全不同的事情。 Web应用程序本身不必设计为可重用。 您需要更少的抽象,更少的配置。 Web应用程序确实存在可重用性,但是可通过Web服务API而不是语言级集成来实现。

因此,在可重用性方面,play为我们提供了更适合Web应用程序的解决方案。

播放模块

模块只是另一个Play框架应用程序。 唯一的区别是,模块并非要自己运行,而必须包含在包含应用程序中。
但是,模块和常规应用程序之间存在一些区别,主要是模块没有conf文件(必须由主应用程序提供),并且模块中的所有内容都是可选的。
这样做总比说好,所以像往常一样,我们将寻找一个很好的机会来制作一个简单的模块来演示其工作原理。

创建一个新的播放框架应用程序并将其部署到云中

众所周知,我们正在研究play framework site的西班牙语翻译 。 我们想向其中添加网络分析,以便我们可以看到人们如何使用它。
因此,为了遵循此示例,我们需要在Internet上某个位置部署一个play framework应用。 如今,有许多免费的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 analyticsappAttempting to create remote application space: analyticsappNow 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/analyticsapprm -fr pom.xml src

然后,我们会将新创建的应用程序编译并打包为爆炸战争。 转到〜/ devel / apps / module-test文件夹并运行:

cd ~/devel/apps/module-testplay 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 debuggingListening for transport dt_socket at address: 5397800:22:38,021 INFO  ~ Starting /home/sas/Dropbox/Public/devel/play/apps/module-test/analytics-app00: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/analyticsapptouch deployments/ROOT.war.dodeploygit add -Agit commit -m "deploy play framework app"git push origin

注意:由于播放框架库的原因,第一次需要几分钟来推送应用程序。 以后的推送会更快,git足够聪明,只发送更新的文件。
就是这样,您刚刚将第一个应用程序部署到了红帽的云中。 您可以在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中打开文件,然后将跟踪代码粘贴到关闭的head标签之前,如下所示:

[...]<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-testplay war analytics-app/ -o openshift/analyticsapp/deployments/ROOT.warcd openshift/analyticsapp/git add -Agit 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 dependenciesrequire:- play- analytics -> analyticsrepositories:- My local modules:type:       localartifact:   ${application.path}/../[module]contains:- analytics

然后运行以下命令,告诉play解决依赖关系。

cd ~/devel/apps/module-test/analytics-appplay 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-appplay 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-appplay dependencies --forceCopy

就是这样,现在您可以按常规方式部署到openshift:

cd ~/devel/apps/module-testplay war analytics-app/ -o openshift/analyticsapp/deployments/ROOT.warcd openshift/analyticsapp/git add -Agit commit -m "added analytics module"git push origin

使用“ play run”在本地运行您的网站,还可以从http://analyticsapp-opensas.rhcloud.com/打开它,检查两个网站的源代码,您应该看到在openshift上运行的应用包含跟踪代码,与您的本地申请相反。

结论

在这篇文章中,我们看到了如何将play框架应用程序部署到openshift,更重要的是,如何将功能从应用程序转移到模块,以便从其他应用程序重用它。
您可以在本文上了解有关模块的更多信息,或阅读play框架文档 。
如果您说西班牙语,则可以帮助我们进行翻译 ,也可以在这里查看我们的工作…您可以确保您获得的每次点击都将得到跟踪!

参考: Play框架模块:在“ 玩转Play框架”中,与我们的JCG合作伙伴 Sebastian Scarano进行了分而治之 ! 博客

相关文章 :

  • 玩! 框架:为什么我会爱上它
  • 简单的Twitter:Heroku上的Play框架,AJAX,CRUD
  • RabbitMQ播放模块! 构架
  • Google App Engine上的Spring MVC和REST
  • Spring MVC开发–快速教程
  • Spring MVC3 Hibernate CRUD示例应用程序

翻译自: https://www.javacodegeeks.com/2012/01/play-framework-modules-divide-and.html

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/374493.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

Alpha阶段项目总结

1.我们的软件要解决什么问题&#xff1f;是否定义得很清楚&#xff1f;是否对典型用户和典型场景有清晰的描述&#xff1f; 我们的软件是一款针对健康饮食而做的一款饮食健康软件&#xff0c;对生活中我们经常迟到的很多事物组合都进行了详细的注解&#xff0c;用户可以清楚地看…

实用的it知识学习_怎样能更快更好的学习好书法?分享一些比较实用的理论知识...

如何能更快更高效的学习书法&#xff1f;首先了解一些书法理论知识是很有必要的&#xff01;它能让你在学习书法的过程中不至于迷茫 &#xff01;能助你更快学好书法&#xff01;一、书论在实践中产生我们大部分人都觉得学习书法可以没有理论&#xff0c;但不可无技法。但理论和…

九度oj-1001-Java

题目描述&#xff1a; This time, you are supposed to find AB where A and B are two matrices, and then count the number of zero rows and columns. 输入&#xff1a; The input consists of several test cases, each starts with a pair of positive integers M and N …

字节流与字符流的区别

最近在项目中遇到一个encoding的问题&#xff0c;记录一下。 具体而言就是&#xff0c;项目中有A/B两个部分&#xff0c;A部分由我们负责&#xff0c;Java实现&#xff1b;B部分是UK负责的&#xff0c;使用Delphi&#xff0c;A、B在交互时发送一个http请求&#xff0c; 请求汇总…

通过MOXy实现使JAXB更加清洁

编组和解组XML时使用JAXB的主要优点是编程模型。 只需注释几个POJO并使用JAXB API&#xff0c;您就可以很容易地序列化为XML和从XML反序列化。 您无需担心有关XML如何编组/解组的细节。 一切都比DOM和SAX等替代方案简单得多。 现在&#xff0c;XML文件中的数据本质上趋于分层。…

android 上下滚动文字_计算机毕设项目004之Android系统在线小说阅读器

计算机毕设项目004之Android系统在线小说阅读器一. 项目名称基于Android系统的在线小说阅读器二. 项目简介项目中的角色功能&#xff1a;支持翻页动画:仿真翻页、覆盖翻页、上下滚动翻页等翻页效果。支持页面定制:亮度调节、背景调节、字体大小调节支持全屏模式(含有虚拟按键的…

697. 数组的度

给定一个非空且只包含非负数的整数数组 nums&#xff0c;数组的 度 的定义是指数组里任一元素出现频数的最大值。 你的任务是在 nums 中找到与 nums 拥有相同大小的度的最短连续子数组&#xff0c;返回其长度。 来源&#xff1a;力扣&#xff08;LeetCode&#xff09; 链接&a…

python math模块

1.math简介 >>> import math >>>dir(math) #这句可查看所有函数名列表 [__doc__, __name__, __package__, acos, acosh, asin, asinh, atan, atan2, atanh, ceil, copysign, cos, cosh, degrees, e, erf, erfc, exp, expm1, fabs, factorial, flo…

Visual Studio找不到adb.exe错误解决

Visual Studio找不到adb.exe错误解决 错误信息&#xff1a;Cannot find adb.exe in specified SDK path。出现这种情况&#xff0c;是因为没有安装Android SDK Platform-tools。解决办法&#xff1a;在SDK Manager中&#xff0c;安装该组件即可。 转载于:https://www.cnblogs.c…

Vaadin应用程序中的EJB查找

自从我实现上一个服务定位器以来已经有很长时间了。 我认为不再需要考虑Java EE CDI &#xff08;上下文和依赖注入&#xff09;的成熟度。 我的第一个实现是在基于Struts的Web应用程序中使用EJB。 之后&#xff0c;我开始使用JSF&#xff0c;它只需要带有EJB或Resource的带注释…

基线检查工具_最新版CAD燕秀工具箱2.87(支持20042021)

好课推荐&#xff1a;零基础CAD&#xff1a;点我CAD家装&#xff1a;点我 周站长CAD&#xff1a;点我CAD机械&#xff1a;点我revit教程&#xff1a;点我CAD建筑&#xff1a;点我CAD三维&#xff1a;点我全屋定制&#xff1a;点我 ps教程&#xff1a;点我苹果版CAD:点我 3dmax教…

团队项目记录2

遇到的问题&#xff1a;在对Trigger机关进行测试时发现&#xff0c;画出的轨道也会将机关触发。 问题描述&#xff1a;Trigger机关的作用是在发生碰撞时运行脚本中指定的特定物体的特定函数&#xff0c;在这个例子当中特定的物体是一块地板&#xff0c;特定的函数的功能是删除这…

关于java.lang.ArithmeticException

java.lang.ArithmeticException “数学运算异常”&#xff0c;可能是自己的数学运算公式出现了错误、违反了数学运算规则。错误记录&#xff1a; 出错原因&#xff1a; a % b 中b不能为0

1103. Integer Factorization (30)

题目如下&#xff1a; The K-P factorization of a positive integer N is to write N as the sum of the P-th power of K positive integers. You are supposed to write a program to find the K-P factorization of N for any positive integers N, K and P. Input Specifi…

Java EE 6与Spring Framework:技术决策过程

在过去的几个月中&#xff0c;我们经历了这个决策过程&#xff1a;为Java平台上的企业开发选择哪种技术堆栈&#xff1f; 有多种选择。 但是&#xff0c;我们深入讨论的是&#xff1a;纯Java EE 6堆栈与带有Java EE的Spring。 以下博客文章总结了当您考虑这些技术堆栈选项之一时…

DOM 基础 HTML标签 元素 属性

什么是HTML标签 HTML标签标记了HTML文档和HTML元素 HTML标签由开始标签和结束标签组成.开始标签为尖括号包围的元素名,结束标签为尖括号包围的斜杠和元素名 例如:<h2> My First Heading</h2> HTML基本标签 标题(Heading)是通过h1 - h6等标签进行定义的.段落 是通过…

允许服务与桌面交互_vivo 正式推出 Origin OS,融合自然设计与全新交互

点击右上角关注我们&#xff0c;每天给您带来最新最潮的科技资讯&#xff0c;让您足不出户也知道科技圈大事&#xff01;今天下午&#xff0c;vivo 推出了全新 Origin OS 手机系统。它采用了源于自然界的设计理念&#xff0c;同时加入了全新并且允许用户进行深度自定义的交互方…

Error - Found cycle in the ListNode

Error - Found cycle in the ListNode 刷力扣时遇到这个错误&#xff0c;节点成环 自己摸索了一下发现确实形成循环&#xff0c;原题是206反转链表&#xff0c;我用的是栈&#xff0c;先将链表节点依次进栈&#xff0c;然后依次出栈链接&#xff0c;构成反转。但是我忽略了第一…

JUnit 4.9(测试版3)中的规则

不久前&#xff0c; David Saff宣布了JUnit 4.9的beta版 。 因此&#xff0c;我认为现在是研究该版本中的新增功能的好时机。 JUnit领域中最有用的创新之一是Rule。 我在这里写了有关规则的文章 。 我在这里写了有关JUnit规则的用例 。 规则很棒。 借助JUnit 4.9&#xff0c;它…

计算机网络-终端

我们常用的电脑来说&#xff0c;外围设备就是终端。 外围设备包括显示器、鼠标、键盘等等。 负责向主机输入数据的就叫输入终端&#xff0c;比如鼠标、键盘、麦克风、摄像头&#xff1b; 负责接收主机输出数据的设备就被称作输出终端&#xff0c;比如显示器、耳机。 注意一点…