Компания IBM
Опубликован: 04.07.2008 | Доступ: свободный | Студентов: 529 / 63 | Оценка: 4.48 / 4.37 | Длительность: 08:45:00
Лекция 3:

Улучшение работы приложения фирмы ITSO Electronics с помощью Web-сервисов

< Лекция 2 || Лекция 3: 12345 || Лекция 4 >

3.6 Создание сложного Web-сервиса в Lotus Domino Designer 7

В предыдущем примере было продемонстрировано совместное использование примитивных видов данных, таких как массивы, числа или (как в нашем случае) строки. Требования к приложению ITSO Electronics заключаются в предоставлении покупателям прямого доступа к информации о продуктах. Web-сервисы же позволяют нам раскрыть эти данные. Покупатели и поставщики могут увидеть цену определенного продукта или получить список всех доступных продуктов.

Для предоставления покупателям права доступа к информации о продуктах нам необходимо предоставить для совместного использования следующую информацию о продукте:

  • Название продукта ( Product name ).
  • Цена ( Price ).
  • Номер ( Number ).
  • Описание ( Description ).

В примере 3.7 приведены данные объекта Product. Этот объект будет использован в качестве сложного типа данных в Web-сервисе, над созданием которого мы будем работать в "Улучшение работы приложения фирмы ITSO Electronics с помощью Web-сервисов" . В данном примере использован язык программирования Java.

public class Product
{
private String name;
private int number;
private String description;
private double price;
public String getName(){ return name; }
public int getNumber(){ return number; }
public double getPrice(){ return price; }
public String getDescription() { return description; }
public void setName(String newName)
{
name = newName;
}
public void setNumber(int newNumber)
{
number = newNumber;
}
public void setDescription(String newDescription)
{
description = newDescription;
}
public void setPrice(double newPrice)
{
price = newPrice;
}
}
Пример 3.7. Код Product.java

В "Улучшение работы приложения фирмы ITSO Electronics с помощью Web-сервисов" , "Создание нового Web-сервиса", мы создавали Web-сервис, используя примитивный тип данных. В этом примере мы предпримем те же действия для создания Web-сервиса для объекта Product, который позволит обеспечить партнеров подробной информацией о продуктах. В приведенных ниже действиях обобщается способ создания Web-сервиса.

  1. Откройте базу данных ITSO Web Services в Domino Designer, затем Shared Code => Web Services (Общий код \Rightarrow Web-сервисы). Щелкните по кнопке New Web Service (Создать Web-сервис).
  2. В окне свойств Web-service, в поле Name, введите ProductService, таким образом вы присвоите имя своему Web-сервису. В качестве класса PortType используйте ProductService.
  3. В панели Options переключитесь на Java.
  4. Щелкните по кнопке New Class (Создать класс), после чего замените код предоставляемым по умолчанию кодом, представленным в примере 3.8. Этот код называется ProductService.java.
  5. Снова щелкните по кнопке New Class и вставьте код из примера 3.7. Этот код называется Product.java.
  6. Сохраните Web-сервис.
import lotus.domino.*;
import lotus.domino.types.*;
import java.util.*;
public class ProductService
{
private Session session = WebServiceBase.getCurrentSession();
  public Object[] getAllProducts()
  {
  Product[] result = null;
  Database db = null;
  View view = null;
  Product product = null;
  ArrayList tempList = new ArrayList();
  try
  {
  db = getProductDb();
view = db.getView("vaPNumber");
  Document doc2, doc = view.getFirstDocument();
  while(doc != null)
  {
product = getProductFromDocument(doc);
tempList.add(product);
doc2 = doc;
doc = view.getNextDocument(doc);
doc2.recycle();
}
view.recycle();
db.recycle();
  }catch(NotesException e){e.printStackTrace();}
return tempList.toArray();
  }
private Product getProductFromDocument(Document doc)
{
Product product = null;
try
{
String name = doc.getItemValueString("ProductName");
String description = doc.getItemValueString("ProductDescription");
double price = doc.getItemValueDouble("ProductPrice");
int productNumber = doc.getItemValueInteger("productNumber");
product = new Product();
product.setNumber(productNumber);
product.setName(name);
product.setPrice(price);
product.setDescription(description);
}
catch(Exception e)
{}
return product;
}
private Database getProductDb()
{
Database db = null;
try{
db = session.getDatabase("","itso\\products.nsf");
}catch(NotesException e){}
return db;
}
public Product getProduct(double productNumber)
{
Product product = null;
  try
  {
    Database db = getProductDb();
View view = db.getView("vaPNumber");
  Document doc = view.getDocumentByKey(new Double(productNumber), true);
    if(doc != null) {
      product = getProductFromDocument(doc);
      doc.recycle();
      doc = null;
    }
  view.recycle();
  db.recycle();
  }catch(NotesException e){}
  return product;
}
}
Пример 3.8. ProductService.java

Мы можем использовать новый Web-сервис, названный ProductService из Rational Application Developer, как показано на рис. 3.12.

Исполнение операции WSDL getProduct

увеличить изображение
Рис. 3.12. Исполнение операции WSDL getProduct

Пример 3.9 выводит контекст ответа SOAP, полученный от сервера Lotus Domino для определенного номера продукта, который мы использовали для активирования операции WSDL getProduct.

<soapenv:Envelope xmlns:soapenv="http://schemas.xmlsoap.org/soap/envelope/"
xmlns:xsd="http://www.w3.org/2001/XMLSchema"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance">
- <soapenv:Body>
- <ns1:getProductResponse xmlns:ns1="urn:DefaultNamespace"
soapenv:encodingStyle="http://schemas.xmlsoap.org/soap/encoding/">
  <getProductReturn href="#id0" />
  </ns1:getProductResponse>
- <multiRef xmlns:ns2="urn:DefaultNamespace"
xmlns:soapenc="http://schemas.xmlsoap.org/soap/encoding/" id="id0" soapenc:
root="0"
soapenv:encodingStyle="http://schemas.xmlsoap.org/soap/encoding/" xsi:
type="ns2:Product">
<description xsi:type="xsd:string">This is the basic Redbook offering.</description>
<name xsi:type="xsd:string">Basic Redbook</name>
<number xsi:type="xsd:int">20501</number>
<price xsi:type=""xsd:double">102.0</price>
</multiRef>
</soapenv:Body>
</soapenv:Envelope>
Пример 3.9. Контекст ответа SOAP, полученный от сервера

У Web-сервиса ProductService, который мы только что создали, есть и другая операция, отправляющая набор объектов продуктов в виде массива, которая называется getAll-Products. Пример 3.10 наглядно иллюстрирует этот процесс. Его сообщения SOAP имеют формат RPC/encoded.

- <soapenv:Envelope xmlns:soapenv="http://schemas.xmlsoap.org/soap/envelope/"
xmlns:xsd="http://www.w3.org/2001/XMLSchema"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance">
- <soapenv:Body>
- <ns1:getAllProductsResponse xmlns:ns1="urn:DefaultNamespace"
soapenv:encodingStyle="http://schemas.xmlsoap.org/soap/encoding/">
- <getAllProductsReturn xmlns:soapenc="http://schemas.xmlsoap.org/soap/
encoding/"
soapenc:arrayType="xsd:anyType[9]" xsi:type="soapenc:Array">
  <item href="#id0" />
  <item href="#id1" />
  <item href="#id2" />
  <item href="#id3" />
  <item href="#id4" />
  <item href="#id5" />
  <item href="#id6" />
  <item href="#id7" />
  <item href="#id8" />
  </getAllProductsReturn>
  </ns1:getAllProductsResponse>
- <multiRef xmlns:ns2="urn:DefaultNamespace"
xmlns:soapenc="http://schemas.xmlsoap.org/soap/encoding/" id="id1" soapenc:
root="0"
soapenv:encodingStyle="http://schemas.xmlsoap.org/soap/encoding/" xsi:
type="ns2:Product">
  <description xsi:type="xsd:string">Redpaper mid-tier line available at
newsagents and
department stores.</description>
  <name xsi:type="xsd:string">Redpaper Deluxe</name>
  <number xsi:type="xsd:int">10002</number>
  <price xsi:type="xsd:double">2299.0</price>
  </multiRef>
- <multiRef xmlns:ns3="urn:DefaultNamespace"
xmlns:soapenc="http://schemas.xmlsoap.org/soap/encoding/" id="id8" soapenc:
root="0"
soapenv:encodingStyle="http://schemas.xmlsoap.org/soap/encoding/" xsi:
type="ns3:Product">
  <description xsi:type="xsd:string">The best Redbook money can buy.</
description>
  <name xsi:type="xsd:string">Redbook Plus</name>
  <number xsi:type="xsd:int">45500</number>
  <price xsi:type="xsd:double">50000.0</price>
  </multiRef>
и так далее.......
- <multiRef xmlns:ns10="urn:DefaultNamespace"
xmlns:soapenc="http://schemas.xmlsoap.org/soap/encoding/" id="id6" soapenc:
root="0"
soapenv:encodingStyle="http://schemas.xmlsoap.org/soap/encoding/" xsi:
type="ns10:Product">
  <description xsi:type="xsd:string">The ultimate Redbook experience.</
description>
  <name xsi:type="xsd:string">Redbook Supreme</name>
  <number xsi:type="xsd:int">20564</number>
  <price xsi:type="xsd:double">1000.0</price>
  </multiRef>
  </soapenv:Body>
  </soapenv:Envelope>
Пример 3.10. Контекст ответа SOAP

3.7 Экспортирование документа WSDL

Документы WSDL экспортируют для того, чтобы предоставить покупателю информацию о том, как использовать созданные Web-сервисы. Во многих случаях инструменты, с помощью которых осуществляется создание клиентов Web-сервисов, могут автоматически генерировать код из документа WSDL.

Для того чтобы экспортировать документ WSDL, выполните следующие действия:

  1. Откройте базу данных ITSO Web Services в Domino Designer и выберите Shared Code => Web Services (Общий код \Rightarrow Web-сервисы).
  2. Выберите ProductService и щелкните по кнопке Export WSDL (Экспортировать документ WSDL).
  3. После этого будет сгенерирован файл WSDL в формате XML. В нашем сценарии мы использовали расширение .wsdl для того, чтобы опознать экспортированный файл WSDL, как видно из рис. 3.13.
Экспортирование документа WSDL

увеличить изображение
Рис. 3.13. Экспортирование документа WSDL
< Лекция 2 || Лекция 3: 12345 || Лекция 4 >