1. JAX-RPC
JAX-RPC står för Java API for XML-based RPC (RPC=Remote Procedure Call), ett namn som är något missvisade eftersom man idag pratar om webbtjänster, inte "XML-baserad RPC". Därför har denna specifikation bytt namn till JAX-WS i version 2.0 .
Med JAX-RPC kan man bygga webbtjänster och applikationer med XML-funktionalitet enligt SOAP 1.1 specifikationen, JAX-RPC är alltså en specifikation av hur en Javaimplementation av SOAP 1.1 ska se ut.
2. Klientsidan (SOAP,HTTP)
Bilden nedan (tagen från JAX-RPC specifikationen) föreställer de olika steg som klienten utför då man utför ett RPC-anrop över SOAP och HTTP:
Nedan beskrivs stegen i detalj:
- mapRPCToSOAP: I detta steg mappas Javametoden, Javaparametrarna, returvärdet och eventuella undantag mot motsvarande delar i SOAP-meddelandet.
- processSOAPMessage: I detta steg byggs ett SOAP-meddelande från mappningen från föregående steg. Exakt hur XML-en i SOAP-meddelandet ska se ut bestäms av encoding style.
- processHTTPRequest: I detta steg byggs ett HTTP-meddelande som wrappar SOAP-meddelandet. Sedan överförs SOAP-meddelandet via HTTP till servern.
3. Serverdelen (SOAP,HTTP)
Grafen nedan (tagen från JAX-RPC specifikationen) visar vad som händer då servern tar emot ett RPC-anrop (över SOAP och HTTP):
Nedan beskrivs stegen i detalj:
- processHTTPRequest: HTTP-meddelandet tas emot.
- processSOAPMessage: Först extraheras SOAP-meddelandet från HTTP-meddelandet. Sedan extraheras SOAP Envelope, SOAP Body, SOAP Header och samtliga attachement. Dessa delar extraheras med hjälp av en XML-parser, t.ex. en SAX-parser.
- mapToRPC: SOAP-meddelandet mappas mot en av slutpunktens ("endpoint") metoder. Eventuella parametrar i SOAP Body mappas mot metodens Javaparametrar och eventuell kontextinformation i SOAP Header tolkas.
- dispatchToTarget:
4. xsd-datatyper
I JAX-RPC 1.1 definieras hur datatyper som definieras i WSDL (eller XML Schema) ska mappas till Java. Först tittar vi på enkla typmappningar, som innefattar vanliga datatyper som typiskt förekommer i programmeringsspråk och databaser.
- xsd: De enkla datatyperna hämntas i en WSDL-fil vanligtvis från namnutrymmet xsd som deklararas med xmlns:xsd="http://www.w3.org/2001/XMLSchema".
Tabellen nedan visar hur de enkla datatyperna mappas mot datatyper i Java:
Datatyper i xsd | | Datatyp i Java | | Beskrivning |
string | | java.lang.String | | - |
integer | | java.math.BigInteger | | Typen integer definieras som en sträng av siffror som kan vara hur lång som helst. Även typerna positiveInteger, nonPositiveInteger, negativeInteger, nonNegativeInteger, |
long | | long | | -9223372036854775808 < x < -9223372036854775807 |
int | | int | | -2147483648 < x < 2147483647 |
short | | short | | -32768 < x < 32767 |
byte | | byte | | -128 < x < 127 |
decimal | | java.math.BigDecimal | | - |
double | | double | | - |
float | | float | | - |
boolean | | boolean | | - |
date | | java.util.Data | | - |
dateTime | | java.util.Calendar | | - |
QName | | javax.xml.namespace.QName | | - |
hexBinary | | byte[] | | - |
base64Binary | | byte[] | | - |
5. xsd-datatyper: Primitiva typer och omslagsklasserna
De xsd-typer som mappas mot primitiva datatyper är:
Datatyper i xsd | | Primär datatyp | | Beskrivning |
long | | long | | -9223372036854775808 < x < -9223372036854775807 |
int | | int | | -2147483648 < x < 2147483647 |
short | | short | | -32768 < x < 32767 |
byte | | byte | | -128 < x < 127 |
double | | double | | - |
float | | float | | - |
boolean | | boolean | | - |
Ibland måste man mappa dessa xsd-typer mot omslagsklasserna ("wrapper classes") d.v.s. Long, Integer, Short, o.s.v.
- Varför räcker inte primära typer till? Jo, det finns nämligen flera sätt i XML-Schema att deklarera att ett element kan vara "optional", vilket betyder att det är valfritt att ta med elementet i XML-överföringen. Om man deklarerar elementet som "optional", och avsändaren väljer att inte skicka elementet måste vi på Java-sidan i detta fall kunna sätta motsvarande datatyp till "null". Eftersom en primär typ inte kan vara "null" måste vi använda omslagsklasserna i detta fall.
Det finns 3 sätta att bestämma att ett element är "optional":
- use="optional": Elementet är deklarerat med attributet use satt till optional. Här
- nillable="true": Elementet är deklarerat med attributet nillable satt till true.
- minOccurs="0": Elementet är deklarerat med attributet minOccurs satt till 0.
Nedan visas hur mappningen ser ut för omslagsklasserna:
Datatyper i xsd | | Omslagsklass | | Beskrivning |
long | | java.lang.Long | | -9223372036854775808 < x < -9223372036854775807 |
int | | java.lang.Integer | | -2147483648 < x < 2147483647 |
short | | java.lang.Short | | -32768 < x < 32767 |
byte | | java.lang.Byte | | -128 < x < 127 |
double | | java.lang.Double | | - |
float | | java.lang.Float | | - |
boolean | | java.lang.Boolean | | - |
6.
7.
8.
9.