将EJB和Servlet用于Web应用程序的首选方法是什么?

我正在努力熟悉JavaEE。 我对每个“组件”(缺少一个更好的词)的目的有点困惑:Session Beans和Servlets,以及它们如何与Web应用程序(客户端JavaScript)正确交互。

为了理解这一点,我正在构建一个简单的Web应用程序。 使用每个组件构建类似于以下内容的首选方法是什么:

  1. 用户访问“登录”页面
  2. 用户输入数据和点击提交。 然后我用AJAX发送请求以登录用户。
  3. 然后,服务器端validation用户输入并“记录”用户(返回用户配置文件等)

发送请求时,是将其发送到Servlet(使用EJB)还是通过WSDL发送到会话Bean? 如何使用这两种方法为该用户维护“状态”? 我认为使用Session Beans就像使用@Stateful注释它一样简单。

此外,我假设从客户端发送的请求必须是SOAP格式。 使用更轻量级的东西(比如JSON)有多容易? 虽然我更喜欢使用轻量级的东西,但是如果SOAP使开发更快/更容易,则没有必要。

Java Enterprise Edition教程几乎涉及您提出的所有主题; 不同类型的bean类型的目的是什么,如何实现Web服务,如何实现身份validation等。

我强烈建议您花时间构建示例应用程序,特别是如果您刚刚了解Java Enterprise Edition(Java EE)。 重要的是要建立对核心概念的良好理解,因为由于包含Java EE的技术和标准的广度和深度,很难知道在开始时应该关注什么。

要记住的一件事是,尽管Java EE确实试图支持最佳实践并支持设计和开发安全的企业应用程序,这些应用程序可以很好地执行和扩展,但它并没有规定或限制企业应用程序遵循一种特定的协议,数据格式和企业应用设计模式。 核心框架实现可以更好地支持某些协议和格式,有些选择依赖于供应商,但很少有特定的技术选择被锁定在规范中。

为了回答您的一些具体问题,Java EE对SOAP有很好的支持,但它不会优先考虑也不会将Web服务限制为SOAP协议。 使用JAXB和JAX-RS,开发接受和返回XML或JSON或两者的RESTful Web服务同样容易。 由您决定是否需要使用SOAP,REST或其他协议。

您是否希望使用JAX-RS等框架或显式开发Servlet来处理HTTP请求和响应,这也是您的选择。 在许多情况下,JAX-RS将拥有您需要的一切,这意味着您将能够将您的Web服务实现为带有一些注释的普通旧Java方法,而无需为编组和解组内容和参数而烦恼。

同样,使用JAXB,您是否要使用WSDL取决于您。 如果你有WSDL定义,这很好,但如果你没有。

在许多情况下,您通常会使用Java持久性架构框架(JPA)维护状态,并通过无状态会话bean访问和操作此类数据。 刚接触Java EE的开发人员经常试图使用有状态会话bean来维护在持久存储中更好地管理的状态。 本教程将向您介绍不同类型的bean类型及其用途。

Web服务(WSDL,SOAP等)通常用于应用程序之间的通信。

在单个Web应用程序中,您通常使用AJAX进行简单的GET / POST请求,并接收完整的HTML页面,或HTML(AJAX)的片段,或XML或JSON数据(AJAX)。 浏览器通常与servlet通信,但很少直接使用servlet。

通常的方法是在servlet之上使用框架。 框架可以分为两大类:基于动作的框架(Stripes,Spring MVC,Struts等)或基于组件的框架(JSF,Wicket,Tapestry等)。

在n层应用程序中,所有上述技术都应该只包含表示层。 此表示层与实际业务逻辑发生的业务层进行通信,其中事务用于访问数据库,消息传递系统等。此业务层是使用EJB的位置。

您可以按如下方式创建基本架构:

创建EAR instread两个不同的项目,如EJB Jar和Web Application WAR

您可以创建servlet来调用某个委托类,该委托类具有通过将其作为远程调用/通过在委托类中使用@EJB批注来调用EJB的逻辑来重新构造EJB。

ServletClass { do/post(){ DelegateClass d = new DelegateClass(); d.callMethod(withParam); } } DelegateClass { @EJB EJBlocalinterface ejbintance; void callMethod(DefinPrarm){ ejbinstance.callEJBMethod(); } } @Statelss EJBbeanClass implements EJBlocalinterface{ void callEJBmethod(someParam){ } }