概念验证:玩! 构架

我们正在开始一个新项目,我们必须选择Web框架。 我们的默认选择是grails,因为团队已经拥有使用它的经验,但是我决定给Play! 和Scala有机会。 玩! 有很多很酷的东西,在我的评估中,它得到了很多加分,但最终我们还是决定坚持下去。 不是grails完美并且可以满足所有要求,而是Play! 还不足以让我们切换。 无论如何,这是玩的地方列表! 我的评估不及格。 如果我出了点问题,请纠正我:
  • 模板引擎– UI开发人员对上一个项目中使用的模板引擎– freemarker感到愤怒,因为它不是null安全的–每当调用链中的null为空时,它就会崩溃。 播放模板使用Scala,因此它们不是null安全的。 Scala使用不同的方法来处理null – Option,但是第三方库和我们的核心代码将使用Java,因此我们必须引入一些null到Option的转换,这将变得很丑陋。 这个问题显示了处理该案件的方法,但是评论使我犹豫不决。 这只是故事的一部分–出于对静态键入的敬意和敬畏,UI层必须使用一种简单的脚本语言。 EL / JSTL是一个很好的例子。 如果找不到任何价值,它就不会爆炸。
  • 静态资产– 这很难 ,而且我找不到有关使用Play的任何信息! CDN或如何将多个资产合并到一个文件中。 有没有简单的方法可以做到这一点?
  • IDE支持–唯一的编辑模板是通过scala编辑器,但它没有html支持。 这不是一个大问题,但是围绕框架的工具是一件好事。
  • 社区– Play!周围有一个很好的社区,但与grails相比,我认为它很好。 玩! 是一个较旧的框架,它对stackoverflow有2.5k个问题,而grails有7.5k个问题。
  • 模块碎片化–我发现的一些重要模块仅适用于1.x,而不能在2.0中直接替换。
其他因素:
  • 我不会使用它-UI开发人员会。 尽管我对所有类型安全性和特殊的Scala概念可能都满意,但UI开发人员可能不会。
  • 斯卡拉(Scala)丑陋-现在为此而ash惜我。 是的,我不是一个斯卡拉的家伙,但这个是一个非常upvoted答案那种驱使我了。 它看起来像是一种低级的编程语言,并且与上一点有关–对于我们的UI开发人员来说,它显然不适合。
  • 更改编程模型–我提到Option vs null,但是还有很多其他事情。 当然,这不是scala的问题,它甚至使它成为引起所有炒作的凉爽和好事,但是这是一个问题,太多的人将不得不同时改变他们的观点
  • 我们已经大量使用了Spring和Spring-MVC,而Play与spring的集成不如Grails(在spring-mvc之上构建)那么流畅。
  • http://zeroturnaround.com/blog/play-framework-unfeatures-that-irk-my-inner-geek/
如您所见,许多问题并不普遍-它们与我们的经验和期望有关。 您可能不需要使用CDN,并且您的UI开发人员可能是scala-gurus而不是普通的开发人员。 正如我刚开始所说的,玩! 绝对看起来不错,并且有很多很酷的东西,我在这里省略了(列表很长)。
参考: 概念证明:玩! Bozho的技术博客博客中的JCG合作伙伴 Bozhidar Bozhanov的 框架 。

翻译自: https://www.javacodegeeks.com/2012/06/proof-of-concept-play-framework.html

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

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

相关文章

ldap统一用户认证php,针对LDAP服务器进行身份认证

Symfony提供了不同的方法来配合LDAP服务器使用。Security组件提供:ldap user provider,使用的是form_login_ldap authentication provider,用于针对一台使用了表单登录的LDAP服务器。同所有其他user provider一样,它可以同任何aut…

每天CookBook之JavaScript-039

IIFE的使用<!DOCTYPE html> <html lang"en"> <head><meta charset"UTF-8"><title>039</title> </head> <body></body> <script type"text/javascript"> (function () {var i 0;fu…

Day-6:创建计算字段

字段&#xff1a;基本上与列的意思相同&#xff0c;经常互换使用&#xff0c;计算字段是运行时在SELECT语句内创建的&#xff0c;不实际存在于数据库表中。 拼接字段&#xff1a;将值联结到一起构成单个值 SQL中的SELECT语句中可以使用或||操作符拼接&#xff0c;但mysql中必须…

使用Hibernate加载或保存图像-MySQL

本教程将引导您逐步了解如何使用Hibernate从数据库&#xff08; MySQL &#xff09;保存和加载图像。 要求 对于此示例项目&#xff0c;我们将使用&#xff1a; Eclipse IDE &#xff08;您可以使用自己喜欢的IDE&#xff09;&#xff1b; MySQL &#xff08;您可以使用任何…

javaweb回顾第四篇Servlet异常处理

前言&#xff1a;很多网站为了给用户很好的用户体验性&#xff0c;都会提供比较友好的异常界面&#xff0c;现在我们在来回顾一下Servlet中如何进行异常处理的。 1&#xff1a;声明式异常处理 什么是声明式&#xff1a;就是在web.xml中声明对各种异常的处理方法。 是通过<er…

java开发cs教程,日常运维(一)

w命令&#xff1a;用于查看系统负载、显示已经登陆系统的用户列表&#xff0c;并显示用户正在执行的指令等信息第一行从左面开始显示的信息依次为&#xff1a;时间&#xff0c;系统运行时间&#xff0c;登录用户数&#xff0c;平均负载。第二行开始以及下面所有的行&#xff0c…

coursera 《现代操作系统》 -- 第五周 同步机制(1)

临界区块&#xff08;Critical section&#xff09;指的是一个访问共用资源&#xff08;例如&#xff1a;共用设备或是共用存储器&#xff09;的程序片段&#xff0c;而这些共用资源有无法同时被多个线程访问的特性。&#xff08;不是字面意思的一个区域&#xff0c;是程序片段…

java.lang.NoClassDefFoundError:如何解决–第2部分

本文是我们的NoClassDefFoundError故障排除系列的第2部分。 看一下第1部分 。 它将重点介绍最简单的NoClassDefFoundError问题类型。 本文对于Java初学者来说是理想的选择&#xff0c;我强烈建议您自己编译并运行示例Java程序。 今后将使用以下书写格式&#xff0c;并为您提供&…

Android开发技术周报 Issue#34

教程 Google Develop for Android 系列 前几天在G上看到Google Developers站点&#xff0c;有一个Android系列的文章&#xff0c;分享到个人微博&#xff0c;周末闲来没事就学写了下&#xff0c;把它们简单的翻译了下&#xff0c;没想到一发不可收拾&#xff0c;六篇文章全部都…

php进度条插件,分享8款优秀的 jQuery 加载动画和进度条插件_jquery

加载动画和进度条在网站和 Web 应用中的使用非常流行。虽然网速越来越快&#xff0c;但是我们的网站越来越复杂&#xff0c;同时用户对网站的使用体验的要求也越来越高。在内容加载缓慢的时候&#xff0c;使用时尚的加载动画和进度条告诉用户还有内容正在加载是一种非常好的方式…

卷积神经网络(CNN)与特殊的卷积

各种卷积操作的可视化的显示形式&#xff1a;GitHub - vdumoulin/conv_arithmetic: A technical report on convolution arithmetic in the context of deep learning1. fractionally-strided 卷积 如上图示&#xff0c;输入为 33 &#xff0c;想要卷积上采样成 55 的输出。需要…

JBoss AS 7:自定义登录模块

JBoss AS 7很整洁&#xff0c;但是仍然缺少文档&#xff08;错误消息没有那么有用&#xff09;。 这篇文章总结了如何创建自己的兼容JavaEE的登录模块&#xff0c;以对部署在JBoss AS上的Web应用程序的用户进行身份验证。 提供了一个工作的基本用户名密码模块。 为什么要使用Ja…

MySQL安装步骤及相关问题解决

1. 下载MySQL Server&#xff0c;网址&#xff1a;http://dev.mysql.com/downloads/mysql/ 2. 点击MySQL5.5.21的安装文件&#xff0c;出现安装向导界面&#xff0c;单击“next”继续安装&#xff1a; 3. 选择接受协议&#xff0c;单击“next”继续安装&#xff1a; 4. 在出现选…

matlab的数学函数,matlab中常见数学函数的使用

matlab中常见数学函数的使用 MATLAB 基本知识 Matlab 的内部常数 pi 圆周率 exp(1) 自然对数的底数 e i 或 j 虚数单位 Inf 或 inf 无穷大 Matlab 的常用内部数学函数 指数函数 exp(x) 以 e 为底数 log(x) 自然对数&#xff0c;即以 e 为底数的对数 log10(x) 常用对数&#xff…

C++中 list与vector的区别

C中 list与vector的区别 引用http://www.cnblogs.com/shijingjing07/p/5587719.html C vector和list的区别 1.vector数据结构vector和数组类似&#xff0c;拥有一段连续的内存空间&#xff0c;并且起始地址不变。因此能高效的进行随机存取&#xff0c;时间复杂度为o(1);但因为内…

使用Struts 2的查询网格(无插件)

当将jQuery与struts 2一起使用时&#xff0c;开发人员被说服使用struts2-jQuery插件 。 因为大多数论坛和其他Internet资源都支持struts2 jQuery插件。我有这种经验。 我想将Struts 2使用jQuery Grid插件&#xff0c;但不使用struts2 jQuery插件。 对于我而言&#xff0c;很难找…

php reflectionmethod,PHP ReflectionMethod getClosure()用法及代码示例

ReflectionMethod::getClosure()函数是PHP中的一个内置函数&#xff0c;用于为该方法返回动态创建的闭包&#xff0c;否则&#xff0c;在出现错误的情况下返回NULL。用法:Closure ReflectionMethod::getClosure ( $object )参数&#xff1a;该函数接受参数对象&#xff0c;该参…

java学习笔记--IO流

第十二章大纲&#xff1a; I/O input/output 输入/输出 一、创建文件&#xff0c;借助File类来实现 file.createNewFile() &#xff1a; 创建文件 file.exists() &#xff1a; 判断文件是否存在&#xff0c;如果存在&#xff0c;则返回true delete() &#xff1a; 删除文件&…

linux命令之kill篇

作业四&#xff1a;查询firewall进程&#xff0c;然后杀死 [rootlocalhost 桌面]# ps -aux |grep firewall root 772 0.0 2.0 327912 20704 ? Ssl 15:23 0:00 /usr/bin/python -Es /usr/sbin/firewalld --nofork --nopid root 5323 0.0 0.0 112660…

ActiveMQ网络连接器

这篇文章对我和任何对网络连接器如何为ActiveMQ工作感兴趣的ActiveMQ贡献者而言都是更多的内容。 我最近花了一些时间查看代码&#xff0c;并认为最好画一些快速的图表来帮助我记住我学到的东西&#xff0c;并在将来发现问题时帮助将来确定在哪里进行调试。 如果我输入有误&…