我想知道如何解决与其他技术堆栈(Seaside,Ruby on Rails等)相比基于Java EE的Web应用程序开发看似低效的问题。
约束是:
为了不让这个进入哲学讨论,我只对基于实践经验的建议感兴趣。可能的示例包括特定于域的语言,框架和MDSD。
如果你指出一个抽象的解决方案类(如MDA / MDSD),请提供有关如何实现它的详细信息,以及有关常见陷阱和最佳实践的信息。
如果您不同意基于Java EE的Web应用程序开发意味着生产率较低的假设,我也希望听到您的推理。
编辑: 由于答案远远少于我的预期,我也会接受有关中断尝试的说法,基本上将问题扩展到“在开发基于Java EE的Web应用程序时如何(不)提高工作效率?”。
答案 0 :(得分:49)
答案 1 :(得分:6)
像Spring,Hibernate,Wicket这样的框架当然有助于简化和加速网络开发,因为它们提供了高度的可测试性并且可以很好地集成。但即使您有一套良好的开发实践,它也不足以达到RoR生产力。仍然需要太多的技术和管道。
Grails可能是这张照片中缺少接近RoR的缺失部分。这是我的下一个实验。
顺便说一句,我的MDA经验与提高生产力相反,所以我不会提及它们(实际上,MDA正在扼杀我们的生产力)。答案 2 :(得分:5)
Javarebel可以大大减少使用Java进行Web开发所花费的时间。
我在这里引用官方网站:
JavaRebel是一个JVM插件(-javaagent),使您可以立即查看代码更改,而无需重新部署应用程序或执行容器重新启动。如果你厌倦了看日志滚动,并希望看到你的变化以便你继续前进 - JavaRebel是你最好的新朋友。
答案 3 :(得分:3)
讨论Java EE生产力时的一个重点:您应该使用Java EE 5和EJB3.x,因为与以前的版本相比,它们提供了更高的生产力(和功能)。
保持标准Java EE规范绝对重要,例如使用Hibernate而不是JPA对生产力没有好处。在使用JPA时,回归到Hibernate功能没有任何限制,但是通过使用Hibernate而不是JPA,您将被锁定在单个持久性提供程序中而没有廉价的出路。使用标准背后的整个想法是相同的:概念灵活性(通过插入不同的实现)具有可用的可扩展性(如果绝对必要,使用专有扩展)。 Java EE 5和EJB3是朝这个方向迈出的重要一步。当然,您希望最大限度地减少任何专有功能,但如果某些功能看起来绝对必要,那么它们将成为下一版本中规范的一部分的好迹象......
Java EE生产力的主要障碍在于其企业重点(提供的内容远远超过大多数项目所需)和其遗留(向后兼容性)。使用JSF和状态管理在表示层中还有很多工作要做 - 注意JSR-299以解决这些问题以及其他改进。
答案 4 :(得分:2)
经常引用RoR和基于动态语言的类似框架是更高效的环境,但我真的很想知道是否有硬数据支持这一点。这并不容易,因为应该确保她不会将苹果与橙子进行比较。应该考虑类似项目类型(Web 2.0,企业应用程序)和团队规模。但是,对于小型项目而言,这些框架确实比Java EE更具生产力。所以这是一个简短的参数列表,用于支持这一点以及您可以在Java世界中为它们做些什么。
我认为你不能在Java中拥有相同的东西,除非你当然使用在JVM(JRuby,Scala,Groovy)中运行的动态语言。否则,您的IDE可以提供帮助。在Jave中,IDE是一个必不可少的工具,如果你学会好好使用它(代码生成,代码片段,重构)它会回报你。事实上,使用Java IDE可以做很多事情,使用Ruby或Python IDE是无法做到的。此外,您还可以使用静态类型语言。键入可能需要更长的时间,但它可以帮助您避免常见错误。
与上述相同。但在我看来,这是一个非常主观的论点。
像Spring或Guice这样的依赖注入框架可以提供帮助
Java MVC框架再次提供帮助
Hibernate,iBatis或其他ORM框架可以提供帮助。使用Hibernate Tools,您可以使用yR文件中的RoR实现类似的功能
Maven或Ant Ivy可以提供帮助
您的IDE或Jetty可以提供帮助。事实上,使用Java
可以更轻松地进行调试依赖注入框架可以帮助模拟对象。 JUnit是单元框架的先驱。我不认为Java不那么容易测试。
答案 5 :(得分:2)
Grails是一个非常模仿Ruby on Rails的Java webapp框架,它具有类似的原则(DRY,CoC)和生产力提升,但基于现有的Java框架(Spring,Hibernate和其他几个)。
我一直在使用Grails进行一个探索性项目几个星期(之前没有Grails或Groovy的经验),我印象非常深刻。有一些粗糙的边缘 - 它不像RoR那样成熟,但你可以快速获得结果,并且从来没有感觉到框架正在妨碍你。
这个具体的例子可能最好地说明了这一点:我想在单个网页上的网格中编辑域对象的2D数组,并发现生成的HTML请求数据自动映射到域对象(由Spring MVC提供) ,我相信)有一个错误导致一些数据被映射到错误的对象。我在网上看了一个小时,但显然没有人遇到或解决了这个问题。最终我决定放弃自动映射并“手动”进行 - 然后发现它花了我不超过10行代码......
答案 6 :(得分:1)
我肯定会和Hibernate一起为Spring提供与持久性相关的东西。
为什么选择春天?
使用Spring代替另一个框架的优势在于Springs的理念是“ non-invasive ”。通常,当您使用框架时,您很可能会开始依赖于该框架,如果认为应用程序运行的时间较长,那么您可能会遇到一个不好的问题,然后您还需要进行维护等.Spring使用了这样的框架。 - 称为“控制反转”(IoC)模式。基本上你的代码没有(它可以,但它没有)调用Spring,但Spring会打电话给你(好莱坞原则:“不要打电话给我,我会打电话给你”)。因此,例如,你可以使用普通的POJO (普通旧Java对象),而不必从任何与框架相关的类/接口继承。 软件工程中的另一个大问题(如果不是最大的问题)是依赖关系。你会尽可能地减少它们,因为它们会让你的生活更加艰难(特别是在以后的维护中)。通过配置文件和依赖注入模式管理组件的实例化, Spring可以大幅减少组件之间的依赖关系。我不想继续,最好的是你开始阅读官方Spring website的一些教程。最初它可能需要一些时间来理解,但一旦你得到它,你将获得很多好处。
答案 7 :(得分:1)
从Jython 2.5开始,您可以使用django来满足您列出的要求。从django项目生成war文件并将它们部署在J2EE应用程序服务器上非常容易。
答案 8 :(得分:1)
只是想提出另一个想法......你实际上可以使用JRuby和Rails(类似于之前关于Django和Jython的评论)。
如果你使用JRuby和Rails以及JRuby Rack(可能还有其他一些实用程序......我不是最初实现集成的那个),你可以将JRuby Rails添加到现有的Java Web应用程序中。我们有一个使用Tomcat部署的遗留JSP应用程序,现在开始使用Rails添加新页面,只需要设置(除了在必要时扩展JSP端)。到目前为止它已经非常成功,虽然我们没有在Rails中实现任何主要的高流量页面,所以我不知道它的扩展程度如何。
我们拥有对会话的完全访问权限,甚至设置了从Rails页面调用JSP的机制(例如现有的页眉和页脚类型JSP包含)。完全集成2需要一些努力和反复试验,但如果Rails和JRuby是一个选项,我强烈推荐它(作为Ruby的个人粉丝)。
一位同事涉足JBoss Seam,这是Gavin King(带给我们Hibernate的人)的一个框架,它的目的是模仿Rails。看过两者后,我觉得Rails更易于开发。
答案 9 :(得分:1)
使用AOP(面向方面编程)进行日志记录,授权等交叉切割。您可以使用Spring AOP或AspectJ。它使代码混乱,可维护。
答案 10 :(得分:1)
在过去的几年里我使用过Jboss Seam,发现它是用Java EE开发的非常有效的方式(利用EJB3,Hibernate,Facelets)。我也做了一些奇怪的PHP编码,可以老实说,我对Seam的工作效率更高(虽然这可能也表明了我的PHP技能。)
对我来说,有几个亮点是:
IDE和命令行中有工具以类似于RoR的方式构建框架代码。
答案 11 :(得分:0)
我会选择用Scala编写的Lift framework。通过切换到Scala,您将看到极大的生产力提升。 Scala也非常稳定,从Scala代码调用Java代码非常容易。不仅如此,它与Java非常相似,但增加了一些功能。对于某些示例,您应该参考5 Things a Java developer needs to know about Scala. Twitter将其部分代码库移至Scala。
你永远不会“卡在”一段代码上,因为你可以考虑如何在Java中编写它并编写类似的代码。一流的功能和演员将为您提供更高的生产力提升,并且都在Scala中。 Scala当然是静态类型的,其性能与Java类似。
我将引用Lift框架的作者来描述它:
提升借鉴现有的优势 框架,提供
- Seaside的高度细化的会话和安全Rails快速闪存到
- Django“不仅包括CRUD”
- Wicket设计师友好的模板风格(见Lift View
第一)因为Lift应用程序是 用Scala编写,一个优雅的新JVM 语言,你仍然可以使用你的 最喜欢的Java库并部署到 你最喜欢的Servlet容器。使用 您已编写的代码和 部署到你已经拥有的容器 配置!
答案 12 :(得分:0)
一些基本规则:
Kick out the appserver - 在转变和质量方面取得巨大成功。如果必须,请保留一个Web容器,但在Spring和/或Hibernate中配置所有内容,以使web.xml最小化。
测试所有内容,您现在可以执行第1步(不需要部署时XML或代码生成:所有内容都已在开发中配置)。
使用Wicket实现您的Web层 - 没有人需要JSP了; Wicket的效率提高了10倍,而且易于测试(参见步骤2)。
使用SCRUM和敏捷开发方法
结果是Java生产力高达4GL允许 - 我们在Atomikos有几个我们这样做的迁移项目。因为我们从4GL平台迁移到Java / Java EE,所以我们可以比较两者中的估计。
另请参阅此博文: http://blog.atomikos.com/?p=87
HTH
盖
答案 13 :(得分:-1)
好吧,我不是一个真正的Java人,所以我不能说太多,除了...... JSF
我们试图使用它一段时间,这是一场灾难。 Almots所有基本步骤必须通过很多痛苦,没有文档,没有示例,没有社区知识。我们使用了Eclipse的一个插件(Exadel Studio),我们看了一些其他的JSF框架,它们都是不兼容的,文档很少。事实上,在我们尝试过的所有内容中,只有Sun框架(忘记了它的名称,基于NetBeans)才能创建一个新的JSF项目,甚至可以开箱即用。其余的需要多天配置apache和其他东西,对于没有经验的人来说这是一个真正的挑战(虽然我管理它)。
我们的团队花了几个月的时间用ASP.NET完成了几周后的工作。人们对JSF和ASP.NET都缺乏经验。
如果JSF生态系统仍然像2007年一样糟糕,我建议完全避免它,无论如何,生产力是不可能的。也许坚持使用JSP或经过时间验证和发展良好的东西?