NetBeansIDE-REST风格的Web服务入门指南

代表性状态传输 (REpresentational State Transfer, REST) 是一种用于分布式超媒体系统(如万维 网)的体系结构样式。REST 风格的体系结构的核心概念是由统一资源标识符 (Uniform. Resource Identifier, URI) 标识的资源。可以使用标准接口(如 HTTP)来处理这些资源以及使用这些资源的表示 形式来交换信息。在本教程中,将首先了解一些关于 REST 的知识,然后演示 NetBeans IDE 是如何支持 这种体系结构样式的。

目录

简介

REST 风格的 Web 服务、持久性和实体类

通过数据库创建 REST 风格的 Web 服务

创建项目

生成实体类和 REST 风格的服务

测试 REST 风格的 Web 服务

添加 Google 地图功能

Spring Framework 中 REST 风格的 Web 服务

要学习本教程,您需要具备以下软件和资源。

软件或资源 要求的版本

NetBeans IDE Java EE 下载包 Java Development Kit (JDK) 版本 6 符合 Java EE 规范的 Web 服务器或应用服务器

EE5 项目:Tomcat Web Server 6.x-7.x、Oracle WebLogic Server 11g 或 GlassFish Server Open Source Edition。 重要信息:如果在本教程中使用 Tomcat,请参见 有关在 Tomcat 上部署 REST 风格的服务的 NetBeans Wiki。

EE6 项目:GlassFish Server Open Source Edition 3.x

jdbc/sample 数据库,位于 Java DB (Derby) 数据库服务器或 MySQL 数据库服务器上

在 Java DB (Derby) 上,jdbc/sample 数据库是在将 IDE 与 GlassFish 应用服务器 一起安装时由 NetBeans IDE 生成的。

在 MySQL 上,通过 IDE 在 MySQL 服务器上创建 sample 数据库后,IDE 将填充该数据库 。

Tomcat 和 GlassFish 服务器都可以随同 NetBeans IDE 的 Web 和 Java EE 分发一起安装。此外, 也可以访问 GlassFish 服务器下载页或 Apache Tomcat 下载页。

简介

REST 风格的 Web 服务是使用 REST 风格的体系结构样式构建的服务。由于其轻量的特性并且支持直 接通过 HTTP 传输数据,使用 REST 风格的方法构建 Web 服务作为一种新兴趋势已经开始替代传统的 Web 服务构建方式,即使用基于 SOAP 的技术在 Internet 上部署服务。

IDE 支持使用 JSR 311 – Java API for RESTful Web Services (JAX-RS) 和 Jersey(JAX-RS 的引 用实现)快速开发 REST 风格的 Web 服务。

有关详细信息,请参见以下内容:

JSR 311: JAX-RS: The Java API for RESTful Web Services

Jersey, the open source JAX-RS (JSR 311) Reference Implementation for building RESTful Web services

除了支持构建 REST 风格的 Web 服务之外,IDE 还支持测试、构建可访问 REST 风格的 Web 服务的 客户端应用程序,以及生成用于调用 Web 服务(REST 风格和基于 SOAP)的代码。

下面是 IDE 提供的 REST 风格的功能列表:

通过 JPA 实体类和模式快速创建 REST 风格的 Web 服务。

通过从“服务”窗口的 Web 服务管理器中拖放组件,快速生成用于调用 Web 服务的代码,例如, Google 地图、Yahoo 新闻搜索和 StrikeIron Web 服务。

为 Web 服务管理器中注册的服务生成 REST 风格的 Java 客户端。

生成测试客户端,用于测试 REST 风格的 Web 服务。

提供可轻松浏览项目中 REST 风格的 Web 服务实现类的逻辑视图。

完全集成的 Spring Framework,提供 Spring 事务处理。

在本教程中,将介绍 IDE 如何支持生成、实现和测试 REST 风格的 Web 服务。

REST 风格的 Web 服务、持久性和实体类

Java 中的 REST 风格的 Web 服务依靠 Java 持久性 API 与数据库进行通信。具体来说,REST 风格 的 Web 服务依靠持久性 API 中定义的实体类持久性单元。实体类是指映射到关系 数据库中的对象的 Java 类。按照 Java EE5 教程中的说法,“实体是一个小型持久性域对象。通常,实 体表示关系数据库中的表,每个实体实例与该表中的一行相对应”。持久性单元包含 persistence.xml 文件中定义的实体类、数据源、持久性提供器以及持久性单元自身的名称集合。

您可以使用 NetBeans IDE 在相同过程中创建实体类和 REST 风格的 Web 服务,也可以使用 IDE 通 过现有实体类创建 REST 风格的 Web 服务。在本教程中,将使用数据库向导中的 REST 风格的服务在相 同过程中生成实体类和 REST 风格的 Web 服务。该向导自动生成持久性单元。

使用 MySQL 数据库服务器

如果使用的是 MySQL 数据库服务器而不是 JavaDB (Derby),您需要在 IDE 中注册该数据库服务器, 然后将 sample 数据库添加到该服务器上。

在本教程中使用 MySQL 数据库服务器:

如果未注册 MySQL 服务器,请在 IDE 中注册该服务器。要注册 MySQL 服务器,请转至 IDE 的“服 务”窗口,右键单击“数据库”节点,然后选择“注册 MySQL 服务器”。

将打开一个对话框,您可以在其中键入 MySQL 服务器的配置详细信息,包括管理员用户名和口令。请 参见连接到 MySQL 数据库中的“配置 MySQL 服务器属性”。

启动并连接到 MySQL 服务器。请参见连接到 MySQL 数据库中的“启动 MySQL 服务器”。

右键单击 MySQL 服务器节点,然后选择“创建数据库”。将打开“创建 MySQL 数据库”对话框。

键入 sample 作为新数据库名称。为超级用户或所选的用户授予完全访问权限。

单击“确定”。将打开一个对话框,通知您 sample 是样例数据库的名称,并询问您是否要为该数据 库创建表、对象和数据。

单击“是”。IDE 将创建并填充该数据库,并添加到该数据库的连接。

通过数据库创建 REST 风格的 Web 服务

本练习的目标是创建一个项目,并通过数据库生成实体类和 REST 风格的 Web 服务。

此部分使用 JavaDB (Derby) 数据库和 jdbc/sample 数据源。JavaDB 包含在 SDK 中。jdbc/sample 数据源是在将 IDE 与 GlassFish 一起安装时由 NetBeans IDE 自动生成的。

创建项目

要创建 REST 风格的 Web 服务,您需要创建 Java Web 应用程序项目。

要创建此项目,请执行以下操作:

选择“文件”>“新建项目 (Ctrl-Shift-N)”。在“类别”下,选择 “Java Web”。在 “项目”下,选择“Web 应用程序”。单击“下一步”。将打开“新建 Web 应用程序”向导。

或者,也可以创建 Maven Web 应用程序。选择“文件”>“新建项目 (Ctrl-Shift-N)”。在“ 类别”下,选择 “Maven”。在“项目”下,选择“Maven Web 应用程序”,然后单击“下一步 ”。

在“项目名称”字段中,输入 CustomerDB。单击“下一步”。

选择 EE 6 或 EE 5。在“服务器”下,选择要使用的服务器,但要注意,EE 6 项目需要使用 GlassFish Server 3 或更高版本。单击其余选项,然后单击“完成”。

Maven 项目重要说明:在创建 Maven Web 应用程序时,无法设置服务器。不过,您必 须在创建持久性单元之前设置服务器。因此,在创建 Maven Web 应用程序后,请打开项目的“属性”对 话框并在“运行”属性中设置服务器。要打开项目的“属性”对话框,请右键单击项目节点,然后从上下 文菜单中选择“属性”。

Tomcat 7 和 EE6:Tomcat 7 无法与 NetBeans IDE 7.0 或更高版本生成的 EE6 REST 风格的服务一起使用。这是因为 NetBeans 7.0 为 REST 风格的服务提供了会话 Facade,而 Tomcat 7 没有支持 EJB 3.1 或 EE6 EJB 的插件。请参见 Apache Geronimo 项目和 Apache OpenEJB 插 件项目以了解这些问题的最新信息。

生成实体类和 REST 风格的服务

在创建 Java Web 应用程序后,将实体类和 REST 风格的 Web 服务添加到项目中。

生成实体类和 REST 风格的 Web 服务:

右键单击 CustomerDB 节点,然后选择“新建”>“其他”>“Web 服务”>“基于数据库的 REST 风格的 Web 服务”。将在“数据库表”面板中打开“新建 REST 风格的 Web 服务”向导。

在“数据库表”面板中,如果使用的是 GlassFish 服务器,请从“数据源”下拉列表字段中选择 jdbc/sample 数据源。

如果使用的是 Tomcat,请选择 jdbc:derby://localhost:1527/sample。如果 Derby 数据库服务器未 能自动启动,需要从“服务”窗口的“数据库”标签中启动它。

MySQL 用户注意事项:您必须创建新的数据源。选择“新建数据源”,指定任意描述性名称,然后选 择 jdbc:mysql://localhost:3306/sample 数据库连接。在 MySQL 上创建样例数据库时,将会创建该连 接。

在“可用表”下,选择 “CUSTOMER”,然后单击“添加”。DISCOUNT_CODE 表(与 CUSTOMER 表有关联)将自动添加到“选定表”列表中。现在您应该看到以下内容:

单击“下一步”。将打开“实体类”页。在“包”下,键入 entities。现在您应该看到以下内容:

EE6 服务注意事项:“基于数据库的 REST 风格的 Web 服务”向导自动生成 JAXB 标注。如果使用“ 通过数据库生成实体类”向导为 EE6 应用程序生成实体类,并且以后可能通过这些实例类创建 REST 风 格的 Web 服务,请确保选中“生成 JAXB 标注”框。还可以在运行“基于实体类的 REST 风格的 Web 服 务”向导之前手动将 JAXB 标注添加到实体类中。有关详细信息,请参见用于生成更简单的 REST 风格 Web 服务的 NetBeans。

单击“下一步”。将打开“生成的类”面板。在该面板中,您可以设置 IDE 为项目生成的 REST 风格 的 Web 服务类的位置。对于 EE5 和 EE6 REST 风格的 Web 服务,“生成的类”面板是不同的,因为 EE5 项目包含转换器类,而 EE6 Web 服务在实体类中改用 JAXB 标注。

接受缺省包和位置,然后单击“完成”。IDE 将生成实体类。然后,将打开一个对话框,询问您是否 要注册 REST 风格的资源。对于 EE5 项目,您可以选择使用 web.xml 部署描述符中的 Jersey REST 风 格的 Servlet 适配器(缺省),也可以手动编码您自己的解决方案。对于 EE6 项目,您还可以选择使用 javax.ws.rs.core.Application 的子类(缺省)。

对于 EE5 或 EE6 应用程序,在 web.xml 中创建缺省 Jersey REST Servlet 适配器,然后单击“确 定”。这与 GlassFish 问题 16118 有关。

现在,IDE 将生成 REST 风格的 Web 服务。在 IDE 完成后,查看“项目”窗口。生成的实体类位于 entities 包中。服务位于 service 包中。对于 EE5 项目,converter 包中包含一些转换器类,并在“ 配置文件”下面包含 web.xml 部署描述符。

注意:IDE 可能会提示您解决项目的引用问题。在这种情况下,右键单击 CustomerDB 项目节点,然后选择“解决引用问题”。如果该服务是在 WebLogic 安装上运行的第一个 Jersey 应用程 序,则可能会发生该问题。在这种情况下,IDE 通过将 Jersey 库复制到服务器来解决引用问题。

对于来自数据库的 EE6 REST 风格 Web 服务,NetBeans IDE 在实体类以及服务类的 EJB 会话 Facade 中使用 JAXB 标注。这避免了需要使用转换器类并生成更简单的代码。

有关 NetBeans IDE 7.0 和更高版本生成的 EE6 REST 风格 Web 服务的更多详细信息,请参见用于生 成更简单的 REST 风格 Web 服务的 NetBeans。

测试 REST 风格的 Web 服务

本练习的目标是试验您的应用程序。

右键单击该项目节点,并选择“测试 REST 风格的 Web 服务”。服务器启动,应用程序部署。部署完 成后,浏览器将显示应用程序,其中含有到各 Web 服务的链接。

如果输出窗口显示错误消息,指出一个或多个类不存在,且项目未生成,则请将 Jersey 库添加到编 译时库中。右键单击项目节点,然后选择“属性”。在“属性”树状菜单中选择“库”。单击“添加库” 并定位到 Jersey 库。

左侧是根资源集。此处,它们命名为 customers 和 discountCodes。

单击 customers 节点。浏览器窗口显示用于测试 Customers 服务的参数列表。

可以设置下列参数:

选择要测试的方法:从下拉列表中选择 GET 或 POST 方法以及 MIME 类型。

开始:要显示的第一个实体。请注意编号从 0 开始,而不是从 1 开始。

最大数目:可获取的最大实体数目。如果设置为 0,将获取所有实体。

展开级别:一项高级功能。有些服务返回无限重复的树状分层结构。此参数指定要在“原始视图”中 显示此类分层结构的深度。

查询:一项高级功能。根据 JPA 语法搜索 XML 或 JSON 文档。

单击“方法”下拉列表,选择 GET(application/xml)。在“最大数目”字段中键入 “3” 。保留其他参数中的缺省值,并单击“测试”。测试结果将显示在“测试输出”部分。

“测试输出”区域中有 5 个标签。

“表格视图”是一个平面视图,它显示生成文档中的所有 URI,您可以通过单击这些链接进行导航。

“原始视图”显示返回的实际数据。根据您选择的 mime 类型(application/xml 或 application/json),显示的数据将分别为 XML 或 JSON 格式。

“子资源”标签将显示根资源和子资源的 URL。当 REST 风格的 Web 服务是基于数据库实体类时,根 资源代表了数据库表,而子资源则代表列。

“头”标签显示 HTTP 头信息。

“HTTP 监视”标签显示发送和接收的实际 HTTP 请求数和响应数。

请注意,尽管您指定了最多显示 3 个实体,但却列出了 6 个结果。打开“原始视图”标签可看到相 关的原因。每个实体对应一个 元素,测试结果中只有 3 个客户。但是,“表格视图 ”列出的是 URI,而不是实体,每个实体有两个 URI,一个是父 元素的属性,另一个 是子 元素的属性。因此,尽管只有 3 个 customer 实体,但总共有 6 个 URI。

退出浏览器并返回到 IDE。

添加 Google 地图功能

本练习的目标是将 Google 地图功能添加到 REST 风格的 Web 服务。

在编辑器中打开 CustomerResource 类。

将以下方法添加到 CustomerResource:

@GET@Produces("text/html")public String getGoogleMap() {// Drag and drop the getGoogleMap operation here    return "";}

请在以下位置注册获取 Google 地图密钥:http://www.Google.com/apis/maps/signup.html 。Google 地图密钥请求对话框中有一个字段需要输入您网站的 URL。在该字段中键入 http://localhost:8080。

在 IDE 中,打开“服务”标签并展开“Web 服务”节点。在“Web 服务”下面,展开 “Google” 节点。在 “Google” 下,展开 “Map Service”。

将 getGoogleMap 项目拖放至在“步骤 2”中创建的 getGoogleMap 方法的主体中,具体位置在紧靠 return = “”; 代码行的前面。“定制 getGoogleMap SAAS”对话框打开。接受缺省选项,然 后并单击“确定”。

IDE 在 CustomerResource 类的 getGoogleMap 方法中添加以下 try 代码块。

@GET@Produces("text/html")public String getGoogleMap() {// Drag and drop the getGoogleMap operation here            try {                      String address = "16 Network Circle, Menlo Park";         java.lang.Integer zoom = 15;         String iframe. = "false";         RestResponse result = GoogleMapService.getGoogleMap(address, zoom, iframe);         //TODO - Uncomment the print Statement below to print result.         //System.out.println("The SaasService returned: "+result.getDataAsString());    } catch (Exception ex) {         ex.printStackTrace();    }     return ""; }

IDE 还会创建 org.netbeans.saas 和 org.netbeans.saas.Google 包,其中包含有以下类和 资源:

RestConnection – HttpUrlConnection 的包装器

RestResponse – HTTP 响应的包装器

Googlemapservice.properties – 存储 API 密钥的属性文件

GoogleMapService – 包含包装器方法的服务包装器,它使用 RestConnection 调用 Google 地图服务 。

在 getGoogleMap() 的 try 代码块中,将被注释掉的 print 语句替换为代码行 return result.getDataAsString();。此方法现在如下所示:

@GET@Produces("text/html")public String getGoogleMap() {// Drag and drop the getGoogleMap operation here            try {                      String address = "16 Network Circle, Menlo Park";         java.lang.Integer zoom = 15;         String iframe. = "false";         RestResponse result = GoogleMapService.getGoogleMap(address, zoom, iframe);         return result.getDataAsString();    } catch (Exception ex) {         ex.printStackTrace();    }     return "";         }

打开 Googlemapservice.properties。粘入在步骤 3 中从 Google 获取的 API 密钥 。

右键单击 “CustomerDB” 项目节点,并选择“测试 REST 风格的 Web 服务”。IDE 将取消 部署,并将您的项目重新部署到服务器上,然后打开含测试客户端的浏览器窗口。

单击左侧边栏中的 customers。customers 的测试标准在主窗格中打开。保留缺省选项不变,然后单 击“测试”。用户表打开。

从表中单击 customer1。该客户的测试窗口在主窗格中打开。从下拉列表中,选择 text/html MIME 类型。单击“测试”。”16 Network Circle, Menlo Park” 的 GoogleMap 在“原始视图”中 打开。

将为数据库中的所有客户显示 Menlo Park 地址的 Google 地图。要显示客户实际地址的 Google 地 图,应当为数据库中的每个实体创建一个 Customer 实例,并将地址设置为等于包含每个 Customer 的地 址变量的字串。如果您使用的是 6.5 之前的 IDE 版本,还需在 try 代码块的末尾添加一行代码以关闭 Customer 的实例。此方法现在如下所示(更改的内容以粗体显示):

@GET@Produces("text/html")public String getGoogleMap() {    try {         Customer c = getEntity();         String address = c.getAddressline1() + " " + c.getAddressline2() + " " +                 c.getCity() + " " + c.getState() + " " + c.getZip();         java.lang.Integer zoom = 15;         String iframe. = "false";          RestResponse result = GoogleMapService.getGoogleMap(address, zoom, iframe);         return result.getDataAsString();          } catch (Exception ex) {         ex.printStackTrace();     }       //The close() method is only necessary with versions of NetBeans IDE earlier than 6.5          finally {             PersistenceService.getInstance().close();     }     return "";            }

再次测试 REST 风格的 Web 服务。再次为一个客户选择 text/html MIME 类型 。数据库中该客户地址的 Google 地图现在显示在“原始视图”中。对于 customer1,将显示下面的地图 :

注意:如果 GoogleMaps 无法找到地址,它将显示放大的海洋视图。

Spring Framework 中 REST 风格的 Web 服务

从 NetBeans IDE 6.5 和 Jersey 0.8 开始,Jersey 集成到了 Spring Framework 中。在使用 Spring Framework 创建 Java Web 应用程序时,会自动创建识别 REST 的 Servlet。不过,Spring 3 不 包含 aopalliance.jar,REST 风格的 Web 服务需要使用该文件来注入 EntityManager 对象。

使用 Spring Framework 创建 REST 风格的 Web 服务

要使用 Spring Framework 创建 REST 风格的 Web 服务,只需重复本教程中介绍的操作过程,但有一 个例外。按照通过数据库生成实体类中所述在“新建项目”向导中创建 Java Web 应用程序时,在选择服 务器后,单击“下一步”,而不是单击“完成”。“框架”面板打开。选择 “Spring Web MVC”,然后单击“完成”。

创建 REST 风格的服务后,请注意 Spring 项目与在没有 Spring 的情况下创建的项目之间的以下区 别:

Spring 项目的 customerdb.service 包中没有名为 PersistenceService.java 的类。

CustomerResource.java 导入 org.springframework.transaction.annotation.Transactional 并包 含许多 @Transactional 标注。

之所以存在这两点区别,是因为 Spring Framework 会处理事务和实体管理,而在其他项目中,IDE 必须创建一个使用 javax.transaction.UserTransaction 和 javax.persistence.EntityManager 的类。 Spring Framework 会产生更清晰的代码以及更高效的事务处理和实体管理。

有关 NetBeans IDE 中 Spring Framework 项目功能的详细信息,请参见 Spring Framework 简介。

将 aopalliance.jar 添加到项目中

Spring 3 不包含 aopalliance.jar。应用程序需要使用该库来注入 EntityManager。要解决此问题, 您需要下载该 jar 并将其添加到类路径中。您还需要从代码中删除 @Error 标注。请参见 问题 193626 和 Spring 论坛。

添加 aopalliance.jar:

从 http://sourceforge.net/projects/aopalliance/files/aopalliance/1.0/ 下载 aopalliance.jar 的 Zip 归档文件。

将归档文件解压缩到所选的位置。

在 IDE 的“项目”窗口中,右键单击 Spring REST 风格的 Web 服务项目节点。上下文菜单打开。

选择“属性”。属性对话框打开。

在“类别”窗格中,选择“库”。单击“添加 JAR/文件夹”。将打开文件系统浏览器。

浏览到 aopalliance.jar。使用绝对路径引用。单击“打开”。

aopalliance.jar 文件现在包含在库中。单击“确定”。

在 IDE 的顶部菜单栏中,单击“编辑”,然后选择“在项目中查找…”。

在项目中搜索 @Error 标注的所有实例。

从代码中删除每个 @Error 行。

当一个人把寂寞当作人生预约的美丽,

NetBeansIDE-REST风格的Web服务入门指南

相关文章:

你感兴趣的文章:

标签云: