我已经在LAMP堆栈中进行了几年的开发,我一直在阅读有关JSF以及组件库RichFaces和IceFaces的内容.从支持AJAX的组件构建网站UI的整个想法,并获得各种漂亮的东西,如验证,以及免费的混乱AJAX调用真的很令人兴奋.
问题是我很难理解通用组件构成Java EE堆栈的原因.根据我的研究,您似乎有以下类别来构建“Java EE堆栈”:
Java EE应用服务器 – JBoss,Tomcat
数据库抽象 – Hibernate,JPA
支持JSF Ajax的组件库 – ICEFaces,RICHFaces
我觉得我肯定错过了一些东西.我不确定Seam或Spring适合这个. Hibernate也是使用JPA的东西吗?或者JPA是一个功能齐全的API,我可以轻松使用它?容器在哪里适合这个?我可以出去找一个容器在我的Java EE应用服务器上运行吗?此外,Maven在哪里适合所有这些?从我收集的内容来看,它似乎不是Web服务堆栈的一部分,而是在部署之前使用的工具.
我一直在阅读Rainer Eschen的ICEfaces 1.8,这个图由他作为一种Java EE堆栈呈现.我的猜测是AppFuse是针对Java EE的,因为XAMPP是针对LAMP的.真的吗?如果有人可以分解下图中的各个部分以及它们如何组合在一起,那将非常有用.
ICEcube Architecture Diagram http://img191.imageshack.us/img191/336/icecubearchitecture.png
我知道这些是各种各样的问题.如果我没有问你认为我应该知道的事情,请随意把它丢掉,或者如果我说错了,请纠正我! Java EE堆栈以及与它一起使用的所有部分至少可以说是令人生畏的.在我深入研究并开始构建任何东西之前,我只是希望能够很好地处理高级视图.
谢谢!
解决方法
这可能有用(或不:):
> Java EE是托管运行时系统. (LAMP没有这样的顾虑.)
> Java EE使用组件 – 容器通用体系结构(LAMP未定义显式组件容器API)
> JBoss,Glassfish等应用程序服务器提供Java EE容器. (Tomcat不支持完整的Java EE堆栈.Tomcat和Jetty仅提供Web容器(或每个最新规范的Web配置文件.))
>请注意,Java EE Web容器(Servlet)比完整的Java EE堆栈简单得多,但它们基于相同的架构方法.
> Java EE的Web组件(基本上)是Servlet和过滤器.在此体系结构之上构建了各种高阶框架(例如Faces). Java EE Web容器相对简单且非常有效.它是最接近LAMP的东西.
> Java EE的企业组件(由诸如GlassFish的Java EE应用程序服务器支持)是各种类型的无状态,有状态和持久性组件(在Java领域中称为“Bean”).
> Hibernate是一个ORM,在完整Java EE(例如EntityBeans)的上下文中是多余的.通常,JPA与Web容器“Java EE”系统一起使用,以连接到后端JDBC兼容的RDMBS. Oracle,MysqL等等.
>您(和/或某些第三方库)提供组件.
>托管运行时主要关注处理事务完整性等“正交”“企业”“关注点”,组件/应用程序编写者应该关注“业务逻辑”.
> Java EE管理组件的引用,事务边界,连接和生命周期.
>参考文献:使用语义参考通过名称空间机制JNDI和RMI在运行时查找;和通过声明性部署描述符的依赖注入.
>生命周期:您的组件将具有正确的启动,工作和关闭阶段.您可以挂钩这些LC事件并在必要时参与(通常不是必需的).这种形式化的LC允许分布和缩放架构.
>连接:广泛地解决传入(客户端)和内部(EIS)集成点.对于客户端,您有web / RMI / JMS等.这为您提供同步req / rep语义和异步fire and forget.对于后端(通常),JCA指定连接到其他系统的连接器. JPA是JCA的专门化(理论上不是实践),它专门用JDBC用户API来处理数据库EIS.
>事务:声明表示将事务语义应用于组件的特定方法.这可以在设计时(通过注释)或在部署时(通过XML)完成.
部署包
Java EE系统通常打包为WAR(仅适用于Web)或EAR(适用于完整堆栈).
部署描述符
Java EE的最新规范支持使用合理默认值(或普通映射)的零配置操作.但是,重要的是要了解这是什么,在某些时候,任何严肃的Java EE应用程序都需要在某种程度上处理这些工件. (对于web.xml来说要容易得多,所以不要惊慌失措.)这是架构的一个关键方面.理解这一点,其他一切都很清楚.
Java EE使用间接使其神奇发生.这是这里要解决的问题:
我们有一些第三方编写的组件(前一段时间),我们需要在我们的应用程序中使用它们.部署描述符允许映射特定于应用程序的语义,例如:组件的名称或其对组件通用语义的事务语义.例如,您可能希望将“Acme-Logger”公开为“My-Very-Own-Logger”.您可以通过将所需的环境名称映射到组件的类来实现此目的. (原始组件可能有一个注释,声明其通用名称只是“the-logger”).
实际上,Spring是由于创建和维护这些映射描述符的严重痛苦而产生的.同样,Spring是基于容器的系统的替代方法.
集装箱
从理论上讲,您应该能够将整个容器插入兼容的服务器,但一般的想法是您正在为通用容器编写组件,例如: Java EE容器.无论如何,正如您所想象的那样,Java EE应用服务器的供应商并不太热衷于为堆栈提供可插入的容器API,因为它会使他们的产品成为完整的商品.
弹簧
Spring实际上是Java EE的反驳论文.它(或者是)是一个轻量级的容器系统来解决J2EE的难点(如果没有有效的工具,这是完全不合理的,考虑到精心设计的架构和部署仪式).实际上,Servlet前端和Spring容器是完整的Java EE堆栈的替代品.也就是说,它们可以共存.
Maven的
Maven是一个构建工具.还有蚂蚁.或者你可以跳上Gradle.存在Maven原型,允许您轻松地开始使用基本的Java EE项目.
建议:
从(并坚持使用)Web容器子集开始. Jetty或Tomcat是容器/服务器的不错选择.
了解WEB-INF /和web.xml.编写一个简单的HTTPServlet扩展,并使用web.xml的功能.尝试设置过滤器,或将一些参数绑定到Web应用程序上下文中.掌握这些基础知识.其他一切都建立在这些之上.一切.
在servlet中,浏览提供的API.了解应用程序,会话和请求“上下文”之间的区别. Web层中的关键问题.了解如何重定向请求.获取http标头等.其他所有内容都基于这些.掌握这些基础知识.
让我们说你现在有了你的HelloWorld网络应用程序.下一步,尝试JPA并为项目添加持久性.在这里您可以尝试Spring / Hibernate / Tomcat教程示例. Spring将为您的业务组件(类)设置非Java EE容器. Hibernate将负责持久保存您的数据.执行此操作时会引入几个新工件. Spring相关的xml文件和JPA / Hibernate映射.了解这些以及它的全部内容.
你几乎完成.最后,让我们转向视图或演示文稿的问题.这就是Java(imo)很糟糕的地方,因为它太冗长了,而且这个层都是关于put widget的无意义重复,把widget放在那里等等.
在最简单(并且开箱即用)的情况下,您拥有基本的HTTPServlet,并能够发送您想要的任何内容.您可以在代码中编写html(一个非常糟糕的主意),或者使用模板方法(Velocity,FreeMarker),或者使用专门的组件进行演示:JSP,Faces等.实际上有几十个框架(和接近)表示层.
希望这有帮助.