对不起,这个问题听起来很愚蠢,但在使用Jersey开发我的一些RESTful服务后,我问自己一个问题 - 如果REST只是一个架构,而不是像SOAP这样的协议,为什么我们需要像JAX-RS这样的规范?
我实际上搜索了诸如"通过HTTP在servlet和RESTful服务之间有什么区别"之类的问题,并总结了社区的答案,我得到了:
RESTful服务开发(在Jersey上)是一种体系结构,它本质上使用servlet.
像Jersey这样的JAX-RS兼容工具提供了简单的编组 - 解组XML/JSON数据,帮助开发人员.
REST帮助我们以比普通servlet更高效的方式使用GET/POST/PUT/DELETE.
根据这些答案,我想如果我编写一个使用JAXB的servlet(用于处理自动序列化),并且我在servlet代码中有效地使用GET/POST/PUT/DELETE,我不使用像Jersey这样的工具,因此JAX-RS.
我知道通过这个声明我非常错误,请纠正我.
PS:当我不得不在PHP中开发一些RESTful服务时,实际上出现了这种疑问.在继续浏览一些RESTful PHP代码之后,我意识到它们只是相同的旧PHP脚本,并且有一些辅助方法来处理XML/JSON.
为什么要使用JAX-RS/Jersey?
简答
因为在使RESTful服务的开发更容易.
答案很长
JAX-RS是一种标准,可以轻松创建可部署到任何Java应用程序服务器的RESTful服务:GlassFish,WebLogic,WebSphere,JBoss等.
JAX-RS是Java EE的一部分,当JAX-RS与其他Java EE技术一起使用时,创建RESTful服务变得更加容易:
EJB - 会话bean用作服务实现,还处理事务语义.
JAX-RS - 用于将会话bean公开为RESTful服务
JPA - 用于将POJO持久保存到数据库中.注意如何将EntityManager注入到会话bean中.
JAXB - 用于将POJO转换为XML或从XML转换(在GlassFish中它也可用于将POJO转换为JSON或从JSON转换).默认情况下,JAX-RS处理与JAXB实现的交互.
JAX-RS服务示例
package org.example;
import java.util.List;
import javax.ejb.*;
import javax.persistence.*;
import javax.ws.rs.*;
import javax.ws.rs.core.MediaType;
@Stateless
@LocalBean
@Path("/customers")
public class CustomerService {
@PersistenceContext(unitName="CustomerService",
type=PersistenceContextType.TRANSACTION)
EntityManager entityManager;
@POST
@Consumes(MediaType.APPLICATION_XML)
public void create(Customer customer) {
entityManager.persist(customer);
}
@GET
@Produces(MediaType.APPLICATION_XML)
@Path("{id}")
public Customer read(@PathParam("id") long id) {
return entityManager.find(Customer.class, id);
}
@PUT
@Consumes(MediaType.APPLICATION_XML)
public void update(Customer customer) {
entityManager.merge(customer);
}
@DELETE
@Path("{id}")
public void delete(@PathParam("id") long id) {
Customer customer = read(id);
if(null != customer) {
entityManager.remove(customer);
}
}
@GET
@Produces(MediaType.APPLICATION_XML)
@Path("findCustomersByCity/{city}")
public List findCustomersByCity(@PathParam("city") String city) {
Query query = entityManager.createNamedQuery("findCustomersByCity");
query.setParameter("city", city);
return query.getResultList();
}
}
欲获得更多信息:
http://blog.bdoughan.com/2010/08/creating-restful-web-service-part-45.html
REST是一种体系结构,本质上使用servlet.
不它不是.REST是一种体系结构样式,可以使用servlet实现,但本身并不使用它们,也不一定与Java有任何关系.
JAX-RS是一个JSR规范,用于为RESTful Web服务定义Java API.
Jersey是JAX-RS的特定实现.
至于是否使用Jersey或尝试符合JAX-RS规范,这取决于您.如果它让你的工作更轻松,那太好了!如果不是没有人强迫你.