为什么在Java中使用RESTful服务框架而不是普通的servlet

为什么在Java中使用RESTful服务框架而不是普通的servlet,java,rest,jersey,Java,Rest,Jersey,我知道在Java中可以使用哪些库来实现RESTful服务有一些问题,但是在普通实现中使用它们有什么价值呢。我是说,如果我想创造 www.example.com/images www.example.com/images/id/num www.example.com/images/tag/num www.example.com/images/tag/num/num/num 将url模式/图像映射到servlet并有一两行代码解析url中的参数,而不是学习、实现和配置这些库中的一个来为您完成这项

我知道在Java中可以使用哪些库来实现RESTful服务有一些问题,但是在普通实现中使用它们有什么价值呢。我是说,如果我想创造

  • www.example.com/images
  • www.example.com/images/id/num
  • www.example.com/images/tag/num
  • www.example.com/images/tag/num/num/num
将url模式/图像映射到servlet并有一两行代码解析url中的参数,而不是学习、实现和配置这些库中的一个来为您完成这项工作,这不是更容易(对于未来的开发人员)也更快(实现和学习)吗

  • (流行)
  • (JAX-RS的先驱)
基本上我要问的是。。。使用RESTful Java框架的价值是什么?在实现过程中,对于一个简单的问题,它不会增加很多复杂性吗

编辑:这段泽西代码处理得非常整洁,如果每个人都在寻找库来为自己做这件事,那么他们应该知道如何以servlet的形式做这件事

@Path("/helloworld")
public class HelloWorldResource {

    // The Java method will process HTTP GET requests
    @GET
    // The Java method will produce content identified by the MIME Media
    // type "text/plain"
    @Produces("text/plain")
    public String helloWorld() {
        // Return some cliched textual content
        return "Hello World";
    }
}

如果您所要做的只是一个“服务”,它返回由URL参数驱动的文本,那么纯文本返回是必要的吗?

JAX-RS是一个设计非常好的API,它可以将HTTP请求映射到方法,从HTTP请求的各个部分提取参数,处理内容协商,和许多其他低级任务都非常简单


使用JAX-RS,主要是通过ApacheCXF,已经有两年了,我总是更喜欢它而不是普通的servlet。

框架被用来让您的任务更简单。我同意我们可以通过实现servlet,然后解析url,然后实现基本逻辑来做同样的事情

如果您使用的是jersey这样的框架,那么您就不必担心那些解析模式和其他类似的任务。ServletContainer类将处理这个问题(解析其服务方法中的url),还有许多其他类也将使您的任务更容易

还有一件事,我们只考虑一个场景(匹配模式),但当我们的需求增长时,由我们自己的servlet编写的相同代码将变得更加复杂

将url模式
/images
映射到servlet,并用一两行代码解析参数的url,而不是学习、实现和配置这些库中的一个来为您完成这项工作,这不是更容易(对于未来的开发人员)也更快(实现和学习)吗。

容易些?写起来肯定不容易——你必须自己做所有的路径提取,所有的方法处理,所有的内容类型协商(在两个方向上),所有的cookie处理和对象反序列化/序列化,还有,很多低级的东西都需要测试和调试,或者更容易维护,因为JAX-RS接口允许您在资源级别(RESTful webapps的自然特性)而不是请求级别进行操作;凭借丰富的经验,当概念模型和实现之间的差距最小时,维护是最容易的。它的实现速度也不快(因为JAX-RS的低级实现已经为您进行了测试和调试;您需要做的事情更少),而且学习它的成本也不高,因为它是一个基本上是声明式的API,很少有意外

好吧,当你只处理简单的网络应用程序时,这些好处似乎并不多。毕竟,你可以在很短的时间内搞定一些事情,并将结果发布到网上。然后,你必须祈祷自己做对了,没有重大的意外漏洞或拒绝服务攻击。维护程序员必须明白,在添加小功能或修复bug时,您在代码中使用的正则表达式会做什么(祝您好运!)。但随着webapp变得越来越大,拥有一个经过测试的库来处理所有低级内容的好处确实会胜出


(在您提问之前,您提到的一些库会愉快地将自己安装为servlet;这允许您的代码只描述servlet的业务逻辑,并以抽象的术语声明如何映射到wire。这非常简单。)

在这种情况下,我会使用Jersey或库,如果它执行以下操作(添加足够的值):

  • URL的配置在一个文件中都是自包含的,包含源代码
  • 没有隐藏的配置文件或过于详细的配置(例如web.xml)
  • 参数很好地映射到强类型变量(例如,使用注释)
  • 不需要进行卷积以获得参数值(例如)
  • 运行库的开销很低(我在其他库中使用反射解决方案的经验不好)
  • 这是有据可查的
  • 它被广泛采用

在这种情况下,我发现使用库将为我的项目增加使用它所需的工作的价值。Jersey似乎确实充分满足了这些需求,尽管我还没有对其他框架进行足够的调查。

但是,对于每个开发人员来说,学习、实现和理解的时间是值得的。我的意思是这能节省时间吗?这真的更简单吗?如果只是提取参数,那么更接近Java标准肯定会更容易。在servlet中提取参数相当简单。我觉得对于它提供的价值来说,它可能会增加太多的复杂性。你不应该只想提取参数。您需要设置HTTP响应代码,将传入和传出实体映射到对象,以及其他内容。是的,JAX-RS对此很有帮助。@avanderw也许你的体验只是简单的Web应用,因为我从我的经验中知道,它对mo确实有很大帮助