Servlet与REST

时间:2012-09-21 07:07:57

标签: java rest servlets

我需要在服务器端创建5个方法,这将使用二进制数据。远程客户端是applet和JavaScript。客户端将文件发送到服务器,服务器必须解析这些文件,然后将响应作为XML / JSON返回。

所以我很困惑 - 在这种情况下使用REST服务是一种好习惯吗?或者我应该使用servlet?

我的同事告诉我:

  

“创建仅由一个应用程序使用的REST服务不是   好。只有在许多应用程序使用REST时,才能创建REST。和   REST比servlet有一些缺点:REST比servlet慢;   编写线程安全的REST比servlet“

更难

但是,我看到使用Servlet的一些缺点:我需要发送一个我想要调用的函数名(即作为额外的HTTP参数发送函数名) 然后在doPost方法内部执行以下开关:

switch(functionName) {
 case "function1":
   function1(); 
   break;
 case "function2"
   function2(); 
   break;
//.... more `case` statements....

}

在REST的情况下,我可以简单地为不同的功能使用不同的URL。 此外,在REST的情况下,从服务器返回JSON / XML更方便。

7 个答案:

答案 0 :(得分:37)

你在这里混淆了两个范例:

  • REST是一种软件架构“风格”;
  • Servlet是一种服务器端技术。

例如,您可以使用Servlet实现类似REST的服务。

答案 1 :(得分:25)

那么, 我不同意你的同事的意见,只有一个应用程序休息是不好的,因为你可能决定将来使用相同的rest api进行不同的应用程序。如果我是你,我会选择纯REST。为什么呢?

  1. 如果你正在使用一些框架进行休息实现(让我们说apache cxfjersey)你会得到很多开箱即用的东西 - 你写POJO你得到休息,你得到序列化和反序列化,比方说来说,开箱即用的JSON对象(最终你需要实现一些JsonProviders,但这不是什么大问题。)

  2. 工作直观(如果您设计好其他API)。

  3. JavaScript客户端非常容易使用(特别是如果你使用的是JQuery或类似的东西)

  4. 但是,它很大程度上取决于你想要做什么,如果你有一些强大的事务逻辑,其余的可能会非常棘手。如果您只打算执行POST请求(不使用其他HTTP方法),您可能希望使用Servlet,因为您不必使用其他框架并创建更多依赖项。请注意,REST或多或少是一个体系结构概念,它与Servlet技术并不矛盾,如果你足够顽固,你只能使用servlet进行休息api :-)。 希望我帮了。

答案 2 :(得分:4)

首先,你说的是两种不同的范例。这有点像苹果和橘子。

REST是一种使用HTTP操作(GET,PUT等)来读取和写入资源状态的服务样式。将资源视为“名词”和“事物”。

另一方面,Servlet是Sun Microsystems最初提供的用于将HTTP请求连接到自定义Java代码的软件规范。 Servlet经常用方法调用来说:“动词”和“动作”。

由于您的问题意味着您正在寻求处理input->输出方法,因此只需要一个普通的servlet来完成这项工作。

答案 3 :(得分:3)

我在使用Jersey和创建REST服务时看不到任何问题。我知道我是一个REST-taliban,但使用JAX-RS实现这种架构非常简单,所以......为什么不呢?

你的同事说:“只有在许多应用程序使用REST时才能创建REST”,但我看不出这是怎么回事。为什么我不能为单个应用程序创建REST服务?

答案 4 :(得分:2)

听起来你的同事正在应用过早的优化。如果您可以快速使用JAX-RS库编写它,那么这样做......如果它被证明只是瓶颈,那么您是否需要花时间重写为servlet。

根据我的经验,JAX-RS的性能开销不足以证明直接在servlet中编写等效项的开发和维护开销,其中问题很好地映射到JAX-RS

答案 5 :(得分:1)

根据您的容器版本,Jersey(或任何其他JAX-RS实现)仍将使用Servlet将请求分派给相应的处理程序。

如果您的应用程序真的是RESTful,那么JAX-RS将按您的需要进行操作。否则,请考虑使用FrontController来解释请求并将其转发到适当的处理程序。

另外,不要将XML或JSON与REST混淆。您将在大多数(如果不是全部)JAX-RS实现中免费获得这些,但这些实现仍然将内容编组委托给其他库(例如JAXB)。

答案 6 :(得分:1)

这是类似的链接。他用简单的servlet完成了它 http://software.danielwatrous.com/restful-java-servlet/