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
Service-Oriented Architecture
Service provider
Service requester
Service broker
XML, SOAP, WSDL, UDDI
broker
provider
requester
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可以不用保持在等待回应的状态,可先做其他的工作
Example
Registries
Provider
Requester
1.注册服务
(JAXR)
2.查询服务
(JAXR)
3.下载相关资料
(JAXR)
4.下载WSDL文件
5.request
(JAX-RPC)
6.response
(JAX-RPC)
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上任一节点的资料
Used to create a SAX Parser
Handles document events: start tag, end tag, etc.
Handles Parser Errors
Handles DTDs and Entities
SAX
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 " + 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);
}
}
DOM
DOM Parser
DOM Tree
XML File
API
Application
/**
本程式是用来取得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("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 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
SOAP message
HTTP protocol
XML content
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
presentation
policy
Implementation
description
Interface
description
WSDL
WSDL Spec
六个元素
Services
Port
Types
Message
PortType
Binding
Implementation
Description
Interface
Description
Types
执行讯息交换时新增的资料型态
XML Schema
Message
那些资讯需要传输
PortType
定义Web Service传送接收的作业
Function name
Parameter
Binding
SOAP Binding
HTTP Get/Post Binding
MIME Binding
Port
提供Web Service的端点位置
Service
可利用Service把所有port包起来
Outline
Web Service Concept
Web Service and Java
XML
XML Parsing
JAXB
SOAP
WSDL
JAX-RPC
SAAJ
UDDI
JAXR
JAX-RPC
以JAX-RPC来实作Web Service中的SOAP及WSDL机制
JAX-RPC runtime指的就是应用程式伺服器
Static Stub
package freejavaman;
import javax.xml.rpc.Stub;
public class HelloWorld_RPC_Client {
public static void main(String[] args) {
try {
//取得Stub介面
Stub stub = (Stub)(new MyHelloWorld_Impl().
getHelloWorld_RPC_InterfacePort());
//强制转换成伺服端介面
HelloWorld_RPC_Interface hello = (HelloWorld_RPC_Interface)stub;
//使用WEB Service服务
System.out.println(hello.sayHello("FreeJavaMan"));
} catch (Exception e) {
System.out.println(e);
}
}
}
Dynamic Stub
package freejavaman;
import java.net.URL;
import javax.xml.rpc.Service;
import javax.xml.rpc.JAXRPCException;
import javax.xml.namespace.QName;
import javax.xml.rpc.ServiceFactory;
public class HelloWorld_Proxy_Client {
public static void main(String[] args) {
try {
String UrlString = "http://localhost:8080/myWS/hello WSDL";
String nameSpaceUri = "http://com.test/wsdl/MyHelloWorld";
String serviceName = "MyHelloWorld";
String portName = "HelloWorld_RPC_InterfacePort";
URL helloWsdlUrl = new URL(UrlString);
//取得对映至伺服端的Service物件
ServiceFactory serviceFactory = ServiceFactory.newInstance();
Dynamic Stub
Service helloService = serviceFactory.createService(helloWsdlUrl,
new QName(nameSpaceUri, serviceName));
//取得远端服务介面
HelloWorld_RPC_Interface myProxy = (HelloWorld_RPC_Interface)
helloService.getPort(new QName(nameSpaceUri, portName),
freejavaman.HelloWorld_RPC_Interface.class);
System.out.println(myProxy.sayHello(" Allan"));
} catch (Exception e) {
System.out.println(e);
}
}
}
Dynamic Invocation Interface (DII)
package freejavaman;
import javax.xml.rpc.Call;
import javax.xml.rpc.Service;
import javax.xml.rpc.JAXRPCException;
import javax.xml.namespace.QName;
import javax.xml.rpc.ServiceFactory;
import javax.xml.rpc.ParameterMode;
public class HelloWorld_Dynamic_Client {
private static String endpoint = "http://127.0.0.1:8080/myWS/hello";
private static String qnameService = "MyHelloWorld";
private static String qnamePort = "HelloWorld_RPC_InterfacePort";
private static String BODY_NAMESPACE_VALUE =
"http://com.test/wsdl/MyHelloWorld";
private static String ENCODING_STYLE_PROPERTY =
"javax.xml.rpc.encodingstyle.namespace.uri";
private static String NS_XSD = "http://www.w3.org/2001/XMLSchema";
Dynamic Invocation Interface (DII)
private static String URI_ENCODING =
"http://schemas.xmlsoap.org/soap/encoding/";
public static void main(String[] args) {
try {
//取得伺服器上的Service
ServiceFactory factory = ServiceFactory.newInstance();
Service service = factory.createService(new QName(qnameService));
QName port = new QName(qnamePort);
Call call = service.createCall(port);
call.setTargetEndpointAddress(endpoint);
//设定远端呼叫之基本参数值
call.setProperty(Call.SOAPACTION_USE_PROPERTY, new Boolean(true));
call.setProperty(Call.SOAPACTION_URI_PROPERTY, "");
call.setProperty(ENCODING_STYLE_PROPERTY, URI_ENCODING);
Dynamic Invocation Interface (DII)
//设定回传型态
QName QNAME_TYPE_STRING = new QName(NS_XSD, "string");
call.setReturnType(QNAME_TYPE_STRING);
//设定WEB Service函数名称
call.setOperationName(new QName(BODY_NAMESPACE_VALUE, "sayHello"));
call.addParameter("String_1", QNAME_TYPE_STRING, ParameterMode.IN);
//呼叫远端函数
String[] params = { " Everybody" };
String result = (String)call.invoke(params);
//显示执行结果
System.out.println(result);
} catch (Exception e) {
System.out.println(e);
}
}
}
Outline
Web Service Concept
Web Service and Java
XML
XML Parsing
JAXB
SOAP
WSDL
JAX-RPC
SAAJ
UDDI
JAXR
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
Service-Oriented Architecture
Service provider
Service requester
Service broker
XML, SOAP, WSDL, UDDI
broker
provider
requester
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可以不用保持在等待回应的状态,可先做其他的工作
Example
Registries
Provider
Requester
1.注册服务
(JAXR)
2.查询服务
(JAXR)
3.下载相关资料
(JAXR)
4.下载WSDL文件
5.request
(JAX-RPC)
6.response
(JAX-RPC)
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上任一节点的资料
Used to create a SAX Parser
Handles document events: start tag, end tag, etc.
Handles Parser Errors
Handles DTDs and Entities
SAX
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 " + 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);
}
}
DOM
DOM Parser
DOM Tree
XML File
API
Application
/**
本程式是用来取得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("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 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
SOAP message
HTTP protocol
XML content
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
presentation
policy
Implementation
description
Interface
description
WSDL
WSDL Spec
六个元素
Services
Port
Types
Message
PortType
Binding
Implementation
Description
Interface
Description
Types
执行讯息交换时新增的资料型态
XML Schema
Message
那些资讯需要传输
PortType
定义Web Service传送接收的作业
Function name
Parameter
Binding
SOAP Binding
HTTP Get/Post Binding
MIME Binding
Port
提供Web Service的端点位置
Service
可利用Service把所有port包起来
Outline
Web Service Concept
Web Service and Java
XML
XML Parsing
JAXB
SOAP
WSDL
JAX-RPC
SAAJ
UDDI
JAXR
JAX-RPC
以JAX-RPC来实作Web Service中的SOAP及WSDL机制
JAX-RPC runtime指的就是应用程式伺服器
Static Stub
package freejavaman;
import javax.xml.rpc.Stub;
public class HelloWorld_RPC_Client {
public static void main(String[] args) {
try {
//取得Stub介面
Stub stub = (Stub)(new MyHelloWorld_Impl().
getHelloWorld_RPC_InterfacePort());
//强制转换成伺服端介面
HelloWorld_RPC_Interface hello = (HelloWorld_RPC_Interface)stub;
//使用WEB Service服务
System.out.println(hello.sayHello("FreeJavaMan"));
} catch (Exception e) {
System.out.println(e);
}
}
}
Dynamic Stub
package freejavaman;
import java.net.URL;
import javax.xml.rpc.Service;
import javax.xml.rpc.JAXRPCException;
import javax.xml.namespace.QName;
import javax.xml.rpc.ServiceFactory;
public class HelloWorld_Proxy_Client {
public static void main(String[] args) {
try {
String UrlString = "http://localhost:8080/myWS/hello WSDL";
String nameSpaceUri = "http://com.test/wsdl/MyHelloWorld";
String serviceName = "MyHelloWorld";
String portName = "HelloWorld_RPC_InterfacePort";
URL helloWsdlUrl = new URL(UrlString);
//取得对映至伺服端的Service物件
ServiceFactory serviceFactory = ServiceFactory.newInstance();
Dynamic Stub
Service helloService = serviceFactory.createService(helloWsdlUrl,
new QName(nameSpaceUri, serviceName));
//取得远端服务介面
HelloWorld_RPC_Interface myProxy = (HelloWorld_RPC_Interface)
helloService.getPort(new QName(nameSpaceUri, portName),
freejavaman.HelloWorld_RPC_Interface.class);
System.out.println(myProxy.sayHello(" Allan"));
} catch (Exception e) {
System.out.println(e);
}
}
}
Dynamic Invocation Interface (DII)
package freejavaman;
import javax.xml.rpc.Call;
import javax.xml.rpc.Service;
import javax.xml.rpc.JAXRPCException;
import javax.xml.namespace.QName;
import javax.xml.rpc.ServiceFactory;
import javax.xml.rpc.ParameterMode;
public class HelloWorld_Dynamic_Client {
private static String endpoint = "http://127.0.0.1:8080/myWS/hello";
private static String qnameService = "MyHelloWorld";
private static String qnamePort = "HelloWorld_RPC_InterfacePort";
private static String BODY_NAMESPACE_VALUE =
"http://com.test/wsdl/MyHelloWorld";
private static String ENCODING_STYLE_PROPERTY =
"javax.xml.rpc.encodingstyle.namespace.uri";
private static String NS_XSD = "http://www.w3.org/2001/XMLSchema";
Dynamic Invocation Interface (DII)
private static String URI_ENCODING =
"http://schemas.xmlsoap.org/soap/encoding/";
public static void main(String[] args) {
try {
//取得伺服器上的Service
ServiceFactory factory = ServiceFactory.newInstance();
Service service = factory.createService(new QName(qnameService));
QName port = new QName(qnamePort);
Call call = service.createCall(port);
call.setTargetEndpointAddress(endpoint);
//设定远端呼叫之基本参数值
call.setProperty(Call.SOAPACTION_USE_PROPERTY, new Boolean(true));
call.setProperty(Call.SOAPACTION_URI_PROPERTY, "");
call.setProperty(ENCODING_STYLE_PROPERTY, URI_ENCODING);
Dynamic Invocation Interface (DII)
//设定回传型态
QName QNAME_TYPE_STRING = new QName(NS_XSD, "string");
call.setReturnType(QNAME_TYPE_STRING);
//设定WEB Service函数名称
call.setOperationName(new QName(BODY_NAMESPACE_VALUE, "sayHello"));
call.addParameter("String_1", QNAME_TYPE_STRING, ParameterMode.IN);
//呼叫远端函数
String[] params = { " Everybody" };
String result = (String)call.invoke(params);
//显示执行结果
System.out.println(result);
} catch (Exception e) {
System.out.println(e);
}
}
}
Outline
Web Service Concept
Web Service and Java
XML
XML Parsing
JAXB
SOAP
WSDL
JAX-RPC
SAAJ
UDDI
JAXR
·上一篇:五年级英语一体化冬季补充教材
·下一篇:2006-2007年中国大陆手机模块与整机厂商关系研究报告

文件类型:PPT/Microsoft Powerpoint 文件大小:字节