有很多 Web应用程序框架,基于Java / Ruby / Python / PHP等。我渴望发现,比较和对比各个框架独有的功能。
您认为哪种框架功能有用,为什么知道它很重要?
e.g。
你能否限制每个帖子的一个功能。
要点:
答案 0 :(得分:3)
(来源:symfony-project.org)
Symfony在PHP框架方面做了一些非常独特的事情。
我认为其中一些功能在其他地方使用,但我认为在PHP中它们是唯一的。
答案 1 :(得分:2)
Sinatra的极简主义。您只能在一个文件中编写整个Web应用程序。 (显然,对于大型应用程序来说,这是不可能的,但对于快速原型设计,小型站点和Web服务,将所有内容集中在一个地方是很棒的。)
答案 2 :(得分:2)
Grails http://www.cjsdn.net/JVM/Grails/Docs/1.1/img/grails.png
GORM - 我还没有看到另一个具有如此强大的ORM的框架,但却很容易使用。
答案 3 :(得分:2)
Django's built-in admin可能是它的杀手锏。编写数据库模型,注册它们,然后开始输入数据。根据需要自定义。很容易,我一直在非django项目上使用它。
答案 4 :(得分:1)
您应该知道如何在Django中编写自定义模板标记。例如,以下标记允许我在模板中JSONify Django变量。
@register.filter
def jsonify(o):
return mark_safe(simplejson.dumps(o))
这很有用,因为我的网站都是Javascript,所以我使用Django模板制作网站的无脚本版本。这非常有用,因此Google可以抓取我的网站。例如,使用Javascript打开和关闭以下页面:http://www.trailbehind.com/Yosemite%20National%20Park/
这里有一些其他有用的标签:
@register.filter
def attr_name(id):
return util.get_attribute(id).name
@register.filter
def dashes(name):
return name.replace(' ', '-')
并不是Python的装饰器语法会让这些简短而又甜蜜吗?
答案 5 :(得分:1)
Smalltalk中的Seaside支持重构和无转码编程。基于组件而没有模板意味着您可以避免大量重复。
答案 6 :(得分:1)
Seaside,无需担心关系数据库(SandstoneDB,Magma或Gemstone),允许使用某些方法编写OO代码而不是数据库代码。
答案 7 :(得分:1)
Spring Web Flow - 序列化对话/出色的浏览器后退按钮支持
支持浏览器后退按钮和历史记录是大多数网络应用程序的头疼,因为它太容易让客户端感知到的状态/页面与服务器上的内容不同步。
SWF通过在每次呈现视图时创建整个对话状态的快照来解决此问题。大多数有状态数据存储在SWF的其中一个范围(会话,流,视图)中,因此使用对话快照进行序列化。
SWF的网址无法识别页面或操作等资源。相反,他们识别流程和对话。由于SWF隐式实现POST-REDIRECT-GET,因此每次呈现页面时,URL都包含flowExecutionId,它唯一地标识会话和序列化会话快照。因此,当用户使用浏览器后退按钮或历史记录时,每个URL实际上在该时间点恢复整个会话状态。
这导致理想的后退按钮处理:客户端状态永远不会与会话状态不同步,并且用户可以从任何先前的状态自由地继续。
当用户执行某些操作时,开发人员还可以丢弃或使历史记录(已保存的快照)无效。这对于修改数据库中某些内容的用户操作很有用,因为用户不应该返回到不代表数据库中的内容的状态。
开发人员可以精确限制要保存的快照数量。由于硬盘容量很大,特别是与内存相比,它是一个相当简洁的解决方案。
然而,一个主要限制是放置在会话,流或视图范围内的任何属性都必须是可序列化的。
答案 8 :(得分:1)
Spring Web Flow - 流量和视图范围
大多数Web应用程序都满足于使用Servlet定义的请求,会话和上下文范围。但是,Web应用程序中使用的大部分有状态数据并不完全适合这些范围。通常,此类数据的持续时间长于单个请求,但短于会话。在这种情况下通常使用会话范围。这迫使开发人员基本上执行手动内存管理以将事物放入会话范围,然后在应用程序的该部分不再需要它们时显式删除它们。这可能很麻烦,因为通常有多个地方必须删除属性,因为用户通常可以调用几个动作来将它们从需要属性的用例中取出。
在大型或不断增长的应用程序中,属性清理代码在整个代码中成为必要且普遍的混乱。忘记清理属性或者错误地清理错误属性会导致错误。
SWF通过提供一些更适合应用程序属性生命周期的附加范围来解决这个问题。
SWF引入了流的概念,流是可重用的模块化行为分组,表示为状态机,由状态和它们之间的转换组成。流可以包括用于调用服务器端行为的动作状态,用于向用户呈现页面的视图状态等。流程通常代表用例。流限制属性在流的持续时间内保持不变,并在流结束时自动清理。这导致属性仅在需要它们的用例期间持续存在。流中的ViewStates会向用户呈现视图。来自viewState的转换可以导航到不同的状态,或者可以保留在相同的viewState中,在执行某些操作后重新渲染视图(使用或不使用AJAX)。当控件保留在viewState中时,viewScope中的属性仍然存在。 ViewScoped属性在浏览器刷新后仍然存在,并且对于仅与正在呈现的视图相关的数据(例如在AJAX请求中使用的数据)或以某种方式影响标记的标志非常有用。当调用离开viewState的转换时,将清除viewScoped属性。
总之,SWF的附加范围更适合应用程序属性的生命周期,使用这些额外的范围消除了手动管理属性的需要,从而减少了整个应用程序中属性杂乱的管道代码,减少了错误的可能性。
答案 9 :(得分:1)
CakePHP值得注意的功能:
bake
工具,用于自动从数据库创建模型和控制器总结:许多人认为Cake适用于PHP,就像Rails适用于Ruby一样。
答案 10 :(得分:0)
希望它有所帮助。
答案 11 :(得分:0)
Zend Framework具有以下显着特征:
答案 12 :(得分:0)
Icefaces有一个强大的可扩展的ajax推送框架