如何在Web应用程序中使用EJB和Servlet的首选方式是什么?

4

我正在尝试熟悉JavaEE,但对于每个"组件"(缺乏更好的词汇)的目的存在一些困惑:Session Bean和Servlet以及它们如何正确地与Web应用程序(客户端JavaScript)交互。

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

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

发送请求时,我是向Servlet(使用EJB),还是通过WSDL向Session Bean发送请求?我应该如何使用其中一种方法来维护该用户的“状态”? 我假设使用@Stateful注释很容易使Session Bean完成此任务。

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


3
看起来你并不确定你想要问什么?我建议阅读Java EE教程:http://download.oracle.com/javaee/6/tutorial/doc/ 非常适合初学者,阅读后你将熟悉所有“组件”,并知道如何构建示例应用程序。 - peshkira
(会话Bean是EJB中的子Bean)请求不直接与会话Bean通信(模型),它们可以通过Servlet(控制器)进行通信,如果您想要探索“EJB”。无论如何,在典型的JEE应用程序中,Servlet将从浏览器接收您的请求,如果您想使用EJB,则可以使用它。这是一个选择,否则可以通过JSP和Servlet使用数据库查询,并通过Servlet将响应返回给浏览器,对于此用例,WSDL和SOAP是不相关的。 - static void main
3个回答

3
Java Enterprise Edition教程涵盖了你提出的几乎所有主题,包括不同种类的bean类型的目的,如何实现Web服务,如何实现身份验证等等。
我强烈建议你花时间构建示例应用程序,特别是如果你完全是新手。重要的是要建立对核心概念的良好理解,因为由于组成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类型及其目的。

1

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

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

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

在n层应用程序中,所有上述技术都应仅包含表示层。此表示层与业务层通信,在业务层中发生真正的业务逻辑,使用事务访问数据库,消息系统等。这个业务层是使用EJB的地方。


0
你可以按照以下步骤创建基本架构:
创建EAR而不是两个不同的项目,如EJB Jar和Web应用程序WAR。
你可以创建调用某些委托类的servlet,该委托类具有引用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){
        }
    }

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