610 likes | 806 Views
Java Web Service. 2004 Matt. Outline. Web Service Concept Web Service and Java XML XML Parsing JAXB SOAP WSDL JAX-RPC SAAJ UDDI JAXR. Web Service 特點. 誇程式語言平台 底層的運作 ( 資料的傳輸及服務的呼叫 ) 皆以 XML 作為 local 和 remote 溝通及互動的表達語言 SOAP 以 XML 為基礎並架構在 HTTP 之上 SOAP 是以文字為基礎的通訊協定 Loosely coupling
E N D
Java Web Service 2004 Matt
Outline • Web Service Concept • Web Service and Java • XML • XML Parsing • JAXB • SOAP • WSDL • JAX-RPC • SAAJ • UDDI • JAXR
Web Service 特點 • 誇程式語言平台 • 底層的運作(資料的傳輸及服務的呼叫)皆以XML作為local和remote溝通及互動的表達語言 • SOAP以XML為基礎並架構在HTTP之上 • SOAP是以文字為基礎的通訊協定 • Loosely coupling • Web Services Description Language • 動態地呼叫與使用Web Service所提供的服務 • 動態服務的取得 • UDDI
Web Service 特點 • 提供同步與非同步的運算模式 • 可以和Message Server整合 • IBM MQ Server, MS MSMQ • 透通防火牆的保護 • HTTP
broker provider requester Service-Oriented Architecture • Service provider • Service requester • Service broker • XML, SOAP, WSDL, UDDI
Java Web Service • Java WSDP (Web Service Developer Pack) • Document-oriented package • JAXP (Java API for XML Processing) • JAXB (Java Architecture for XML Binding) • SAAJ (SOAP with Attachment API for Java) • Procedure-oriented package • JAX-PRC (Java API for XML-based RPC) • JAXR (Java API for XML Registries)
JAXP (Java API for XML Processing) • 剖析與存取XML文件的API • DOM • SAX • 文件轉換 • 如轉成HTML以顯示在網頁上
JAXB (Java Architecture for XML Binding) • 將XML Schema轉成Java類別的技術 • 以便可以使用Java類別和XML文件進行互動,以使在進行剖析與處理XML文件時變得更簡單及自然
JAX-RPC (Java API fro XML-based RPC) • Java的使用者可以利用JAX-RPC呼叫Server的某一程序 • 所有底層的運作都必須基於SOAP協定,這些部份皆已經被JAX-RPC自動處理完畢了
JAXR (Java API for XML Registries) • Web Service利用JAXR將其所提供的服務註冊到UDDI Server中,而客戶則可以利用JAXR到註冊Server中找尋所需的服務
SAAJ (SOAP with Attachments API for Java) • 透過SAAJ的使用,可以提供非同步運算的Web Services • 讓Client和Server之間藉由【message】來做溝通,Client可以不用保持在等待回應的狀態,可先做其他的工作
Registries 1.註冊服務 (JAXR) 3.下載相關資料 (JAXR) 2.查詢服務 (JAXR) 4.下載WSDL文件 5.request (JAX-RPC) Provider Requester 6.response (JAX-RPC) Example
Outline • Web Service Concept • Web Service and Java • XML • XML Parsing • JAXB • SOAP • WSDL • JAX-RPC • SAAJ • UDDI • JAXR
XML • eXtensible Markup Language • XML Schema
Outline • Web Service Concept • Web Service and Java • XML • XML Parsing • JAXB • SOAP • WSDL • JAX-RPC • SAAJ • UDDI • JAXR
XML Parsing • XML Parsing及文件轉換的功能由JAXP (Java API for XML Processing)所提供 • XML Parsing模型有兩程 • DOM (Document Object Model) • SAX (Simple API for XML) • SAX • Event-driven • Serial的方式取得XML資料 • DOM • 利用標籤間具有階層性的關係,在記憶體中以樹狀結構的方式重現XML文件 • 利用traversal的演算法即可擷取XML文件中的資料,可以ransom的方式存取tree上任一節點的資料
SAX Handles document events: start tag, end tag, etc. Used to create a SAX Parser Handles Parser Errors Handles DTDs and Entities
import java.io.*; import org.xml.sax.*; import org.xml.sax.helpers.DefaultHandler; import javax.xml.parsers.SAXParserFactory; import javax.xml.parsers.SAXParser; import javax.xml.parsers.ParserConfigurationException; public class BookListApp { public static void main(String[] args){ try{ //取得SAXParserFactory之物件實體 SAXParserFactory factory = SAXParserFactory.newInstance(); factory.setValidating(true); //取得JAXP所預設之SAX剖析器 SAXParser parser = factory.newSAXParser(); //取得Handler程式之物件實體,BookList_Handler程式已經繼承DefaultHandler類別 //下列用法是採用物件導向的多形特性。 DefaultHandler handler = new BookList_Handler(); //設定XML文件檔名與Handler程式,並開始進行剖析的工作 parser.parse(args[0], handler);
}catch (SAXParseException e1){ System.out.println("發生錯誤行數: " + e1.getLineNumber()); System.out.println("錯誤訊息: " + e1.getMessage()); }catch (ParserConfigurationException e2){ System.out.println(e2); }catch(Exception e3){ System.out.println(e3); } } }
/** 這個Handler物件就是用來和SAX剖析器進行互動之用 */ import org.xml.sax.*; import org.xml.sax.helpers.DefaultHandler; public class BookList_Handler extends DefaultHandler{ //暫存XML資料的字串變數 StringBuffer txtBuf = null; /** 文件相關的事件處理函數 */ public void startDocument() throws SAXException{ System.out.println("開始剖析文件的工作"); } public void endDocument() throws SAXException{ System.out.println("結束剖析文件的工作"); }
/** 元素相關的事件處理函數 */ public void startElement(String nameSpace, String sName, String qName, Attributes atts) throws SAXException{ //列印上一個XML資料 displayText(); //顯示標籤的名字 String name = sName; if (name.equals("")) name = qName; System.out.println("開始剖析元素:" + name); //取得該元素的所有屬性 if (atts != null){ for (int i = 0; i < atts.getLength(); i++){ //取得元素的名稱 String aName = atts.getLocalName(i); if (aName.equals("")) aName = atts.getQName(i);
System.out.println("元素:" + name + "的屬性:" + aName + "為:" + atts.getValue(i)); } } } public void endElement(String nameSpace, String sName, String qName) throws SAXException{ //列印上一個XML資料 displayText(); //顯示標籤的名字 String name = sName; if (name.equals("")) name = qName; System.out.println("結束剖析元素:" + name); } /** 文字事件相關的處理函數 */
public void characters(char[] buf, int offset, int len) throws SAXException{ String str = new String(buf, offset, len); //合併XML資料 if (txtBuf == null) txtBuf = new StringBuffer(str); else txtBuf.append(str); } /* public void ignorableWhitespace(char buf[], int offset, int len) throws SAXException{ System.out.println("忽略資料"); } */ /** 印出XML資料 */ public void displayText(){ if (txtBuf == null) return;
System.out.println("解析出來的文字:->" + txtBuf + "<-"); txtBuf = null; } /** 其它有用的成員函數 */ public void setDocumentLocator(Locator local){ System.out.println("system ID:" + local.getSystemId()); System.out.println("public identifier:" + local.getPublicId()); } public void processingInstruction(String appName, String data) throws SAXException{ System.out.println("應用程式名稱:" + appName + ",初始參數:" + data); } }
API Application XML File DOM Parser DOM Tree DOM
/** 本程式是用來取得DOM剖析器之物件實體. */ import java.io.*; //與DOM剖析器相關的類別 import javax.xml.parsers.DocumentBuilder; import javax.xml.parsers.DocumentBuilderFactory; import javax.xml.parsers.FactoryConfigurationError; import javax.xml.parsers.ParserConfigurationException; //剖析過程中所會引發的例外事件(和SAX剖析器共用) import org.xml.sax.SAXException; import org.xml.sax.SAXParseException; //與DOM相關的例外事件 import org.w3c.dom.Document; import org.w3c.dom.DOMException; import org.w3c.dom.Node; import org.w3c.dom.NodeList;
public class BookListDOMApp { public static void main(String[] args){ try{ //取得 DocumentBuilderFactory 之物件實體 DocumentBuilderFactory factory = DocumentBuilderFactory.newInstance(); //設定判斷有效性 factory.setValidating(true); //設定判斷命名空間 factory.setNamespaceAware(true); //設定是否忽略註解 factory.setIgnoringComments(true); //設定是否忽略空白 factory.setIgnoringElementContentWhitespace(true); //設定是否要展開實體參考 factory.setExpandEntityReferences(true);
//將CDATA結點轉換成Text結點 factory.setCoalescing(true); //取得DOM剖析器 DocumentBuilder builder = factory.newDocumentBuilder(); //委託剖析例外事件 builder.setErrorHandler(new BookListDOM_ErrorHandler()); //建立DOM樹狀結構 Document document = builder.parse(new File(args[0])); //取得根結點 Node node = document.getDocumentElement(); //取得根結點的所有子元素 NodeList nodeList = node.getChildNodes(); for (int i = 0; i < nodeList.getLength(); i++) { Node node2 = nodeList.item(i);
System.out.println("-----------------分割線---------------------");System.out.println("-----------------分割線---------------------"); System.out.println("getNodeName():" + node2.getNodeName()); System.out.println("getNodeValue():" + node2.getNodeValue()); System.out.println("getNodeType():" + node2.getNodeType()); System.out.println("getAttributes():" + node2.getAttributes()); } }catch (SAXParseException e1){ System.out.println("發生錯誤行數: " + e1.getLineNumber()); System.out.println("錯誤訊息: " + e1.getMessage()); }catch (ParserConfigurationException e2){ System.out.println(e2); }catch(Exception e3){ System.out.println(e3); } } }
import java.io.*; import javax.xml.parsers.*; import org.xml.sax.*; import org.w3c.dom.*; public class BookListDOMRecursive { public static void main(String[] args){ new BookListDOMRecursive(args[0]); } public BookListDOMRecursive(String fileName){ try{ //取得 DocumentBuilderFactory 之物件實體 DocumentBuilderFactory factory = DocumentBuilderFactory.newInstance(); //設定判斷有效性 factory.setValidating(false); //設定判斷命名空間 factory.setNamespaceAware(true);
//設定是否忽略註解 factory.setIgnoringComments(true); //設定是否忽略空白 factory.setIgnoringElementContentWhitespace(true); //設定是否要展開實體參考 factory.setExpandEntityReferences(true); //將CDATA結點轉換成Text結點 factory.setCoalescing(true); //取得DOM剖析器 DocumentBuilder builder = factory.newDocumentBuilder(); //建立DOM樹狀結構 Document document = builder.parse(new File(fileName)); //取得根結點 Node node = document.getDocumentElement(); //執行巡行XML文件的功能 recursiveXML(node, 0);
}catch (SAXParseException e1){ System.out.println("發生錯誤行數: " + e1.getLineNumber()); System.out.println("錯誤訊息: " + e1.getMessage()); }catch (ParserConfigurationException e2){ System.out.println(e2); }catch(Exception e3){ System.out.println(e3); } } //遞迴函數, 用以巡行整份XML文件 public void recursiveXML(Node node, int esc){ //列印空白區隔字元 for (int k = 0; k < esc; k++) System.out.print(" "); if (node.getNodeType() == 1) { //元素為標籤(Element)型態 //列印標題名稱 System.out.print("Element: " + node.getNodeName() + "\n");
//取得結點的所有子元素 NodeList nodeList = node.getChildNodes(); //進入遞迴過程 for (int i = 0; i < nodeList.getLength(); i++) { recursiveXML(nodeList.item(i), esc + 4); } } else if (node.getNodeType() == 3) { //元素為一般文字型態 //列印文字內容 System.out.print("Text: " + node.getNodeValue() + "\n"); } } }
Outline • Web Service Concept • Web Service and Java • XML • XML Parsing • JAXB • SOAP • WSDL • JAX-RPC • SAAJ • UDDI • JAXR
JAXB機制是由以下三大類別所組成 • javax.xml.bind • javax.xml.bind.util • javax.xml.bind.helper • Marshal • object ->xml • Unmarshal • xml ->object
Example • recommandBook.xml • recommandBook.xsd • xjc recommandBook.xsd • 產生generated\... • 若要修改recommandBook.xml檔 • 利用unmarshaller物件把XML轉換成content tree • 修改 • Marshaller物件做正向編組 • 另存新檔.xml
import java.io.*; import java.util.*; import javax.xml.bind.*; import javax.xml.bind.util.*; import generated.*; public class RBookModifier { public RBookModifier(){ try { //取得JAXBContext物件, 並設定Java套件名稱 JAXBContext jc = JAXBContext.newInstance("generated"); //取得提供Unmarshal功能的物件 Unmarshaller um = jc.createUnmarshaller(); //指定欲Unmarshal的XML文件, 及取得XML根元素 RecommandBook rb = (RecommandBook)um.unmarshal(new FileInputStream("tempBook.xml")); //取得ProductsType子元素 ProductsType rt = rb.getProducts();
//取得MainProductType子元素 MainProductType mpt = rt.getMainProduct(); //更改主約產品保險額度 mpt.setMpCoverage(200); //更改主約產品保險費率 mpt.setMpFee((double)2000); //取得驗證內容樹的物件 javax.xml.bind.Validator vt = jc.createValidator(); //設定欲驗證之內容樹根元素 boolean b = vt.validateRoot(rb); if (b) System.out.println("符合有效性"); Marshaller m = jc.createMarshaller(); m.setProperty(Marshaller.JAXB_FORMATTED_OUTPUT,Boolean.TRUE); m.marshal(rb, new FileWriter("tempBook.xml"));;
}catch (Exception e){ System.out.println("Err: " + e); } } public static void main(String[] args){ new RBookModifier(); } }
Outline • Web Service Concept • Web Service and Java • XML • XML Parsing • JAXB • SOAP • WSDL • JAX-RPC • SAAJ • UDDI • JAXR
SOAP • SOAP被看做是實作RPC機制的通訊協定,也是 • Object remote procedure call • Messaging • xml transform • SOAP message包括 • SOAP envelope • SOAP encoding rules • SOAP RPC representation XML content SOAP message HTTP protocol TCP/IP protocol
Outline • Web Service Concept • Web Service and Java • XML • XML Parsing • JAXB • SOAP • WSDL • JAX-RPC • SAAJ • UDDI • JAXR
WSDL • WSDL只是說明存取某一服務的通訊協定,function name,參數型態等資訊 • W3C對SOA架構的規範,描述服務的完整資訊包括 • Agreement • Relationship • detail
business service composition orchestration WSDL presentation policy Implementation description Interface description
WSDL Spec • 六個元素 • Services • Port • Types • Message • PortType • Binding Implementation Description Interface Description
Types • 執行訊息交換時新增的資料型態 • XML Schema <types> <myNewType/> </types>
Message • 那些資訊需要傳輸
PortType • 定義Web Service傳送接收的作業 • Function name • Parameter
Binding • SOAP Binding • HTTP Get/Post Binding • MIME Binding