- Java 双重比较
- java - 比较器与 Apache BeanComparator
- Objective-C 完成 block 导致额外的方法调用?
- database - RESTful URI 是否应该公开数据库主键?
我真的很困惑。我已经尝试使用带有 tomcat 的 Jax-rs 并使用所有注释,我能够使用 url
调用我的服务。因此,如果没有 Jax-rs,我可以简单地拥有一个 servlet 并调用我的服务。同样,正如我所尝试的那样,有带有 Jersey 的 jax-rs(因为我研究了它的 JAX-RS
实现)并且在 web.xml 中有以下内容。
<!DOCTYPE web-app PUBLIC
"-//Sun Microsystems, Inc.//DTD Web Application 2.3//EN"
"http://java.sun.com/dtd/web-app_2_3.dtd" >
<web-app>
<display-name>OutputUi</display-name>
<servlet>
<servlet-name>jersey-serlvet</servlet-name>
<servlet-class>
com.sun.jersey.spi.container.servlet.ServletContainer
</servlet-class>
<init-param>
<param-name>com.sun.jersey.config.property.packages</param-name>
<param-value>org.xxx.carbon.servlet</param-value>
</init-param>
<load-on-startup>1</load-on-startup>
</servlet>
<servlet-mapping>
<servlet-name>jersey-serlvet</servlet-name>
<url-pattern>/*</url-pattern>
</servlet-mapping>
</web-app>
然后我有与 JAX-RS 相同的注释,在 GET 上我可以使用正确的 URL 调用我的服务。
我的问题是,为什么 Jersey 使用 servlet? JAX-RS
不使用 servlet 吗?为什么要使用 JAX-RS
,而我们可以只使用 Servlet。
最佳答案
JAX-RS 指定了一个围绕 Servlets 的部署模型[1]。为什么,因为在 Java 世界中,Web 应用程序就是这样运行的。请求进入 Servlet 容器(如 Tomcat 或完整 Java EE 服务器中的容器),容器将请求传递给 Servlet 应用程序,应用程序处理请求并将响应吐回容器,容器将其发送给客户。 Spring MVC 是一个基于 Servlet 的框架(主要 Servlet 是 DispatcherServlet
)。 JSF 是一个基于 Servlet 的框架(主要 Servlet 是 FacesServlet
)。 JAX-RS 也是围绕 Servlet 构建的(主要 Servlet 是特定于实现的;在 Jersey 的情况下,它是 ServletContainer
)。
请求进入 Tomcat,它查找 servlet 映射,它发现 ServletContainer
与请求 URL 匹配,它将请求包装在 HttpServletRequest
中并将其发送到 Jersey Servlet。现在 Jersey 可以随心所欲地处理它,这是一大堆处理;例如处理请求以匹配您的方法[2]、反序列化实体主体,以及一大堆其他使所有魔法成为可能的东西。完成处理后,它将响应发送回容器。
why jersey using a servlet?
我认为上面已经说得很清楚了。
JAX-RS not using a servlet?
不太确定我是否真的理解您的要求,但 JAX-RS 指定了其他部署模型,但 Servlet 环境是唯一具有任何特定要求详细信息的环境。其他部署选项(例如在 SE 环境中)将特定于实现[1]。
Why using JAX-RS, while we can use a just Servlet
您基本上是在问,“当我可以实现自己的 REST 框架时,我为什么要使用 JAX-RS?”。通常,当有可用的框架时,就使用它。如果您觉得自己可以做得更好,那就去做吧。
[1] - 参见 2.3 Publication
[2] - 请参阅 3.7 Matching Requests to Resource Methods
因此,部分 OP 的部分困惑是,他正在学习的教程没有在 web.xml 文件中指定 Servlet,这让 OP 认为“vanilla JAX-RS” (不存在)正在被使用,而不是实现。
JAX-RS 只是一个规范,没有实现就无法运行。是的,有一个 javax.ws.rx-api.jar
或一个 javaee-api.jar
具有要编译 一个 JAX-RS 应用程序,但此 jar 中没有实际的“引擎”。实际的 JAX-RS“引擎”在特定的实现 jar 中。
我没有看过完整的教程,但我假设它使用了上述 jar 之一,这导致 OP 认为没有使用 JAX-RS 实现。但实际上,使用的 Java EE 服务器(即 Glassfish)在内部具有实现。对于 Glassfish,它是 Jersey。
另一个混淆点可能出现在应用程序配置中。不像在 OP 的帖子中那样使用 web.xml,而是使用了一个 Application
子类。有点像
@ApplicationPath("/rest")
public class AppConfig extends Application {
...
}
JAX-RS 规范指出,当带有注解的此类可用时,应使用上述完全限定的类名作为 Servlet 名称创建一个 Servlet,并且 url 映射为 @ApplicationPath 中的值
。因此,无论您使用什么实现,这种行为都应该是相同的。
关于java - 与 JAX-RS 混淆,Jersey 与 JAX-RS 混淆,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/29149650/
Apache CXF 可以完成任务。但我想在没有任何 spring 依赖的情况下组合它。提前谢谢你! 最佳答案 JAX-WS 和 JAX-RS 都是 Java EE 6 的一部分.因此,您可以在不使用
Apache CXF 可以完成任务。但我想在没有任何 spring 依赖的情况下组合它。提前谢谢你! 最佳答案 JAX-WS 和 JAX-RS 都是 Java EE 6 的一部分.因此,您可以在不使用
所以我的意思是你有一个分类特征 $X$(假设你已经把它变成了整数)并说你想使用特征 $A$ 将它嵌入到某个维度中,其中 $A$ 是 arity x n_embed . 通常的做法是什么?使用 for
所以我的意思是你有一个分类特征 $X$(假设你已经把它变成了整数)并说你想使用特征 $A$ 将它嵌入到某个维度中,其中 $A$ 是 arity x n_embed . 通常的做法是什么?使用 for
我知道网上有很多文档主要描述技术差异。 但是我很想知道您更喜欢一种特定类型而不是其他类型的常见用例是什么? 这些偏好是因为集成模式/产品支持特定类型吗? 最佳答案 谢谢你的回答。然而实际用例差异以及何
我想将 CXF 与 Google Guice 集成。我已经在我的项目中使用 Guice,并且我想避免添加额外的依赖项。 CXF 是我的选择,因为要求之一是能够向服务用户提供 XML、JSON、JSON
来自 JSR-339: For simplicity, JAX-RS implementations are NOT REQUIRED to support processing groups oth
我开始使用 JAX WS 研究 Java Web 服务。我正在阅读的书的第一章展示了如何仅使用 java SE 构建和部署简单的 jax ws web 服务。特别是,Web 服务是通过 Endpoin
在 JAX 的快速入门教程中,我发现可以使用以下代码行为可微函数 fun 高效地计算 Hessian 矩阵: from jax import jacfwd, jacrev def hessian(fu
JAX-RS 提供了 StreamingOutput 接口(interface),我们可以实现它来对我们的响应主体进行原始流处理。 public interface StreamingOutput {
有没有办法获得java.lang.reflect.Method为给定的 @Path 调用的方法(用 HttpServletRequest 注释) ? 这是我的用例:我在 Java EE 中 Filte
我接到了一家公司的任务,该任务向我发送了一台已完成所有设置的虚拟机。任务是我必须创建一个 API 来从数据库中检索人员详细信息并显示它。 问题是,当我运行应用程序时,服务器返回一个包含 hello w
我有一个 POST 方法调用,它接受很少的表单参数。我希望 JAX-RS 能够处理不存在特定表单参数的情况。 示例: @POST @Produces (MediaType.APPLICATION_JS
我有 JAX-RS 网络应用程序,我想记录从获取请求到响应的时间量。在带有 servlet 过滤器的 Spring Boot 中很容易。但是我的应用程序中的过滤器无法正常工作: @Provider p
使用以下网址。 http://doma.in/context/resource/some/.../undefined 我想获取 ../resource 之后的路径名,即 /some/.../undef
我编写了 2 个 Web 服务,一个使用 Jax-WS,一个使用 Jax-RPC。他们只是返回一个字符串。 我使用 jMeter 进行了压力测试,奇怪的是,Jax-RPC 速度更快。 我什么时候才能在
我花了几个小时在嵌入式 Jetty 9.1.0.v20131115 和 RESTEasy 3.0.5.Final 中安装自定义登录服务。我的登录服务将在数据库中查找用户并为他们分配角色。它看起来像这样
有没有办法操纵jaxws中使用的编码器。 我喜欢发送一个在网络服务请求中提交的 cdata,为此我想在这里尝试类似描述的东西:http://odedpeer.blogspot.de/2010/07/j
我想从 java 服务器 (Restful Jax-rs) 发送图像。我的客户是安卓。 @GET public Response getUserImage() { byte[] image =new
我对网络服务很陌生。我找不到 JAX-WS 和 CXF 之间的区别。 据我了解,JAX-WS是java提供的规范,CXF是实现。 如果我错了,请纠正我。 最佳答案 是的,你是对的。 JAX-WS 是基
我是一名优秀的程序员,十分优秀!