12

是的,我知道,最好的 web 框架的老问题......但让我解释一下。

我正在寻找基于 Java Servlet 的 Web 框架,它允许 RESTful 交互并且也适合构建 Web GUI。

我想要的是:

  • REST 支持与 http 内容协商和良好的 URL 映射
  • 从请求参数到域对象的数据转换(理想情况下也是另一个方向)
  • 无需复制域对象作为 Web 的接口(如在 struts 中)
  • 简单的 EJB 集成
  • 依赖注入应该由 Java EE 服务器执行
  • 可理解的代码(我不喜欢 Spring MVC 在类路径中对组件的魔术布线)
  • 易于配置(在 Spring 中没有神奇地配置的东西在容器中配置很乏味 - 我有时更喜欢直接依赖)
  • 轮子不应该被重新发明,例如应该使用 JPA 和 BeanValidation 之类的东西,而不是被框架重新发明,或者至少这些标准应该易于使用。
  • 在表单中显示错误的验证支持
  • 支持国际化

候选人:

  • Spring MVC很强大,但是我厌倦了 Spring 的配置,不喜欢这种编程模型。我认为它有点过于抽象和灵活,因此需要很多配置。而且我不喜欢 Spring MVC 使用注解的方式。但是也有一些设计缺陷,比如return通过输出参数返回值的方法——真的很丑!我认为将 Spring MVC 与 Java EE 依赖注入一起使用并不容易,因为 Spring MVC 严重依赖 Spring DI。

  • Roo看起来很酷,但它只是创建 Spring MVC 应用程序的另一种方式,它使用 AOP 做了一些奇怪的事情。

  • Struts有点笨拙和过时。

  • 条纹ActionBean 方法看起来并不比 Struts 好多少。我不喜欢它。

  • Grails不错,但有问题(至少在 1.2 之前)。Reeinvents the wheel:例如,我更喜欢 JPA 而不是 Gorm。

另请参阅10 个最佳 Java Web 框架

我不是在服务器上寻找具有 UI 状态的框架,如 Wicket、Tapestry 或 JSF。我认为这种方法与网络的基本原则相矛盾!

那么该怎么办?从头开始编写框架?唔 ...

我想要像JAX-RS 这样支持经典浏览器 GUI 的东西。例如,框架应该支持验证并将验证错误放入重新显示的表单中。有没有类似的东西?有什么建议吗?

4

5 回答 5

7

过去,我曾写过关于使用 JAX-RS 作为统一 Web 框架的博客。你几乎可以用 JAX-RS 做所有你需要的事情;主要的缺点是所有的部分可能没有像 Spring MVC、Stripes、Grails、Seam 等那样在一个地方有很好的文档记录。

对于视图,它非常容易将 JAX-RS 与Jersey一起使用,并支持 HTML 中的 Web UI,以及 JSON/XML/其他格式的 RESTful 服务。您可以重用 JAXRS 优雅的内容协商,因此 HTTP 内容接受标头用于决定是否返回 HTML 或 XML 等(此外,您可以在服务器端加权 HTML 以避免将 XML 提供给某些提供奇怪接受标头的 Web 浏览器 - 我是看着你喜欢 XML 而不是 HTML 的 Safari!)。例如,将@ImplicitProduces("text/html;qs=5") 添加到您的资源bean 将使HTML 的权重高于任何其他表示。您还可以配置 URI 后缀(例如添加 .html 或 .xml 或 .json)以覆盖内容协商;这使得在浏览器中测试不同的表示变得更加简单。

Jersey 很好地支持隐式视图,因此您可以使用任何模板引擎(如 JSPLift 模板或其他任何模板引擎)在 HTML 中呈现视图;然后使用更传统的 JAX-RS 提供程序进行 XML/JSON 类型编组。您可以明确地使用视图;或让 JAX-RS 找到您的模板等。

要查看实际的隐式视图,可能值得下载 Jersey 的源代码并查看示例,例如书店(如果您愿意,请搜索 @ImplicitProduces)。

在验证方面,很容易将Bean Validation JSR集成到资源 bean 中;因此您可以对资源或 DTO 或其他任何内容执行自定义验证。同样,在 Jersey(表单 bean)中也有很好的表单发布支持。

我建议使用一些 DI/IoC 框架来为资源 bean 注入他们需要的东西(比如数据库东西、bean 验证东西或服务对象等等)。如果你想避开 Spring,Guice 与 Jersey 配合得很好;尽管带有 JavaConfig 的 Spring 确实避免了很多 XML。

对于复杂的 UI,这些天您可能希望在客户端上使用 JavaScript。虽然从 JavaScript 调用 RESTful 服务很容易(特别是如果它们使用 JSON 或 JSONP),但缺少的部分是优雅地重用来自 GWT 的 Java/JAX-RS 中的 RESTful 服务。到目前为止, RestyGWT看起来是最有前途的。有一天可能是最好的 JSON 编组框架,Jackson将拥有本地 GWT 绑定。这个想法是在客户端和服务器端 JAX-RS 中重用 GWT 中的 DTO 对象,同时保持完全 RESTful。

于 2010-01-13T09:35:03.900 回答
3

我认为您将 Grails 描述为“buggy”有点苛刻。尽管您在使用 Grails 时会遇到错误,但通常是底层框架(Spring、Hibernate)或插件负责,而不是 Grails。

另外,鉴于 Hibernate 是一个 JPA 实现,这样说真的有意义吗?

我更喜欢 JPA 而不是 Gorm

无论如何,如果您真的对 Grails 或您提到的任何其他框架不满意,Play 框架可能值得一看。

于 2010-01-12T21:01:14.680 回答
3

我想提一下Restlet 框架,它是 2005 年推出的第一个 Java REST 框架。它成熟、可扩展、拥有庞大的用户群和活跃的社区。

2.0 版处于最终开发阶段,提供了广泛的功能集,包括:

  • 在干净的 Java API 中完整映射 HTTP 概念
  • 客户端和服务器端一致的 API
  • 与许多流行的技术集成(FreeMarker、Velocity、Spring、Jackson、XStream、JAXB、Atom、OData/WCF 数据服务等)
  • 可以部署在独立的 Java SE、Java EE/Servlet 容器、Google App Engine、Android 甚至 GWT 中,它知道如何使用延迟绑定自动序列化 bean(类似于 GWT-RPC,但 RESTful)
  • 为 HTTP、SMTP、POP、JDBC、SIP 等提供了许多连接器。
  • 内置完整的安全包,专注于网络安全
  • 支持 JAX-RS 作为扩展
  • 面向类的 API,可预测、易于扩展和配置(在 Java、XML、Spring、Groovy、Scala 等中),并在真正有用时支持 Java 注释
  • 等等

看看这个项目并试一试: http ://www.restlet.org/

于 2010-02-08T15:06:09.037 回答
2

也看看dropwizard。.

于 2012-07-11T07:29:54.887 回答
1

它不在您的列表中,但我建议使用resteasy构建您的 Web 服务,它非常易于使用……只需要在提供 Web 服务的方法上使用注释,以及您编写的所有您想要的东西。

此外,如果您想要一个良好的 EJB 集成,您可以将 resteasy 与JBoss Seam 框架一起使用

于 2010-01-12T20:11:35.550 回答