为什么在Java中使用RESTful服务框架而不是普通的servlet
我知道在Java中可以使用哪些库来实现RESTful服务有一些问题,但是在普通实现中使用它们有什么价值呢。我是说,如果我想创造为什么在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中的参数,而不是学习、实现和配置这些库中的一个来为您完成这项
- www.example.com/images
- www.example.com/images/id/num
- www.example.com/images/tag/num
- www.example.com/images/tag/num/num/num
- (流行)
- (JAX-RS的先驱)
@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确实有很大帮助