Käytän tätä blogimerkintää osoittaakseni yksinkertaisella esimerkillä Spring Frameworkin HTTP-etäyhteyden käytön. Aiheesta on olemassa lukuisia online-resursseja, joten aikomuksenani on esitellä erittäin yksinkertainen mutta täydellinen esitys Springin HTTP-etäyhteyden käytöstä muiden kuin selainohjelmien kanssa.
Spring-lähestymistapa HTTP-etäosoitukseen antaa asiakkaille mahdollisuuden kommunikoida Spring-isännöidyn palvelinkoodin kanssa HTTP: n kautta ilman, että asiakaskoodi vaatii HTTP-tietämystä. Sen sijaan asiakas Java-koodi "näkee" vain normaalit yritystoimintaan liittyvät Java-objektit (yleensä käyttöliittymät) HTTP-spesifisten objektien sijaan.
Spring HTTP Remoting vaatii yleensä Springin ja Java: n sekä palvelin- että asiakaspuolella. Jos nämä kaksi vaatimusta voidaan kuitenkin täyttää, kevään HTTP-etäyhteyttä voidaan käyttää helposti.
Seuraavat vaiheet sallivat HTTP-viestinnän keväällä isännöityjen asiakkaiden ja palvelinten välillä. Kun ensin on kuvattu lyhyesti vaiheet, syvenen niihin yksityiskohtaisemmin (mukaan lukien koodinäytteet).
Luo tai käytä olemassa olevaa kevätpapua, joka tyypillisesti toteuttaa Java-käyttöliittymän.
Tämä ei ole mikään erityinen HTTP-etäyhteydelle, ja se on sama askel, joka sinun on tehtävä useimpien asioiden tekemiseksi keväällä (merkittävä poikkeus on
Kevät JDBC
joka ei vaadi kevätpapujen käyttöä).
Luo Spring XML -määritystiedosto, jotta vaiheessa 1 luotu papu voidaan yhdistää Spring-sovelluskontekstiin.
Kuten vaiheessa # 1, tämä XML-tiedosto ei ole mikään erityinen Spring HTTP Remotingille, mutta on sen sijaan yleinen lähes kaikille Spring Frameworkin johdotuksille ja kokoonpanolle.
Luo tai lisää
web.xml
tiedosto.Tämä kolmas vaihe on ensimmäinen vaihe, joka liittyy erityisesti Spring HTTP Remoting -ohjelmaan, mutta on silti yleisesti sovellettavissa
Kevään MVC-kehys
. Tähän vaiheeseen sisältyy servlet-luokan ja URL-kartoitusten lisääminen sellaisina kuin niitä yleensä käytetään
Java EE
servletit
ja
JavaServer-sivut
. Tärkein osa tässä vaiheessa on määritellä kevät
DispatcherServlet
. Tässä on myös valinnainen "linkki"
web.xml
tiedosto kontekstin määrityspaikkaan, jossa yksi tai useampi Spring XML -sovelluksen kontekstitiedosto sijaitsee ja jota käytetään.
Luo Spring-kohtainen servlet-kontekstitiedosto.
Tämä XML-tiedosto näyttää paljon kuin "normaali" Spring-sovelluskontekstin XML-määritystiedosto, mutta sen nimen määrää palvelinsovelluksen nimen käytäntö, jota seuraa hyppy ja sana servlet. Toisin sanoen, jos servlet-sovellusta kutsutaan "jotain verkkoa"
web.xml
tiedosto, tämä kevään servlet-määritystiedosto kutsutaan
somewebthing-servlet.xml
. Tämä tiedosto sisältää
HttpInvokerServiceExporter
(osa tästä, joka koskee erityisesti tämän blogimerkinnän kattamaa HTTP-etäyhteyttä) ja URL-kartoitustiedot.
Testata!
Vaikka yksinkertainen asiakas kirjoittaa kirjoitusta ilman HTTP: tä mielessä ja näyttää käyttävän vain Java-objekteja, se itse vetoaa palveluun HTTP: n kautta. Tämä "todistetaan" suorittamalla asiakas ilman palvelun käyttöönottoa ja seuraamalla tuloksena olevaa HTTP-virhekoodia.
Siirryn nyt osoittamaan yllä olevat vaiheet yksityiskohtaisemmin ja yritän havainnollistaa niitä konkreettisesti koodinäytteillä.
Vaihe 1: Papu ja sen käyttöliittymä
Tämä vaihe ei ole erilainen kuin Java-luokkien ja rajapintojen määrittely, jotka he toteuttavat käytettäväksi Springin kanssa. Seuraavissa koodiluetteloissa näkyy käyttöliittymä (StateCapitalServiceIF
) ja toteutusluokka (StateCapitalService
), jota käytetään tässä esimerkissä.
--- StateCapitalServiceIF.java ---
pakettiesimerkkejä.springhttp; tuo java.io.Serializable; / ** * State Capital Service -rajapinta, jota asiakas käyttää * palvelinpuolen toimintojen käyttämiseen HTTP: n kautta. * / julkinen rajapinta StateCapitalServiceIF laajentaa Serializable {/ ** * Anna valtion pääkaupunki, jonka nimi on annettu. * * @param stateName Valtion nimi, jonka pääoma on haluttu. * @return määritetyn valtion pääoma; null, jos sitä ei löydy. * / public String getCapital (lopullinen String stateName); }
--- StateCapitalService.java ---
pakettiesimerkit.springhttp; tuo java.util.Kartta; / ** * Toiminnot toteutetaan sen jälkeen, kun asiakas on soittanut * HTTP: n kautta. * / public class StateCapitalService toteuttaa StateCapitalServiceIF {Map statesAndCapitals = null; public StateCapitalService () {} / ** * Aseta osavaltiot osavaltioiden pääkartoitukseen. * * @param statesAndCapitals Osavaltiot kartoittavat pääkaupunkeja. * / public void setStatesAndCapitals (lopullinen Map statesAndCapitals) {this.statesAndCapitals = statesAndCapitals; } / ** * Anna valtion pääkaupunki, jonka nimi on annettu. * * @param stateName Valtion nimi, jonka pääoma on haluttu. * @return määritetyn valtion pääoma; null, jos sitä ei löydy. * / public String getCapital (lopullinen merkkijono stateName) {palauta this.statesAndCapitals.get (stateName); }}
Vaihe 2: Kevään sovelluksen kontekstin määritystiedosto
Haluan pitää Springin HTTP-spesifisen kokoonpanon erillään pavun XML-kokoonpanosta. Siksi pavun kokoonpano on täsmälleen sellainen kuin normaalisti nähdään Springin kanssa. Määritä StateCapitalService
luokassa, seuraavaa kokoonpanoa käytetään:
--- kevät-http-config.xml ---
Toistaiseksi mitään erityistä HTTP-etäyhteydestä ei ole tehty. Itse asiassa papu, sen käyttöliittymä ja XML-sovelluskontekstikokoonpano voidaan kaikki suorittaa normaalilla Java SE -luokalla, kuten alla on esitetty:
--- MainServiceAppContext.java ---
pakettiesimerkkejä.springhttp; tuo org.springframework.context.ApplicationContext; tuo org.springframework.context.support.ClassPathXmlApplicationContext; / ** * Osoittaa, kuinka kevätpapua voidaan käyttää ilman HTTP-osallisuutta. * / public class MainServiceAppContext {public static void printStateInfo (final StateCapitalServiceIF stateCapitalMapper, final String state) {System.out.println ("+ valtion + pääoma on" + stateCapitalMapper.getCapital (osavaltio)); } / ** * @param argumentoi komentoriviargumentit * / public static void main (String [] args) {final ApplicationContext context = new ClassPathXmlApplicationContext ("esimerkit / springhttp / spring-http-config.xml"); StateCapitalServiceIF stateCapitalMapper = (StateCapitalServiceIF) context.getBean ("stateCapitalService"); printStateInfo (stateCapitalMapper, "Alabama"); printStateInfo (osavaltioCapitalMapper, "Colorado"); }}
Vaihe 3: web.xml
Tiedosto
Tämä web.xml
tiedosto on tuttu kaikille, jotka ovat kehittäneet Java EE -verkkosovelluksen. web.xml
tässä esimerkissä käytetty seuraavaksi.
Yksinkertainen esimerkki Spring HTTP -kaukosäätimestä Tämä on tarkoitettu erittäin yksinkertaiseksi esimerkiksi Springin HTTP Remoting -ominaisuuden käytöstä. statesCapitals org.springframework.web.servlet.DispatcherServlet 1 statesCapitals / statesCapitals org.springframework.web.context.ContextLoaderListener contextConfigLocation /WEB-INF/examples/springhttp/spring-http-config.x
Vaihe 4: Servlet-sovelluksen kontekstin määritystiedosto
Koska tässä esimerkissä olevan servletin nimi on "statesCapitals", Spring-palvelinsovelluksen kokoonpanotiedosto nimeltä statesCapitals-servlet.xml
on tarjottava. Se näkyy seuraavaksi:
--- toteaaCapitals-servlet.xml ---
example.springhttp.StateCapitalServiceIF httpStateCapitalService
Vaihe 5: Testaa se
Meidän on määritettävä asiakas kommunikoimaan HTTP: n kautta palvelinpuolen sovelluksemme kanssa. Tämän kokoonpano sisältyy spring-http-client-config.xml
tässä esimerkissä ja näkyy seuraavana:
--- spring-http-client-config.xml ---
// paikallinen isäntä: 8080 / SpringHTTPExample / statesCapitals example.springhttp.StateCapitalServiceIF
Asiakaskoodi, joka käyttää yllä olevaa XML: ää käynnistääkseen Spring-kontin ja kutsuttaakseen palvelinpuolen koodin HTTP: n kautta, on luokassa HttpClient
ja tämä koodi näkyy seuraavana:
--- HttpClient.java ---
pakettiesimerkit.keväthttp.asiakas; tuoda esimerkkejä.springhttp.StateCapitalServiceIF; tuo org.springframework.context.ApplicationContext; tuo org.springframework.context.support.ClassPathXmlApplicationContext; / ** * Tämä luokka osoittaa kevään HTTP-altistuneen palvelun asiakkaan ja näyttää * kuinka asiakas on vuorovaikutuksessa palvelimen kanssa kuin käyttäessään normaalia Java-objekteja * sen sijaan, että käyttäisi mitään HTTP-spesifistä. * / public class HttpClient {public static void printStateInfo (final StateCapitalServiceIF stateCapitalMapper, final String state) {System.out.println ("+ valtion + pääoma on" + stateCapitalMapper.getCapital (osavaltio)); } public static void main (final String [] argumentit) {final ApplicationContext context = new ClassPathXmlApplicationContext ("esimerkkejä / springhttp / client / spring-http-client-config.xml"); lopullinen StateCapitalServiceIF stateCapitalService = (StateCapitalServiceIF) context.getBean ("stateCapitalProxyService"); printStateInfo (osavaltioCapitalService, "Colorado"); printStateInfo (stateCapitalService, "Alabama"); }}