programmera.net -> jax -> normal     för utskrift      info@programmera.net

Grundläggande termer

1. Allmän Terminologi
2. Port
3. Hur fungerar webbtjänster på java?

1. Allmän Terminologi

Innan vi ger oss in på hur webbtjänster fungerar kan det vara bra att definiera några grundläggande termer:

  • JAX-RPC runtime: Den kod som uppfyller specifikationen JAX-RPC 1.1 kallas JAX-RPC runtime. Ett krav på JAX-RPC runtime är att det ska implementera de gränssnitt i paketet javax.xml.rpc som beskrivs i JAX-RPC 1.1-specifikationen. Applikationsserverleverantören skriver ett (eller flera) paket som länkasin i applikationsservern. För Apache Axis heter detta paket org.apache.axis. JAX-RPC runtime har som huvuduppgift att mappa metodanrop till och från XML.
  • Service Enpoint: Ett begrepp med något otydlig definition, men syftar oftast till kombinationen av "Service Endpoint Interface" och "Service Implementation Bean".
  • Service Enpoint Interface: Ett Javagränssnitt som definierar hur man kan anropa webbtjänstens metoder.
  • Service Implementation Class / Service Implementation Bean: Dessa två termer refererar till samma sak. I specifikationen JAX-RPC 1.1 används termen "Class" och i specifikationen WS4EE 1.1 används "Bean". Termerna refererar till den Javaklass på serversidan som implementerar "Service Endpoint Interface". Om webbtjänsten kör i en EJB-behållare måste denna klass vara tillståndslös sessionsböna.
  • SOAP-handler: En "SOAP-handler" är en klass som skrivs av utvecklaren och som bearbetar det råa SOAP-meddelandet precis innan det skickas iväg eller precis efter det tagits emot.

2. Port

Ett annat viktigt begrepp är Port. En "Port" (eller "Portkomponent") är en instans i en behållare som tar emot SOAP-meddelanden som skickas till en viss URL på ett visst transportprotokoll (HTTP, JMS, SMPT,..). "Porten" är så att säga behållarens instans av webbtjänsten. "Porten" har följande egenskaper:

  • Varje "Port" svarar mot en URL som bestäms av attributet location i <soap:address>-elementet i WSDL-filen.
  • Varje "Port" är bunden till ett Service Endpoint Interface.
  • Varje "Port" är bunden till en Service Implementation Bean.
  • En "Ports" livscykel kontrolleras helt av behållaren. Typiskt är att den skapas samtidigt som behållaren startas och förstörs då behållaren stängs ner.

3. Hur fungerar webbtjänster på java?

För att illustrera hur dessa termer hänger samman tittar vi på följande bild som illustrerar hur en Javaklient anropar en "JAX-RPC service endpoint" (alltså en webbtjänst som är sjösatt i en webb-behållare):



De pilarna med siffran noll (0) symboliserar saker som sker innan metodanropet börjar, d.v.s. de klasser som har automatgenererats med ett "WSDL till Java" verktyg. Övriga steg beskrivs nedan:

  1. Klienten har tillgång till "Service Endpoint Interface" som har genererats utifrån WSDL-filen. Klienten utför ett metodanrop lokalt mot en stubbe som implementerar "Service Endpoint Interface".
  2. Stubben utnyttjar "JAX-RPC runtime" för att omvandla anropet till ett SOAP-meddelande.
  3. "JAX-RPC runtime" anropar eventuella SOAP-handlers.
  4. SOAP-handlern utnyttar SAAJ för att bearbeta SOAP-meddelandet.
  5. "JAX-RPC runtime" skickar meddelandet över det specifierade transportprotokollet, t.ex. HTTP, som i sin tur sänds över TCP.
  6. TCP-paketen anländer till serverdatorn.
  7. Serverdatorn vet att Java EE-behållaren (i detta fall en Web-container) lyssnar på den aktuella porten. Servern extraherar HTTP-meddelandet ur TCP-paketen och slussar HTTP-meddelandet till behållaren.
  8. Behållaren utför deklarativa tjänster på anropet. Ett exempel på detta är rättighetskontroll (authorization) som i detta exemple är en BASIC-AUTH, d.v.s inlogging med användarnamn och lösenord på HTTP-nivå. EJB: För EJB-behållare kan rättighetskontroller utföras på metodnivå.
  9. Behållaren anropar nu den servlet som "JAX-RPC runtime" skapade i samband med att webbtjänsten sjösattes. Exakt vad som händer i "JAX-RPC runtime" är leverantörsberoende och går därför inte att beskriva, men vissa huvuddrag finns beskrivna i specifikationen. Det första steget är att extrahera SOAP-meddelandet ur HTTP-meddelandet.
  10. Nästa steg är att "JAX-RPC runtime" aktiverar alla SOAP-handlers som finns deklarerade för porten.
  11. SOAP-handlern utnyttjar SAAJ för att bearbeta SOAP-meddelandet.
  12. Nu konverterar "JAX-RPC runtime" SOAP-meddelandet till ett metodanrop och anropar korrekt metod på skelettklassen "Service Implementation Class" (som implementerar gränssnittet "Service Endpoint Interface").
  13. I detta exempel låter vi "Service Implementation Class" anropa ett annat paket där själva affärslogiken ligger. Detta är en metod som rekommenderas av SUN för att få en bra separation mellan gränssnittsklasser och affärslogik. Denna separation underlättar underhållet av koden.