4

有很多基于 Java/Ruby/Python/PHP 等的Web 应用程序框架。我热衷于发现、比较和对比各个框架独有的功能。

您认为哪个框架功能有用,为什么了解它很重要?

例如

您能否将每个帖子限制为一个功能。

概括:

  • 条纹 - 闪光范围
  • Django - 模板中的 JSON 化变量
  • Symfony - 模型生成。后端管理生成
  • Grails - GORM 形式的强大 ORM
  • Seaside - 没有关系数据库,只是代码 OO
  • 西纳特拉 - 极简主义
  • Spring Web Flow - 流和视图范围
4

13 回答 13

3

替代文字
(来源:symfony-project.org

Symfony 在 PHP 框架方面做了一些非常独特的事情。

我认为其中一些功能在其他地方使用,但我认为在 PHP 中它们是独一无二的。

于 2009-07-19T21:16:10.113 回答
2

辛纳屈的极简主义。您可以在一个文件中编写整个 Web 应用程序。(显然,这对于大型应用程序来说是行不通的,但是对于快速原型设计、小型站点和 Web 服务来说,将所有东西都放在一个地方是很棒的。)

于 2009-07-23T07:08:12.860 回答
2

Grails http://www.cjsdn.net/JVM/Grails/Docs/1.1/img/grails.png

GORM - 我还没有见过另一个框架具有如此强大的 ORM 却如此易于使用。

于 2009-07-24T13:26:31.070 回答
2

就采用而言,Django 的内置管理员可能是它的杀手级功能。编写您的数据库模型,注册它们,然后开始输入数据。如果需要,可以自定义。我一直在非 django 项目上使用它很容易。

于 2009-07-28T16:27:16.067 回答
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 的装饰器语法难道不是让这些简短而甜蜜吗?

于 2009-07-19T20:55:59.153 回答
1

Smalltalk 中的 Seaside 支持重构和 goto-less 编程。基于组件且没有模板意味着您可以避免大量重复。

于 2009-07-24T13:05:37.030 回答
1

Seaside 不必为关系数据库(SandstoneDB、Magma 或 Gemstone)而烦恼,它允许使用某些方法编写 OO 代码而不是数据库代码。

于 2009-07-24T13:36:51.727 回答
1

Spring Web Flow - 序列化对话/出色的浏览器后退按钮支持

支持浏览器后退按钮和历史记录对于大多数 Web 应用程序来说是一个令人头疼的问题,仅仅是因为客户端感知的状态/页面太容易与服务器上的内容不同步。

SWF 通过在每次呈现视图时创建整个对话状态的快照来解决此问题。大多数有状态数据存储在 SWF 的附加范围之一(对话、流、视图)中,因此与对话快照一起序列化。

SWF 的 URL 不识别页面或操作等资源。相反,他们确定了一个流程和一个对话。由于 SWF 隐式实现 POST-REDIRECT-GET,因此每次呈现页面时,URL 都包含 flowExecutionId,它唯一地标识对话和序列化的对话快照。因此,当用户使用浏览器后退按钮或历史记录时,每个 URL 实际上会及时恢复整个会话状态。

这导致理想的后退按钮处理:客户端状态永远不会与对话状态不同步,并且用户可以自由地从任何先前的状态继续。

当用户执行某些操作时,开发人员还可以丢弃或使历史记录(保存的快照)无效。这对于修改数据库中某些内容的用户操作很有用,因为用户不应该有能力返回到不代表数据库中内容的状态。

开发人员可以精确限制要保存的快照数量。由于硬盘容量充足,特别是与内存相比,这是一个相当简洁的解决方案。

然而,一个主要的限制是任何放置在对话、流或视图范围内的属性都必须是可序列化的。

于 2009-07-24T18:53:37.857 回答
1

Spring Web Flow - 流和视图范围

大多数 Web 应用程序都使用 Servlet 定义的请求、会话和上下文范围。但是,Web 应用程序中使用的大部分有状态数据并不完全适合任何这些范围。通常,此类数据的持续时间比单个请求长,但比会话短。这种情况下通常使用会话范围。这迫使开发人员在本质上执行手动内存管理以将内容放入会话范围,然后在应用程序的该部分不再需要它们时显式删除它们。这可能很麻烦,因为通常有多个地方必须删除属性,因为用户通常可以调用几个操作来将它们从需要属性的用例中取出。

在大型或不断增长的应用程序中,属性清理代码成为整个代码中必不可少且普遍存在的混乱。忘记清理属性,或者错误地清理了错误的属性,可能会引入错误。

SWF 通过提供一些更适合应用程序属性生命周期的附加范围来解决这个问题。

SWF 引入了流的概念,流是可重用的模块化行为分组,表示为由状态和它们之间的转换组成的状态机。流可能包括用于调用服务器端行为的动作状态、用于向用户呈现页面的视图状态等。流通常代表用例。流范围内的属性在流期间持续存在,并在流结束时自动清除。这导致属性仅在需要它们的用例期间持续存在。

流中的 ViewStates 向用户呈现视图。来自 viewState 的转换可以导航到不同的状态,或者可以保持在相同的 viewState 中,在执行某些操作后重新呈现视图(使用或不使用 AJAX)。viewScope 中的属性保持不变,而控件保留在 viewState 中。ViewScoped 属性在浏览器刷新后仍然存在,并且对于仅与正在呈现的视图相关的数据(例如在 AJAX 请求中使用的数据)或以某种方式影响标记的标志很有用。当调用离开 viewState 的转换时,会清除 viewScoped 属性。

总之,SWF 的附加范围更适合应用程序属性的生命周期,并且使用这些附加范围消除了手动管理属性的需要,从而减少了在整个应用程序中处理属性的管道代码,并减少了潜在的错误。

于 2009-07-24T19:09:40.430 回答
1

CakePHP 徽标

CakePHP 的显着特点:

  • bake自动从数据库创建模型和控制器的工具
  • 零配置 - 你只需要建立一个数据库连接就可以了
  • 脚手架 - 你甚至不需要生成你的视图,蛋糕会为你生成它们
  • 很多助手 - AJAX、JavaScript、HTML、表单、分页、XML、RSS,应有尽有
  • 活动记录
  • 用于单元测试的 SimpleTest
  • 数据验证 - 易于使用,但功能强大
  • 数据清理——不用担心代码注入
  • 路由器 - 允许您将“自定义” URL 重定向到特定控制器/操作

总结:很多人认为 Cake 是 PHP 的,就像 Rails 是 Ruby 一样。

于 2009-07-28T16:41:23.760 回答
0

嗯...我是一名大约 15 年的 PHP 开发人员。看看 Rails(Ruby on Rails)框架。它有一些独特的功能,比如数据库迁移,接口的实现不同于 Java、PHP 等语言,配置文件不像 ini 文件(你可以编写代码)。

希望能帮助到你。

于 2009-07-19T20:58:09.523 回答
0

Zend 框架

Zend Framework具有以下显着特性:

  • 挑选并选择您使用的内容。ZF 是轻量级松耦合组件的集合。
  • 与谷歌亚马逊雅虎集成!、Flickr和其他几个 API
  • 易于使用的 XML-RPC、SOAP 和 REST 服务器/客户端
  • 与 Adob​​e AIR 和 Flex 集成
  • Zend_CodeGenerator
  • 内置 DB、LDAP 和 OpenID 身份验证
  • 与DojojQuery的完美集成
  • 适用于企业应用程序(FOX、IBM、Right Media)的框架
  • 一个非常活跃的社区(irc.freenode.net 上的#zftalk)
  • 不会创建您的模型。(这是一件好事)。
于 2009-07-28T06:05:52.390 回答
0

Icefaces有一个强大的可扩展的 ajax 推送框架

于 2009-07-28T21:53:21.493 回答