| <!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd"> |
| <!-- |
| Copyright (c) 2009, 2010, Oracle and/or its affiliates. All rights reserved. |
| --> |
| <html> |
| <head><link rel="stylesheet" href="../../../print.css" type="text/css" media="print"> |
| <meta http-equiv="Content-Type" content="text/html; charset=UTF-8"> |
| <title>SaaS:Zillow - NetBeans IDE 教程</title> |
| <meta name="KEYWORDS" content="NETBEANS, TUTORIAL, GUIDE, USER, DOCUMENTATION, WEB SERVICE, WEB SERVICES, REST, SAAS, ZILLOW, API-KEY"> |
| <meta name="description" |
| content="This tutorial shows how to use NetBeans IDE |
| to work with api-key authenticated SaaS (Software as a Service) RESTful services. The Zillow real estate service is used as an example."> |
| <link rel="stylesheet" href="../../../netbeans.css"> |
| </head> |
| |
| <body> |
| <h1>SaaS(服务型软件):Zillow 教程</h1> |
| <p>NetBeans IDE 提供一个支持服务型软件 (SaaS) 应用程序的 Web 服务管理器。SaaS 指的是一个软件应用程序交付模型,软件供应商通过它开发 Web 性质的软件应用程序,并承载和运行供其客户通过 Internet 使用的应用程序。SaaS 是一个越来越普及的软件功能提供模型,因为无论从成本角度,还是从客户硬件资源角度而言,它都很经济划算。现在,Java 开发者可以很轻松地在 IDE 中访问 Web 上所有流行的 SaaS 服务。</p> |
| <p>本教程演示如何使用 <a href="http://www.zillow.com/" target="_blank">zillow.com</a> 提供的简单 SaaS。Zillow.com 是一家位于华盛顿西雅图的在线房地产服务公司,成立于 2005 年,其创建者是前 Microsoft 管理人员以及 Expedia 创建者 Rich Barton 和 Lloyd Frink。Zillow 使用户可以看到全美国数百万座房屋的价格,而不仅仅是那些正在出售的房屋的价格。除了给出房屋的估价外,它还提供几项独特的功能,包括每座房屋在给定时间段(例如,1 年、5 年或 10 年)内的价格波动、房屋的鸟瞰图以及某个地区房屋的价格。如果可以访问相应的数据,它还可以提供给定房屋的基本信息,例如,平方英尺数、卧室的数量以及卫生间的数量。如果发生了显著的变化,用户还可以获得房屋的最新估价。</p> |
| <p>在本教程中,将显示一个图表,该图表显示美国 12 个月的平均房屋价格。为了对此进行设置,请首先使用服务管理器将 ZillowRealEstateService.GetRegionChart 操作插入一个 Servlet 中。IDE 会处理基本结构,但还必须修改 Servlet 代码以提取区域图的 URL。本教程说明如何使用 JAXB 对象提取该 URL。这是最简单的方法。 </p> |
| <p><b>目录</b></p> |
| <img alt="此页上的内容适用于 NetBeans IDE 7.2、7.3、7.4 和 8.0" class="stamp" src="../../../images_www/articles/73/netbeans-stamp-80-74-73.png" title="此页上的内容适用于 NetBeans IDE 7.2、7.3、7.4 和 8.0"> |
| <ul> |
| <li><a href="#get-api-key">注册以接收 Zillow API 密钥</a></li> |
| <li><a href="#create-servlet">创建 Servlet</a></li> |
| <li><a href="#drop-zillow-op">将 Zillow GetRegionChart 操作添加到 Servlet</a></li> |
| <li><a href="#adding-api-key">将 API 密钥添加到项目</a></li> |
| <li><a href="#modify-servlet-code">修改 Servlet 以返回图表图</a></li> |
| <li><a href="#running">运行 Zillow 区域图 Servlet</a></li> |
| </ul> |
| |
| |
| |
| <p><b>要学习本教程,您需要具备以下软件和资源。</b></p> |
| |
| <table> |
| <tbody> |
| <tr> |
| <th class="tblheader" scope="col">软件或资源</th> |
| <th class="tblheader" scope="col">要求的版本</th> |
| </tr> |
| <tr> |
| <td class="tbltd1"><a href="https://netbeans.org/downloads/index.html" target="_blank">NetBeans IDE</a></td> |
| <td class="tbltd1"> |
| Java EE 下载包 |
| </td> |
| </tr> |
| <tr> |
| <td class="tbltd1"><a href="http://www.oracle.com/technetwork/java/javase/downloads/index.html" target="_blank">Java 开发工具包 (JDK)</a></td> |
| <td class="tbltd1">版本 7 或 8</td> |
| </tr> |
| <tr> |
| <td class="tbltd1">符合 Java EE 规范的 Web 服务器或应用服务器</td> |
| <td class="tbltd1">Tomcat Web 服务器 7.x、8.x、GlassFish Server Open Source Edition 3.1.x、4.x 或 <a href="http://www.oracle.com/technetwork/middleware/weblogic/overview/index.html" target="_blank">Oracle WebLogic Server 11g-12c</a><br> <b>重要信息:</b>如果在本教程中使用 Tomcat,请参见 <br> <a href="http://wiki.netbeans.org/DeployREST2Tomcat55" target="_blank">关于在 Tomcat 上部署 REST 风格服务的 NetBeans Wiki</a> |
| </td> |
| </tr> |
| |
| </tbody> |
| </table> |
| <h2><a name="get-api-key"></a>注册以接收 Zillow API 密钥</h2> |
| <p>Zillow 服务使用 API 密钥验证。<a href="http://www.zillow.com/webservice/Registration.htm" target="_blank">在此向 Zillow 注册</a>以接收一个 API 密钥。您必须填写一个注册表,但注册是免费的。 </p> |
| <p>其他服务使用 HTTP 验证、标头签名或用户登录来进行验证。这些机制将在后面的教程中介绍。 </p> |
| <h2><a name="create-servlet"></a>创建 Servlet</h2> |
| <p>在 IDE 中可以向 Servlet、现有 REST 风格的服务、JSP 页或简单的传统 Java 对象 (POJO) 中插入 SaaS 操作。在本教程中,将创建一个包含 Servlet 的 Web 应用程序。</p> |
| <p><strong>要创建 Servlet,请执行以下操作:</strong></p> |
| <ol> |
| <li>选择 "File"(文件)> "New Project"(新建项目)。在 "Categories"(类别)下,选择 "Java Web"。在 "Projects"(项目)下选择 "Web Application"(Web 应用程序),然后单击 "Next"(下一步)。</li> |
| <li>在 "Project Name"(项目名称)字段中键入 <tt>ZillowRegionChart</tt>。</li> |
| <li>选择 GlassFish Server 或 Tomcat 服务器以及 Java EE 6 或 Java EE 7。单击其余选项,然后单击 "Finish"(完成)。</li> |
| <li>右键单击 ZillowRegionChart 项目节点,并从上下文窗口中选择 "Properties"(属性)。"Project Properties"(项目属性)对话框打开。</li> |
| <li>右键单击项目节点,然后选择 "New"(新建)> "Servlet"。此时将打开新建 Servlet 向导。 <br><img alt="带有类名 ZillowRegionChartServlet 和任意包名的新建 Servlet 向导" class="margin-around" height="373" src="../../../images_www/articles/72/websvc/zillow/new-zillow-servlet.png" title="带有 ZillowRegionChartServlet 的新建 Servlet 向导" width="600"></li> |
| <li>将此 Servlet 命名为 ZillowRegionChartServlet。为它创建一个任意的包,如 zillow.regionchart。保留所有其他设置为默认值不变,然后单击 "Finish"(完成)。 </li> |
| </ol> |
| |
| <p>该 Servlet 在一个编辑器标签中打开,该 Servlet 及其父包显示在 "Projects"(项目)视图中项目的 "Source Packages"(源包)节点下。 </p> |
| <img alt="IDE 中的 "Projects"(项目)标签,显示 ZillowRegionChart 项目中的 servlet 及其父包" class="margin-around" height="238" src="../../../images_www/articles/72/websvc/zillow/zillow-project-new.png" title="显示新 servlet 的 IDE 中的 "Projects"(项目)标签" width="393"> |
| <h2><a name="drop-zillow-op"></a>将 Zillow GetRegionChart 操作添加到 Servlet</h2> |
| <p>使用服务管理器将 Zillow 的 SaaS 功能添加到 Servlet。IDE 会创建所有的基础结构。</p> |
| <p><strong>要添加 GetRegionChart 操作,请执行以下操作:</strong></p> |
| <ol> |
| <li>在 IDE 中打开 "Services"(服务)标签。展开 "Web Services"(Web 服务)节点。定位到 Zillow GetRegionChart 操作。 <br><img alt="显示展开的 Web 服务节点(显示 Zillow GetRegionChart 服务)的 "Services"(服务)标签" class="margin-around" height="362" src="../../../images_www/articles/72/websvc/zillow/z-llow-getregionchart.png" title="展开了 Web 服务和 Zillow 节点的 "Services"(服务)标签" width="393"></li> |
| <li>在编辑器中,定位到 ZillowRegionChartServlet.java 中的 processRequest 方法。在 try 代码块的开头添加一个空行。将 getRegionChart 操作拖放至 processRequest() 的 try 代码块中。 </li> |
| <li>“定制 GET Saas 服务”对话框打开。可以输入实际的美国城市、州以及邮政编码值,也可以将它们保留为空值。(如果保留空值,将获得全国平均房屋价格表。)单击 "OK"(确定)。</li> |
| </ol> |
| <p>IDE 将生成 GET SaaS 服务的代码。完成后,processRequest() 方法应如下所示。</p> |
| <p><br> <img alt="修改前带有插入的 getRegionChart try 代码块的 servlet 代码" class="margin-around b-all" height="449" src="../../../images_www/articles/72/websvc/zillow/droppedcode.png" title="显示插入的 getRegionChart try 代码块的 servlet 代码" width="600"> </p> |
| <p>IDE 还创建两个新包 <tt>org.netbeans.saas</tt> 和 <tt>org.netbeans.saas.zillow</tt>,分别包含 REST 风格的连接以及特定于 Zillow 的类。完整的包结构如下所示。IDE 还将 <tt>RestConnection</tt> 和 <tt>ZillowRealEstateService</tt> 类导入 Servlet 中。 </p> |
| <img alt="Zillow 区域图项目的结构,其中显示 IDE 通过拖放 getRegionChart 操作创建的包" class="margin-around" height="325" src="../../../images_www/articles/72/websvc/zillow/zillow-project-complete.png" title="ZillowRegionChart 项目的完整结构" width="395"> |
| <h2><a name="adding-api-key"></a>将 API 密钥添加到项目</h2> |
| <p>为了使项目能够访问 Zillow 服务,必须传递<a href="#get-api-key">注册</a>时获取的 API 密钥。打开 <tt>zillowrealestateserviceauthenticator.properties</tt> 文件,复制并粘贴收到的 API 密钥(来自 Zillow 的注册确认电子邮件)。 </p> |
| <h2><a name="modify-servlet-code"></a>修改 Servlet 以返回图表图</h2> |
| <p>已创建的 Servlet 不会产生任何可用的输出。为了使区域图表图显示在浏览器中,必须从 Zillow 服务返回的字符串中提取该图表的 URL(采用的是 XML 文件的形式)。一种方法是解析该 XML 文件并将 URL 传递到一个 JSP 页。此方法在 NetBeans Zone 中 Adam Myatt 所撰写的<a href="http://netbeans.dzone.com/news/consuming-zillow-web-services-" target="_blank">使用 Zillow Web 服务</a>一文中有所介绍。在本教程中,使用一种涉及 JAXB 对象的更简单的方法。</p> |
| <p><strong>要返回图表图,请执行以下操作:</strong></p> |
| <ol><li>修改输出行 <tt><span class="Code">//out.println("The SaasService returned: "+result.getDataAsString());</span></tt>。取消注释该行,并将它改为生成 HTML <img> 标记,而不是生成文本。请注意要对 URL 两侧的引号进行转义!此代码行现在应如下所示。 |
| <pre class="examplecode">out.println("<img src=\""+result.getDataAsString() + "\" />");</pre></li> |
| <li>将输出行移至 <tt>if</tt> 块内的结尾处。现在,<tt>if</tt> 块显示如下: |
| <pre class="examplecode">if (result.getDataAsObject(zillow.realestateservice.regionchart.Regionchart.class) instanceof |
| zillow.realestateservice.regionchart.Regionchart) { |
| zillow.realestateservice.regionchart.Regionchart resultObj = result.getDataAsObject(zillow.realestateservice.regionchart.Regionchart.class); |
| out.println("<img src=\"" + result.getDataAsString() + "\" />"); |
| }</pre></li> |
| <li>将输出中的 <tt>result.getDataAsString()</tt> 方法替换为 <tt>resultObj.getResponse().getUrl()</tt>。可以使用代码完成功能从不同的 <tt>resultObj</tt> 方法中选择 <tt>getResponse()</tt>(如下所示),然后使用代码完成功能从 <tt>getResponse</tt> 方法中选择 <tt>getUrl()</tt>。 <br> <img alt="resultObj 方法的代码完成" class="margin-around b-all" height="182" src="../../../images_www/articles/72/websvc/zillow/zillow-getresponse-cc.png" title="显示 resultObj 方法的代码完成的编辑器" width="594"></li> |
| <li>将 catch 代码块更改为捕获 <tt>JAXBException</tt>,而不是 <tt>Exception</tt>。还可以使用 <tt>Logger.getLogger(...)</tt> 方法,而不是打印堆栈跟踪。必须导入相关的类。请确定是否可以使用代码完成和 "Fix Imports"(修复导入)上下文菜单操作来重新产生下面的 catch 代码块: <pre class="examplecode">} catch (JAXBException ex) { |
| Logger.getLogger(ZillowRegionChartServlet.class.getName()).log(Level.SEVERE, null, ex); |
| }</pre> |
| </li> |
| <li>从 Servlet 代码中的父 try 代码块中删除被注释掉的输出部分。</li> |
| </ol> |
| <p>至此,对代码的修改已完成!最终的 Servlet 代码应如下所示:</p> |
| <pre class="examplecode">package zillow.regionchart; |
| |
| import java.io.IOException; |
| import java.io.PrintWriter; |
| import java.util.logging.Level; |
| import java.util.logging.Logger; |
| import javax.servlet.ServletException; |
| import javax.servlet.http.HttpServlet; |
| import javax.servlet.http.HttpServletRequest; |
| import javax.servlet.http.HttpServletResponse; |
| import javax.xml.bind.JAXBException; |
| import org.netbeans.saas.zillow.ZillowRealEstateService; |
| import org.netbeans.saas.RestResponse; |
| |
| /** |
| * |
| * @author jeff |
| */ |
| public class ZillowRegionChartServlet extends HttpServlet { |
| |
| /** |
| * Processes requests for both HTTP <code>GET</code> and <code>POST</code> methods. |
| * @param request servlet request |
| * @param response servlet response |
| * @throws ServletException if a servlet-specific error occurs |
| * @throws IOException if an I/O error occurs |
| */ |
| protected void processRequest(HttpServletRequest request, HttpServletResponse response) |
| throws ServletException, IOException { |
| response.setContentType("text/html;charset=UTF-8"); |
| PrintWriter out = response.getWriter(); |
| try { |
| |
| try { |
| String unittype = "dollar"; |
| String city = null; |
| String state = null; |
| String zIP = null; |
| String width = null; |
| String height = null; |
| String chartduration = null; |
| |
| RestResponse result = ZillowRealEstateService.getRegionChart( |
| unittype, city, state, zIP, width, height, chartduration); |
| if (result.getDataAsObject( |
| zillow.realestateservice.regionchart.Regionchart.class) instanceof zillow.realestateservice.regionchart.Regionchart) { |
| zillow.realestateservice.regionchart.Regionchart resultObj = |
| result.getDataAsObject( |
| zillow.realestateservice.regionchart.Regionchart.class); |
| out.println("<img src=\"" + resultObj.getResponse().getUrl() + "\" />"); |
| |
| } |
| //TODO - Uncomment the print Statement below to print result. |
| |
| } catch (JAXBException ex) { |
| Logger.getLogger(ZillowRegionChartServlet.class.getName()).log(Level.SEVERE, null, ex); |
| } |
| } finally { |
| out.close(); |
| } |
| }</pre> |
| <h2><a name="running"></a>运行 Zillow 区域图 Servlet</h2> |
| <p>运行 Servlet 的最简单方法是在 "Projects"(项目)视图中右键单击该 Servlet,然后选择 "Run File"(运行文件)。或者,右键单击 "Project"(项目)节点,然后选择 "Properties"(属性)。在 "Properties"(属性)树中选择 "Run"(运行)。在 "Relative URL"(相对 URL)字段中,键入 /ZillowRegionChartServlet,如下所示。单击 "OK"(确定),然后运行该项目。 </p> |
| <img alt="显示相对 URL 的 ZillowRegionChart 项目的 "Properties"(属性)对话框" class="margin-around" height="404" src="../../../images_www/articles/72/websvc/zillow/zillow-run-properties.png" title="ZillowRegionChart 项目的 "Properties"(属性)对话框" width="575"> |
| <p>成功地运行此项目时,会打开一个显示区域图的浏览器窗口。</p> |
| <img alt="浏览器中的 Zillow 区域图" class="margin-around" height="146" src="../../../images_www/articles/72/websvc/zillow/zillow-chart.png" title="Zillow 区域图" width="265"> |
| <h2><a name="more-exercises"></a>更多练习</h2> |
| <p>下面是供您探讨的更多思路:</p> |
| <ul> |
| <li>尝试对城市、州和邮政编码使用不同的实际值。再次运行该 Servlet。</li> |
| <li>编写一个可以将城市、州和邮政编码传递到该服务并返回匹配区域图的客户端。</li> |
| <li>使用 JSP 页(而不是 JAXB 对象)来返回该图表,如此 <a href="http://netbeans.dzone.com/news/consuming-zillow-web-services-" target="_blank">NetBeans Zone 文章</a>中所示。 </li> |
| </ul> |
| <br> |
| <div class="feedback-box" ><a href="/about/contact_form.html?to=3&subject=Feedback:%20Using%20SaaS%20Zillow">发送有关此教程的反馈意见</a></div> |
| <br style="clear:both;" > |
| <!-- ======================================================================================= --> |
| <h2><a name="seealso"></a>另请参见</h2> |
| |
| <p>有关使用 NetBeans IDE 开发 REST 风格的 Web 服务、SaaS 以及其他 Java EE 应用程序的详细信息,请参见以下资源: |
| </p> |
| |
| <ul> |
| <li><a href="./rest.html">REST 风格的 Web 服务入门指南</a></li> |
| <li><a href="http://wiki.netbeans.org/JavaClientForDeliciousUsingNetBeans" target="_blank">Creating a Java Client for del.icio.us RESTful Web Services</a>(为 del.icio.us REST 风格的 Web 服务创建 Java 客户端),作者:Amit Kumar Saha</li> |
| |
| <li><a href="http://wiki.netbeans.org/RESTRemoting" target="_blank">NetBeans Wiki: RESTful Web Service Client Stub</a>(REST 风格的 Web 服务客户端桩模块) |
| </li> |
| |
| <li><a href="../../trails/web.html">Web 服务学习资源</a></li> |
| <li>YouTube:<a href="http://www.youtube.com/watch?v=cDdfVMro99s" target="_blank" title="REST 风格的 Web 服务,构建和部署(第 1 部分)">REST 风格的 Web 服务,构建和部署(第 1 部分)</a></li> |
| <li>YouTube:<a href="http://www.youtube.com/watch?v=_c-CCVy4_Eo" target="_blank" title="NetBeans REST 风格的测试和调用 REST 风格的资源(第 2 部分)">NetBeans REST 风格的测试和调用 REST 风格的资源(第 2 部分)</a></li> |
| |
| </ul> |
| <p>要发送意见和建议、获得支持以及随时了解 NetBeans IDE Java EE 开发功能的最新开发情况,请<a href="../../../community/lists/top.html">加入 nbj2ee@netbeans.org 邮件列表</a>。</p> |
| </body> |
| </html> |