IBM®
跳转到主要内容
    中国 [选择]    使用条款
 
 
Select a scope:Search for:    
    首页    产品    服务与解决方案     支持与下载    个性化服务    
跳转到主要内容

developerWorks 中国  >  WebSphere  >

利用IBM的工具和技术开发、部署 Web 服务: 第一部分

developerWorks
文档选项

未显示需要 JavaScript 的文档选项

样例代码


级别: 初级

Greg Flurry (flurry@us.ibm.com), STSM, IBM's Emerging Technologies group, IBM Austin

2002 年 1 月 01 日

该系列教程将介绍如何利用IBM所提供的工具和技术来开发和部署基于 Web 服务的应用程序。文章着重介绍如何使用IBM WebSphere Studio Application Developer开发和测试 Web 服务和 Web 应用,如何在IBM WebSphere 应用服务器上部署开发好的 Web 服务,以及如何在IBM WebSphere UDDI 注册中心中发布和寻找 Web 服务。

© 2001 国际商业机器有限公司。版权所有。

该系列教程将介绍如何利用IBM所提供的工具和技术来开发和部署基于 Web 服务的应用程序。文章着重介绍如何使用IBM WebSphere Studio Application Developer开发和测试 Web 服务和 Web 应用,如何在IBM WebSphere 应用服务器上部署开发好的 Web 服务,以及如何在IBM WebSphere UDDI 注册中心中发布和寻找 Web 服务。

简介

IBM深信 Web 服务将会极大的促进下一代电子商务(也就是“动态电子商务”)的发展,并且承诺“将以开放的互联网标准让动态电子商务变为现实,使我们的客户在最大的程度上获益”(要想了解细节,请参阅 参考资料下面的部分)。该系列教程恰恰展示了IBM是如何兑现其承诺的。本文将着重介绍IBM以下工具和技术:

本文将向读者介绍如何利用IBM的工具和技术为动态电子商务建立基于 Web 服务的解决方案。

本文包括以下部分:

  • 第一部分,也就是这篇文章,介绍了如何使用 Application Developer 来创建和测试一个 Web 服务。
  • 第二部分介绍了如何利用Application Developer 向 UDDI 注册中心发布 Web 服务,在 UDDI 注册中心中查找 Web 服务,导入 WSDL(Web 服务描述语言)文件,以及创建已发布的 Web 服务的 client。
  • 第三部分介绍了如何使用 Application Developer 来创建和测试应用 Web 服务的 Web 应用。
  • 第四部分介绍了如何在 WebSphere 应用服务器4.0版中部署 Web 服务,以及如何通过运行在 Application Developer 中的 Web 应用来访问部署好的 Web 服务。




回页首


WebSphere Studio Application Developer

WebSphere Studio Application Developer 向应用程序开发人员提供了丰富的功能,其中包括 Web 应用的开发和测试、XML的开发和测试,以及 Web 服务的开发和测试(也是该系列教程的重点)。完成 Application Developer 的安装后,你应花些时间用来浏览 Application Developer 内容丰富的在线帮助文档,特别是“开发 Web 服务”的任务和“教程:从Bean创建一个 Web 服务”的例子。





回页首


Web 服务

本文中,我们将创建一个产生天气预报的 Web 服务,它基于 IBM developerWorks 中一篇名为“创建一个完整的 Web 服务”的教程(参阅下面的 参考资料部分)。该 Web 服务依据实时的国家气象服务(National Weather Service)提供确切的天气预报。





回页首


利用 Application Developer 创建 Web 服务

我们将按照以下的步骤去创建 Web 服务:


1. 创建一个 Web project。
2. 导入所需的 JavaBean 和其他资源文件。
3. 生成 WSDL 和描述该 Web 服务的部署描述文件,一个帮助 client 使用该 Web 服务的 proxy 和一个用来测试该 Web 服务的 client。

创建Web project

如果 Application Developer 还没有启动,请启动它。首先,我们通过选择 File => New => Web project来创建一个 Web project。“Create a Web project”向导将提示你输入一个项目名称。在项目名称输入域中输入 WForecast。然后输入企业应用存档的名字,这里我们用 WForecastEAR。


图1. “Create a Web project”向导
The Create a project Wizard

点击 Next进入“Module Dependencies”页面。 点击 Next,你将看到“Define Java Build Settings”页面。


图2. “Create a Web project”向导的“Define Java Build Settings”页面
The Define Java Build Settings pane of the Create a Web project wizard

由于我们要用到XML,所以需要加入编译路径。选择 libraries标签,在以后的页面中,选择 Add External JARs。将目录切换至 <安装路径>/plugins/com.ibm.etools.websphere.runtime/lib ,然后选择 xerces.jar<安装路径> 指的是你放置原文件的路径。点击 OK按钮。之后便可点击 Finish结束创建 Web project。

导入 Web 服务 JavaBean 和资源文件

现在,我们将导入该 Web 服务所需的 JavaBean 和资源文件。首先,请参考下面的“下载”部分,将本文提供的源文件下载下来,并且解压缩。

从 WForecast 项目中选择 Source文件夹,然后选择 File => Import。在接下来的“Import”向导中,选择 File System ,然后点击 Next。在“Import”向导的“File System”页面中,选择 Browse,然后切换到源文件解压缩的目录下。选择 WForecast/source/ 文件夹然后按 OK按钮。展开 source 文件夹并选中 forecast,前面的复选框,点击 Finish按钮。


图3. “Import”向导的“File System”页面
The File System pane of the Import wizard

Application Developer 将导入 WeatherForecast.java 、一个属性文件和两个 HTML 文件。你的 Application Developer 导航视图将像如下显示:


图4. Application Developer 导航视图
The Application Developer Navigator view

你可以双击 WeatherForecast.java文件,通过 Application Developer 来检查这个 JavaBean。 以下的部分说明了这个 JavaBean 源文件的几个关键方面,参考资料部分提供了更详细介绍。构造函数(没有包括在下面的部分)读取一个属性文件。这个属性文件指包含一个属性,用来指示该 Web 服务是实时的联系国家气象服务(NWS)还是利用伪数据来产生预报。 getStates() 函数返回一个包含州列表的 DOM 元素;这些信息是硬编码在这个 bean 中的(如 STATES)getCities() 函数返回一个包含预报城市的列表的 DOM 元素,这些城市都具有要求的状态。如果处在在线的状态(利用 harvestResults() 函数),城市列表将从 NWS 获得;否则,将从一个文件中获得。这个函数保留州和城市的信息以提高性能。 getForecast() 函数一个包含某一城市的天气预报信息的 DOM 元素。如果处在在线的状态,预报信息将从 NWS 获得;否则,将从一个文件中获得。该函数保留州和城市的信息以提高性能。

package forecast;
public class WeatherForecast {
    public Element getStates() {
       DocumentImpl doc = new DocumentImpl();
       try {
            // formulate a response
            System.out.println("in getStates");
            Element response = doc.createElement("states");
            doc.appendChild(response);
            for (int i=0; i<STATES.length; i++) {
                createElementWithContent(doc, response, 
                  "state", STATES[i]);
            }
        } catch (Exception ex) {
            ex.printStackTrace();
        }
        return doc.getdocumentElement();
    }
    public Element getCities(String state) {
        DocumentImpl doc = new DocumentImpl();
        int i;
        for (i=0; i<URL_MAp.length; i++) {
            if (URL_MAp[i][1].equals(state)) {
                break;
            }
        }
        String result = null;
        if (!offline) {
            result = harvestResults(URL_BASE + URL_MAp[i][0]);
        } 
        ...
        stateCached = state;
        cityCache = findCities(result);
        Enumeration cities = cityCache.elements();
        cityCache = new Vector();
        try {
            // formulate a response
            Element response = doc.createElement("cities");
            doc.appendChild(response);
            response.setAttribute("state", state);
            while (cities.hasMoreElements()) {
                String [] ce = processCity((String)
                  cities.nextElement());
                cityCache.addElement(CE);
                createElementWithContent(doc, response, "city", CE[1]);
            }
        } catch (Exception ex) {
            ex.printStackTrace();
        }
        return doc.getdocumentElement();        
    }       
    
    public Element getForecast(String state, String city) {
        DocumentImpl doc = new DocumentImpl();
        Vector tmpCities = null;
        if (state.equals(stateCached)) { // used cached city info
            //System.out.println("using cached info for "+city+", 
              "+state);
        } else { // must get new city info
            getCities(state);
        }
        tmpCities = (Vector) cityCache.clone();
        // find the city url in the cache
        String url = null;
        for (int i=0; i<tmpCities.size(); i++) {
            String [] info = (String []) tmpCities.elementAt(i);
            if (info[1]Equals(city)) {
                url = info[0];
                break;
            }
        }
        // get the forecast
        String result;
        if (url == null) {
            throw new Exception("Invalid city");
        } else {
            if (!offline) {
                result = harvestResults(url);
            } ...
        }
        try {
            // formulate a response
            Element response = doc.createElement("forecasts");
            doc.appendChild(response);
            // process the forecast
            int beg = result.indexOf("<pRE");
            String [] content = null;
            // get the header
            content = extractContent(result, beg, "<B>", "\n", "</F");
            createElementWithContent(doc, response, "location",
              content[0]);
            createElementWithContent(doc, response, "issued",
              content[1]);  
            // get the "middle" day forecasts
            beg = Integer.parseInt(content[2]) + 10;
            for (int j=0; j<4; j++) {
                // extract DOW forecast
                content = extractContent(result, beg, "<B>", 
                  "</FONT></B>", "<B>");
                beg = Integer.parseInt(content[2]);
                Element el = createElementWithContent(doc, response, 
                  "forecast", content[1]);
                el.setAttribute("period", content[0]);
            }           
            // get the last day forecast
            content = extractContent(result, beg, "<B>", "</FONT></B>", 
              "</pRE>");
            Element El = createElementWithContent(doc, response, 
              "forecast", content[1]);
            el.setAttribute("period", content[0]);
        } catch (Exception ex) {
            ex.printStackTrace();
        }
        return doc.getdocumentElement();        
    }
}
    

创建 WSDL、部署描述文件、proxy 和 sample client

WeatherForecast Web 服务的函数都返回一个一般的 DOM 元素。如果你并不在意让你的 Web 服务作信息的合理性检查,这正是你需要的。如果想了解如何利用简单数据类型创建 Web 服务的过程,请参阅 Application Developer 的在线帮助文档。

以下,我们将把这个 JavaBean 转化为一个 Web 服务。选择 WForecast项目,然后选择 File => New => Web Service,你将看到“Web Service”向导的第一个页面。确定选中 WForecast Web project以后,点击 Next


图5. “Web Services”向导的第一个页面
The first pane of the Web Service wizard

然后是“Web Service Type Selection”页面。 WeatherForecast.java 应该已经被选中,然后点击 Next


图6. “Web Service”向导的“Web Service Type Selection”页面
The Web Service Type Selection pane of the Web Service wizard

在以下的“Java Bean Selection”页面,只需点击 Next即可。

“Web Service Java Bean Identity”页面允许你设置基于 JavaBean 的 Web 服务。你可以接受所有的默认设置,但是有一个地方需要改变,你必须将 Scope改为 Session然后选择 Next。会话作用域确保了对于每个用户的新实例,缓存都能够正常的工作。


Figure 7. “Web Service”向导的“Web Service Java Bean Identity”页面
The Web Service JavaBean Identity pane of the Web Service wizard

“Web Service Java Beans Methods”页面允许你选择部署的函数。在这个例子中,接受默认的设置(所有的公共函数)。你也可以修改用于输入和输出的编码风格。缺省设置(对输入的字符串进行 SOAp 编码,对输出的 DOM 元素进行 XML 编码)是正确的,你可以直接点击 Next


Figure 8. “Web Service”向导的“Web Service Java Beans Methods”页面
The Web Service Java Beans Methods pane of the Web Service wizard

在随后的“Binding proxy Generation”页面中,点击 Next,将会为该 Web 服务生成一个基于 SOAp 的 proxy。

然后是“Test Client”页面。由于我们不想启动这个 Test Client,所以点击 Next即可。Test Client是一个普通的框架,用来测试 EJBs 和 Web 服务(请参阅 Application Developer 的在线帮助文档),也可以处理风复杂的数据类型。但是它并不提供如何利用生成的 proxy 的例子,所以我们将利用 Sample client。

现在,你将看到“Web Service Sample Generation”页面。选中 Generate a sampleLaunch the sample,然后点击 Finish


Figure 9. “Web Service”向导的“Web Service Sample Generation”页面
The Web Service Sample Generation pane of the Web Service Client wizard

Application Developer 生成描述 Web 服务的 WSDL 文件,一个 SOAp 部署描述文件,并且将该 Web 服务部署在 Application Developer WebSphere 测试环境中。

Application Developer 还会生成一个 proxy 和 sample client(一系列 JSp 文件)。proxy 用来访问这个 Web 服务,而 sample client 用来测试 proxy 和 Web 服务。





回页首


测试 Web 服务

创建 Web 服务的同时,你还创建了这个服务的 WSDL 描述、proxy 和 sample client 等等。Application Developer 会自动地将该 Web 服务和 client 部署到内置的 WebSphere 测试环境中,并启动这个测试环境。运行态的架构如下图所示:


图10. 运行态的架构
The run-time architecture

注意 Web 服务自身和这个 Web 服务的 client 都运行在 Application Developer 的测试环境中。WeatherForecast Web 服务通过互联网访问国家气象服务(National Weather Service)。

要想测试这个 Web 服务,可以在 Application Developer 的导航视图中展开 WForecast项目,继续展开 webApplication/sample/WeatherForecast 文件夹,右键点击 TestClient.jsp, 选择 Run on Server。运行 TestClient.jsp 的时候,Application Developer 将启动一个指向该 JSp 页的浏览器。JSp 完成编译以后,你将看到如下图所示的 test client:


图11. 显示编译完成的 Test client
The Test Client displaying the compiled JSp

Sample client 显示了这个 Web 服务 proxy 的所有函数。你将看到获得州、城市和天气预报的实际操作,以及为 Web 服务设置和获得这些数据和 URI 的函数。URI 将允许你通过过滤器来发送请求。

要想利用 Sample client 测试 Web 服务,只需从 Methods 栏中选择 getForecast。Inputs 栏中的内容将会随之改变。输入一个州的缩写何一个城市的名称 (这些州和城市的名称必须是在 NWS 中已存在的,你也可以用 getCities() 函数获得一个州所有合法的城市名称)。点击 Invoke,在 Result 栏中,你将看到 XML 文档形式的天气预报。在这个例子中,我们输入了 TXAustin,其结果如下图所示:


图12. 点击Invoke 后在 Sample client 产生的结果
The results displayed in the Test Client after clicking Invoke

如果你想离线的运行这个 Web 服务,你可以编辑 forecast.properties 文件中的 OFFliNE 属性。编辑完成后,你需要重新启动运行这个服务的 WebSphere 应用服务器。最简单的做法是选择(或者打开) Server perspective并选择 Server Control panel标签。在 WebSphere v4.0 Test Environment上点击右键并选择 Restart





回页首


总结

本文展示了利用 WebSphere Studio Application Developer 创建和测试 Web 服务的必要步骤。Application Developer 自动地完成这一流程中的许多步骤,从而大大简化了开发流程,使创建和测试 Web 服务变得十分简单






回页首


下载

名字大小下载方法
workspace.zip10 KBHTTP
关于下载方法的信息


参考资料

  • 该系列教程的 第二部分介绍了如何利用 Application Developer 来发布和导入一个 Web 服务。

  • 该系列教程的 第三部分介绍了如何创建一个使用该 Web 服务的应用。

  • 该系列教程的 第四部分说明了如何将完成的 Web 服务部署到 WebSphere 应用服务器4.0版的投产环境中以及如何运行调用该 Web 服务的应用。

  • 如果想了解有关动态电子商务和 IBM 对动态电子商务的支持,请访问 IBM倡导的 Web 服务:动态电子商务基础

  • 关于 Web 服务依赖的标准和技术,IBM developerWorks 的 Web 服务专区 提供了的丰富文章和教程。

  • IBM developerWorks 教程, 《创建一个完整的 Web 服务》,提供了有关 Web 服务范例的解释,并且讨论了本文提到的工具的早期版本。


关于作者

Greg Flurry 是一个 STSM,目前在 IBM 的新兴技术组中工作。他的主要责任就是促进 IBM 的电子商务技术,特别是 IBM 的 Web 服务技术。你可以通过 flurry@us.ibm.com和他联系。




对本文的评价

太差! (1)
需提高 (2)
一般;尚可 (3)
好文章 (4)
真棒!(5)

建议?




回页首


IBM 公司保留在 developerWorks 网站上发表的内容的著作权。未经IBM公司或原始作者的书面明确许可,请勿转载。如果您希望转载,请通过 提交转载请求表单 联系我们的编辑团队。
    关于 IBM 隐私条约 联系 IBM 使用条款