Java EE 6及其替代方案

11

我是一名Java SE开发人员,但我有丰富的Web背景(PHP、Perl/CGI等),现在我正在开始一个新项目。它将具有Web界面、混乱的业务逻辑、关系型数据库作为存储和连接到其他服务。我要从头开始做。

我的同事告诉我要使用Spring、Spring Security和Struts。 我简要查看了Java EE 6规范,发现它几乎涵盖了企业应用程序的所有方面。我问我的同事他们为什么需要Spring和Struts,但看起来他们只是因为熟悉这些技术而不熟悉经典的Java EE 6堆栈。

所以,我的问题是:Java EE 6有什么问题吗? 如果有JNDI查找,为什么需要Spring?创建虚假InitialContext进行单元测试只需要一两天时间。那就没必要外部工具像Spring这样了。 如果Servlet规范中有内置的安全性,为什么需要Spring Security? 我可以使用web.xml将任何请求映射到任何servlet,不需要struts.xml。我可以使用servlet过滤器代替struts拦截器。 有RMI,因此我不需要Spring Remote。 等等...

如果有Java EE 6,为什么还要费心去使用那些花哨的东西呢?

我真的想找到Java EE 6不足的情况。 你有吗?

谢谢!


3
当时的传统J2EE和现代Java EE 6之间存在相当大的差异。你指的是哪一个?当时,Spring和Struts是J2EE的很好补充。但是现在,Java EE 6已经提供了几乎相同的功能。你的同事可能仍然停留在古老的年代。 - BalusC
抱歉,我不会使用Java 1.2,而是使用Java EE 6。 - Ilya K
请修改/重新标记你的问题,然后再提交。你可能也要重新考虑一下它 :) 这里有类似的问题:这里这里 - BalusC
但我的问题仍然是一样的:为什么每个人都使用替代技术而不是Java企业版? - Ilya K
人们所问的关于Web的一切,但Web只是一个薄层。我知道该怎么做。我将使用JSP作为模板引擎(我喜欢XSL,但很难找到除了我和我的HTML编码器之外还有谁喜欢它)。我将使用纯JavaScript,而不是GWT(因为应用程序不是以Ajax为中心,所有业务逻辑都将在服务器端工作)。我可能不会使用JSF,因为在我的asp.net项目之后,我不喜欢“Web组件”。对我来说,Web很清晰。...__ Java EE 6和Java EE <6在我的问题上有什么区别? - Ilya K
显示剩余2条评论
5个回答

13
为什么人们使用Spring以及它为什么如此受欢迎需要一些历史背景。过去,Spring比Java EE应用程序更简单。我指的是EJB2.x规范。我感觉有一种对该规范复杂性的反抗。开发人员希望拥有一个更简单的体系结构,而Spring通过允许他们编写POJO(普通旧Java对象)而不是必须实现特定接口的类来提供这一点所需的功能。Spring还使两个原则更加流行:控制反转(IoC)和依赖注入。结合起来,这两个原则提供了一种不同的方法来连接应用程序的各个组件并在其运行时将这些组件放入其中。这与仅编写POJO的想法相结合对许多人非常具有吸引力,因为代码更简单,更容易连接所有组件。较新的EJB3规范取消了Spring提供的一些功能,但Spring不仅是IoC容器。它提供了访问数据库的JDBC模板、处理事务的多种简单方式、测试工具、MVC堆栈等方面的优秀模板。它曾经很受欢迎,现在仍然很受欢迎。我听过一个笑话:“EJB3,没有人问的问题的答案...”EJB3是一个好选择。Spring也是一个好选择。Grails也是一个好选择(在幕后使用Spring、Hibernate)。

1
我是Grails的忠实粉丝!惊人的是你可以多么快速地启动和运行。 - Amir Raminfar
1
我不这么认为。Grails很好用,但是根据我们使用的版本 - 1.3.3 - 它仍然相当不稳定。我们不得不自己修复一些bug(当然,在报告它们后)。而且这些bug并不是一些偶发情况下的问题。 - Bozho
@bozho,没错,我同意存在一些问题;它还不完美。但最终,它让我在许多项目上能够更快地前进。 - hvgotcodes
1
我必须对“没有人问的问题”部分提出异议。每个人都讨厌EJB2,希望有更好的东西……显而易见的问题是我们能否从通用规范中摆脱它?但我点赞这个答案,因为它很好且简洁。 - hsanders

1

Spring对于Java EE并非必需品。Spring只是让复杂的Java EE组件易于使用。


我知道这个(使用JNDI代替Spring DI),但是我为什么还需要Spring呢? - Ilya K
2
JNDI与Spring DI无法相提并论,而CDI则可以。 - BalusC

1

“那么,我为什么需要Spring呢?”

伊利亚!终于说服了我(希望你也相信)你不需要Spring。实际上,在所有这些堆积中,没有什么特别好的东西......除非你已经习惯了它。他们写了一本关于Web技术的书,然后加入了计算机科学的其他内容,并称之为RESTful。

“但是,想象一下,有很多处理表单输入和许多模型的代码。每个控制器可以有一个视图。”

阿米尔!非常好的考虑。我所知道的Web框架之间的真正区别在于组件的定义。Struts有三种类型的组件-视图、控制器和模型组件。乍一看看起来不错(肯定比其他一些好)。但是你可以用这些组件构建什么? - 一个页面视图,一个页面控制器和一个页面模型。谁知道从这三行组件中绑定项目的成本会是多少 - 也许是巨大的配置,如果可能的话。

真正的解决方案是(正如你在上面引用的那样)每个组件都有它的视图、控制器和模型的概念。迄今为止,只有一个框架做到了这一点——HybridJava。在Spring中,什么是Web页面构建块?


1

听起来你需要使用Spring和Java EE 6来POC特定的功能,这样你就可以比较两者的实际工作原型。

然而,我使用Spring的原因是:

  • 能够将我的应用程序与应用服务器分离。因此,我可以在任何应用服务器上运行,或在AS外进行单元测试
  • 许多我需要编写的样板代码已经可用,以改进我的设计
  • IOC/DI - 需要依赖项的对象不知道如何获取它们 - 它所知道的只有它需要什么接口。一些第三方提供它们。是的,你可以在Java EE 6中自己编写这个第三方的版本,但在Spring中已经可用。
  • Bean Managed Transactions - Spring提供了所有你需要完全控制事务的工具。我总是建议使用BMT,因为它给你可能需要的灵活性。

0

Spring是一个模型-视图-控制器,使Java EE更加清洁和有组织。在结构上,将模型、视图和控制器分开更加正确。

我同意你的观点。如果只是一个简单的网站,我认为你可以只用Java EE来完成所有工作。但是,想象一下处理表单输入和许多模型的大量代码。每个控制器可能都有一个视图。你可以创建一个servlet,然后转发到正确的jsp页面,或者你可以使用Spring,因为它已经完成了所有这些工作。

决定使用Spring的程度取决于你自己。一个好的框架应该让你选择使用哪些部分。我认为Spring做得很好,因为你可以只使用mvc模型,或者进一步使用它。

最后,Spring具有依赖注入功能,使配置更加容易。


谢谢。我可以自己实现MVC模式:每个servlet都是控制器,JSP页面只是视图。我不会在JSP中使用任何逻辑(因为无法测试)。我可以在没有Spring的情况下使用JNDI(服务查找)。这和依赖注入一样好,不是吗? - Ilya K
我认为你正在试图重新发明轮子。这很酷,但是既然Spring已经被数百万用户测试过了,为什么要这样做呢?如果你说这是一次学习经历,那我完全支持你。否则,你只需要重复使用已经被创建和测试过的库。 - Amir Raminfar
@BalusC,你能详细解释一下吗?假设我有一个购物应用程序。我不是想要一个servlet来查找商品,一个servlet来创建订单,一个servlet来查看客户历史记录等吗? - corsiKa
1
@glowcoder,看看现有的MVC框架,如JSF、Spring MVC、Struts、Vaadin、Echo等。所有这些框架都使用单个servlet作为MVC入口点(控制器)。为了获得基本的想法,您可能会发现这个答案有用:https://dev59.com/onA65IYBdhLWcg3w9DqF#3542297 - BalusC
如果您真正理解面向对象编程,并认为基于Java的Web UI框架应该充分支持它(就像20年前C ++桌面UI框架一样),那么您一定会赞赏'组件导向' Wicket UI框架,而不是传统的'动作导向'风格的JSP / Struts / Spring MVC UI框架。 - Volksman

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接