读书笔记《advanced-java-ee-development-with-wildfly》开发JAX-RS 1.1 Web服务
在本章中,我们将讨论 Representational State Transfer(REST) Web 服务,特别是那些基于 Java API 的 RESTful Web 服务 (JAX-RS 1.x),在 JSR 311 (http: //jcp.org/en/jsr/detail?id=311)。新版本的 JAX-RS (2.0) 已经可用,并在 第 9 章,在带有 RESTEasy 的 Java EE 7 中使用 JAX-RS 2.0。首先讨论以前的版本,因为它构成了新版本的基础,也因为许多开发人员仍在使用以前的版本。当新版本可用时,不会迁移到现有应用程序的新版本。 REST 是一种独立于协议、松散耦合的分布式系统软件架构风格。协议无关意味着 REST 支持任何支持表示状态传输的协议,但我们将仅讨论基于 HTTP 的 REST。与 SOAP 相比,REST 的类型不那么强,不需要 XML 解析,也不需要消息头。 RESTful Web 服务基于 REST 原则,简单、轻量、快速。 RESTful Web 服务公开了一组资源,这些资源只是信息的来源,由 HTTP 中的 URI 标识。资源可以是 数据库记录或 Plain Old Java Object ( POJO)例如。交换的不是资源本身,而是资源的表示,通常是 HTML、XML、JSON 和纯文本格式的文档,但它们可以是图像或其他格式。基于资源的表示和包含的元数据,客户端对资源进行更改。
RESTful Web 服务遵循以下 RESTful 原则:
在本章中,我们将使用 Jersey JAX-RS (JSR 311) 参考实现 (RI ) 在 Java 中创建 RESTful Web 服务。本章包含以下部分:
设置环境
创建 Java EE Web 项目
创建示例 RESTful Web 服务
部署 RESTful Web 服务
运行 RESTful Web 服务
创建 Java 客户端
运行 Java 客户端
创建 JSP 客户端
运行 JSP 客户端
WildFly 8.1.0.Final:从
wildfly-8.1.0.Final.zip
下载 <一个类="ulink" href="http://wildfly.org/downloads/" target="_blank">http://wildfly.org/downloads/。MySQL 5.6 数据库社区版:从 http://dev.mysql.com/downloads/mysql/。安装 MySQL 时,请同时安装 Connector/J。
面向 Java EE 开发人员的 Eclipse IDE:从 https://www.eclipse.org/downloads/packages/release/Luna/SR1。
JBoss Tools (Luna) 4.2.0.Final(或最新版本):将此作为插件从 Eclipse Marketplace 安装到 Eclipse(http://tools.jboss.org/downloads/installation.html) .
Apache Maven:从 http://maven.apache.org/download.cgi。
Java 7:从 http://www.oracle.com/technetwork/java/javase/downloads/index.html?ssSourceSiteId=ocomcn。
设置环境变量JAVA_HOME
、JBOSS_HOME
和MAVEN_HOME
。添加%JAVA_HOME%/bin
、%MAVEN_HOME%/bin
和%JBOSS_HOME%/ bin
到 PATH
环境变量。
创建一个 WildFly 8.1.0 运行时,如 第 1 章,EJB 3.x 入门。
在这个 部分,我们将创建一个 Java EE Web 项目。选择文件 | 新 | 其他。在 New 中,选择 JBoss Central | Java EE Web 项目,如此处所示。现在,点击下一步。
要求列表, 包括 m2e 和 m2eclipse-wtp 插件,JBoss Maven Tools 插件如下所示。选中 Create a blank project 复选框并选择 WildFly 8.x Runtime 作为 目标运行时。然后,点击下一步。
指定 项目名称 (jboss-jaxrs
) 和 打包(org.jboss.jaxrs
),然后点击下一步< /span>,如下所示:
指定 组 ID (org. jboss.jaxrs
), 工件 ID (jboss-jaxrs
), 版本(1.0.0
)和包< /strong> (org.jboss.jaxrs
) 并点击 Finish,如此处所示:
jboss-jaxrs
Java EE web 项目显示在 项目浏览器:
在这个 部分中,我们将创建一个 RESTful Web 服务。右键单击 Project ExplorerJAX-RS Web Services 节点span> 并选择 New JAX-RS Resource,如下所示:
选择 jboss-jaxrs
项目并指定Package< /strong> 作为 org.jboss.jaxrs.rest
,Name 作为 < code class="literal">HelloWorldResource, 资源路径 as /helloworld
,并点击Next,如下图所示:
在 JAX-RS Application 窗口中,选择 源文件夹为jboss-jaxrs/src/main/java
并指定< strong>包为org.jboss.jaxrs.rest
,名称
作为 HelloRESTApplication
,应用程序路径 作为 /rest< /code>,然后点击Finish,如下所示:
org.jboss.jaxrs.rest.HelloWorldResource
类 被生成,如 项目浏览器。
JAX-RS RESTful Web 服务 资源是使用根资源类定义的。 Web 服务的 URI 由路径指示符构成,这些指示符是使用 @PATH
注释指定的。使用根资源类定义资源。根资源类是用 @PATH
注释的 POJO,其中一个或多个用资源方法指示符 (@GET
注释的类方法, @PUT
, @POST
, @DELETE
) 或使用 @PATH
注释或同时使用资源方法指示符和 @PATH
。使用资源方法指示符注释的根类方法称为资源方法。使用 @PATH
注释的资源方法称为子资源方法。仅使用 @PATH
注释的类方法称为子资源定位器。
资源响应 HTTP 方法,例如 GET
、POST
、
PUT
和 DELETE
(http://www.w3.org/Protocols/HTTP/Methods.html)。例如,客户端可以使用 GET
获取资源表示,使用 PUT
上传资源的修改副本,或者删除使用 DELETE
的资源。资源方法(以及子资源方法和子资源定位器)可以返回各种格式的资源表示,例如 HTML、纯文本、XML、PDF、JPEG 和 JSON。
我们将使用 @GET
请求方法指示符创建具有一些资源方法的 根资源类。使用 @PATH
注释对 Java 类 org.jboss.jaxrs.rest.HelloWorldResource
进行注释。将托管 Java 类的 URI 路径指定为 /helloworld
:
接下来,添加资源方法以生成三种不同的 MIME 类型。添加资源方法 getClicedMessage()
、getXMLMessage()
和 getHTMLMessage()
(方法名任意)用
@GET
注解,表示资源方法将处理HTTP GET
来自客户的请求。每个资源方法产生不同的 MIME 类型资源表示。每个资源方法都返回 String
,但是在 @Produces
注解中返回和指定的 MIME 类型对于不同的资源是不同的方法。我们将以三种不同的 MIME 类型输出 "Hello JAX-RS"
消息:text/plain
、text/xml
和 text/html
。每个资源方法中返回的 String
值的格式与指定的 MIME 类型相对应。为 JSP 客户端添加两个版本的 getXMLMessage()
方法,如后面部分所述。添加一个使用 @Produces("application/xml")
注释的资源方法,以演示生成的 MIME 类型与客户端中可接受的 MIME 类型相匹配的要求。根资源类列举如下;一些部分已被注释掉以单独测试资源方法:
我们还需要创建一个网络部署描述符web.xml
。选择文件 | 新 | Other,并在 New 中选择 JBoss 工具网站 | Web Descriptor并点击Next,如下图所示:
在 New Web Descriptor File 中,选择 /jboss-jaxrs/src/main/webapp/WEB-INF
文件夹并将 Name 指定为 web.xml
并选择 Version 作为 3.1
,然后点击Finish,如下图所示:
在 web.xml
文件中,为 servlet 类 一个 servlet >com.sun.jersey.spi.container.servlet.ServletContainer
,这是一个用于部署根资源类的servlet。将 servlet 映射 URL 模式指定为 /jaxrs/*
:
web.xml
文件是 显示在 Project Explorer 如下:
在这个 部分,我们将编译、打包和部署 JAX-RS 应用程序 jboss-jaxrs
马文。创建 Java EE Web 项目时会创建 pom.xml
文件。在 pom.xml
文件中,jboss-jaxrs
工件 ID 被指定为包装为 战争
。 JAX-RS API 由 WildFly 8.1 提供:
因为我们是 使用 Jersey JAX-RS RI,所以包括 Jersey 的依赖项,这些依赖项在 Group ID com 中可用.sun.jersey
:
添加 Maven Compiler 插件和 Maven WAR 插件,并将输出目录指定为 WildFly 8.1 安装的 deployments
目录。 pom.xml
文件列举如下:
在我们安装 jboss-jaxrs
应用程序之前,删除 org.jboss .jaxrs.rest.HelloRESTApplication.java
,它是自动创建的。另外,删除资源和测试目录。 jboss-jaxrs
应用程序的目录结构如下所示:
右键单击 pom.xml
上的 并选择 运行作为 | Maven 安装,如下图所示:
jboss-jaxrs
应用程序 被编译,打包到 jboss-jaxrs .war
并输出到 deployments
目录。 Maven install 输出消息 BUILD SUCCESS
,如下所示:
启动 WildFly 8.1 服务器(如果尚未启动)。默认情况下,会在 WEB-INF/lib
和 WEB-INF/classes
目录中扫描根资源类。 org.jboss.jaxrs.rest.HelloWorldResource
根资源类被找到。 jboss-jaxrs.war
应用程序被部署到服务器。现在,登录 WildFly 8.1 Administration 控制台并点击 Manage Deployments< /跨度>。 jboss-jaxrs.war
文件应列为已部署,如下所示:
在本节中,我们将运行根资源类。调用 URL http://localhost:8080/jboss-jaxrs/jaxrs/helloworld
。 jboss-jaxrs
包含在 URL 中,因为它是 Web 应用程序的上下文。包含 jaxrs
以调用 servlet com.sun.jersey.spi.container.servlet.ServletContainer
。 /helloworld
是 RESTful Web 服务的资源 URI。我们没有用 @PATH
注释任何资源方法或类方法;因此,我们不会调用特定的方法。根资源类中的第一个资源方法被调用。将不同的资源方法作为根资源类中的第一个来测试不同的 MIME 类型输出。如果需要 HTML 输出,请将 getHTMLMessage
方法设置为根资源类中的第一个方法。
浏览器中的 HTML 输出如下所示:
如果 getClichedMessage()
资源 方法在资源类中按顺序排在第一位,则 http://localhost:8080/jboss-jaxrs/jaxrs/helloworld
被调用时,="literal">text/plain 表示会显示在浏览器中如此处所示:
如果 getXMLMessage()
资源方法在资源类中按顺序排在第一位,则 XML 表示将显示在浏览器中,如下所示:
当修改后在资源类中调用不同的方法 时,jboss-jaxrs
应用程序将需要重新安装。要重新安装,首先必须清理 Maven 项目,您需要右键单击 pom.xml
并选择 Run As< /strong> | Maven 清理。 BUILD SUCCESS
消息表明先前安装生成的文件已被删除。
在这个 部分中,我们将使用 Jersey 客户端 API 创建一个 JAX-RS Web 服务客户端。为 Java 客户端创建一个 Java 类。选择文件 | 新 | 其他。在 New 中,选择 Class 并点击 下一步。在 New Java Class 向导中,选择 Source folder 作为 < code class="literal">src/main/java,指定Package为org.jboss .jaxrs.rest
,Name为JAXRSClient
,如下图.然后点击完成。
org.jboss.jaxrs.rest.JAXRSClient
类被创建,如下所示:
Jersey 提供客户端 API 来调用 JAX-RS Web 服务。在 Java 客户端中,使用 Jersey 客户端 API 调用资源方法。使用 com.sun.jersey.api.client.Client
类创建资源实例。首先,我们需要创建一个 ClientConfig
对象,该对象使用 DefaultClientConfig< 的无参数构造函数表示客户端配置,例如属性名称和功能。 /代码>。使用静态方法
create(ClientConfig)
从 ClientConfig
对象创建一个 Client
对象代码>。使用 resource(URI)
从 Client
对象创建一个 WebResource
对象Client
对象的方法,其中 URI
参数是 JAX-RS Web 服务的基本 URI,可以通过getBaseURI()
方法。 WebResource
对象是对 Web 资源的封装,用于向 Web 资源发送请求和从 Web 资源接收响应:
添加方法 getBaseURI()
以返回基本 URI。基本 URI 是通过 UriBuilder
类使用静态方法 fromUri
获取 URL http ://localhost:8080/jboss-jaxrs
以及随后的 build
方法来构建 URI
对象:
通过在 get()
方法获取 Web 服务响应>WebResource 对象,以 String.class
作为参数,因为资源方法的返回类型是 String
。首先,使用 path()
方法将路径添加到 WebResource
对象的基本 URI,该方法返回一个新的 WebResource
对象添加了路径。将 jaxrs
添加到 URI 路径以调用 com.sun.jersey.spi.container.servlet.ServletContainer
servlet 并添加 < code class="literal">helloworld 到 URI 路径以调用 HelloWorldResource
资源。使用 accept()
方法将可接受的媒体类型添加到 WebResource
对象。我们将使用三种不同的媒体类型测试 HelloWorldResource
:TEXT_PLAIN
、TEXT_XML
、和 TEXT_HTML
。例如,TEXT_PLAIN
响应输出如下:
同样,使用 MediaType.TEXT_XML
和 MediaType.TEXT_HTML
媒体类型将响应输出为 XML 和 HTML。 JAXRSClient.java
类如下:
在本节中,我们将运行 Java 客户端。首先,运行客户端来测试只输出媒体类型 TEXT_PLAIN
。客户端类中可接受的媒体类型必须与资源类中生成的 MIME 媒体类型相匹配。在 JAXRSClient
类中,仅取消注释接受 TEXT_PLAIN
System.out
语句代码>媒体类型。取消注释 HelloWorldResource
类中的所有资源方法。然后右键单击 JAXRSClient.java
并选择 Run As | Java 应用程序,如下所示:
资源响应以 TEXT_PLAIN
媒体类型显示,如下所示:
可接受的媒体类型必须与资源类生成的媒体类型相匹配。如果根资源类中生成的 MIME 媒体类型未找到可接受的媒体类型,则会生成 com.sun.jersey.api.client.UniformInterfaceException
异常。例如,将可接受的媒体类型设置为 MediaType.TEXT_XML
,方法是取消注释 JAXRSClient
类:
其他可接受的媒体类型的 System.out
语句可以保持未注释或注释掉,因为每个资源方法都独立于其他资源方法调用。在 HelloWorldResource
中,注释掉以下资源方法:
并取消注释产生 MIME 媒体类型 application/xml
的资源方法:
在对应用程序进行任何修改后重新部署 Maven 应用程序。要重新部署,请右键单击 Project Explorer 中的 pom.xml
并选择 运行方式 | Maven 清理。随后,右键单击 pom.xml
并选择 Run As | Maven 安装。将 JAXRSClient.java
作为 Java 应用程序运行。 UniformInterfaceException
异常被生成。 406
(http://www.w3.org/Protocols/rfc2616/rfc2616-sec10.html),如下图:
可以通过取消注释产生 MIME 媒体类型 text/xml
的资源方法并注释掉产生 MIME 类型 application 的方法来消除该错误/xml
:
如果 JAXRSClient.java
应用程序 通过将可接受的媒体类型设置为 MediaType.TEXT_XML
并取消注释产生 text/xml
媒体类型的资源方法,生成以下输出:
当我们没有为根资源类使用客户端时,我们一次只能调用一个资源方法。生成与客户端中最可接受的媒体类型匹配的 MIME 媒体类型的资源方法被调用。可以在同一个 @Produces
注释实例中指定多个 MIME 媒体类型。如果多个媒体类型同样可接受,则首先选择按顺序指定的媒体类型。接下来,我们将从客户端调用所有资源方法,取消注释 HelloWorldResource
类中的所有资源方法,并取消注释 System.out<
JAXRSClient
类中所有可接受的媒体类型的 /code> 语句。将 JAXRSClient
类作为 Java 应用程序运行。三种不同媒体类型中所有资源方法的响应 得到输出,如下所示:
在 上一节中,我们使用Java 客户端作为根资源类。要将客户端与 Web 应用程序打包在一起,需要一个基于浏览器的客户端,例如 JSP 客户端。在本节中,我们将为根资源类创建一个 JSP 客户端。选择文件 | 新 | Other,并在 New 中选择 网络 | JSP File并点击下一步,如下图:
在 New JSP File 向导中,选择 webapp
文件夹并指定 File name 为 jaxrsclient.jsp
,如图这里。现在点击下一步。
选择 New JSP file (html)模板,点击完成。 jaxrsclient.jsp
文件被添加到 webapp
文件夹中,如下所示:
在 jaxrsclient.jsp
JSP 客户端中,根资源类资源方法的调用与在 Java 客户端中一样. jaxrsclient.jsp
文件在此处列出: