Programování

Jednoduchý jarní příklad vzdálené komunikace HTTP

Používám tuto položku blogu, abych jednoduchým příkladem demonstroval použití HTTP Remoting Spring Framework. Na toto téma existuje mnoho online zdrojů, takže mým záměrem je poskytnout extrémně jednoduchou, ale úplnou ukázku použití Spring Remoting HTTP s klienty bez prohlížeče.

Jarní přístup k HTTP Remoting umožňuje klientům komunikovat s kódem serveru hostovaným na Spring prostřednictvím HTTP, aniž by klientský kód vyžadoval jakoukoli znalost použití HTTP. Místo toho klientský kód Java „vidí“ pouze běžné objekty Java (obvykle rozhraní) související s podnikáním, nikoli objekty specifické pro HTTP.

Spring HTTP Remoting obecně vyžaduje Spring a Java na straně serveru i na straně klienta. Pokud však tyto dva požadavky lze splnit, Spring HTTP Remoting se snadno použije.

Následující kroky umožňují komunikaci HTTP mezi klienty a servery hostovanými na serveru Spring. Poté, co nejprve stručně vysvětlím kroky, se jimi zabývám podrobněji (včetně ukázek kódu).

  1. Vytvořte nebo použijte existující Spring bean, který obvykle implementuje rozhraní Java.

    Pro vzdálenou komunikaci HTTP to není nic zvláštního a je to stejný krok, který musíte udělat, abyste většinu věcí provedli na jaře (významná výjimka je

    Jarní JDBC

    který nevyžaduje použití žádných jarních fazolí).

  2. Vytvořte konfigurační soubor Spring XML pro přidružení fazole vytvořené v kroku # 1 s kontextem aplikace Spring.

    Stejně jako v kroku č. 1 není tento soubor XML pro Spring HTTP Remoting nic zvláštního, ale místo toho je společný pro téměř všechny zapojení a konfiguraci Spring Framework.

  3. Vytvořit nebo přidat do web.xml soubor.

    Tento třetí krok je prvním krokem, který je konkrétnější pro Spring HTTP Remoting, ale je stále obecně použitelný pro

    Jarní rámec MVC

    . Tento krok zahrnuje přidání třídy servletu a mapování URL, jak se obvykle používá

    Java EE

    servlety

    a

    Stránky JavaServeru

    . Nejdůležitější částí tohoto kroku je specifikovat jaro

    DispatcherServlet

    . V tomto dokumentu je rovněž uveden volitelný „odkaz“

    web.xml

    soubor do umístění kontextové konfigurace, kde je umístěn a používán jeden nebo více souborů kontextu aplikace Spring XML.

  4. Vytvořte kontextový soubor servletu specifického pro jaro.

    Tento soubor XML vypadá hodně jako „normální“ konfigurační soubor XML kontextu aplikace Spring, ale jeho název je předepsán konvencí názvu servletu, za nímž následuje hypen a slovo servlet. Jinými slovy, pokud by byl servlet v systému nazýván „somewebthing“

    web.xml

    soubor, nazval by se tento konfigurační soubor servletu Spring

    somewebthing-servlet.xml

    . Tento soubor obsahuje konfiguraci pro

    HttpInvokerServiceExporter

    (část toho, která je specifická pro HTTP Remoting zahrnutou v této položce blogu) a informace o mapování URL.

  5. Test!

    Ačkoli jednoduchý klient bude psát bez HTTP a bude vypadat, že používá pouze objekty Java, ve skutečnosti bude vyvolávat službu přes HTTP. To se „osvědčí“ spuštěním klienta bez nasazení služby a sledováním výsledného chybového kódu HTTP.

Nyní přejdu k předvedení výše uvedených kroků podrobněji a pokusím se je konkrétně ilustrovat ukázkami kódu.

Krok 1: Fazole a její rozhraní

Tento krok se nijak neliší od definování tříd Java a rozhraní, která implementují pro použití s ​​Spring. Následující výpisy kódu ukazují rozhraní (StateCapitalServiceIF) a implementační třída (StateCapitalService) použitý pro tento příklad.

--- StateCapitalServiceIF.java ---

balíček examples.springhttp; import java.io.Serializable; / ** * Rozhraní státní kapitálové služby, které klient použije pro přístup k * funkcím na straně serveru prostřednictvím protokolu HTTP. * / public interface StateCapitalServiceIF rozšiřuje Serializable {/ ** * Zadejte kapitál státu, jehož název je uveden. * * @param stateName Název státu, jehož kapitál je požadován. * @return kapitál zadaného státu; null, pokud nebyl nalezen. * / public String getCapital (konečný řetězec stateName); } 

--- StateCapitalService.java ---

balíček examples.springhttp; import java.util.Map; / ** * Implementace funkcí, které mají být spuštěny po volání klientem přes * HTTP. * / public class StateCapitalService implementuje StateCapitalServiceIF {Map StatesAndCapitals = null; public StateCapitalService () {} / ** * Nastavit mé státy na mapování hlavních měst. * * @param statesAndCapitals Mapování států na hlavní města. * / public void setStatesAndCapitals (final Map StatesAndCapitals) {this.statesAndCapitals = statesAndCapitals; } / ** * Zadejte hlavní město státu, jehož jméno je uvedeno. * * @param stateName Název státu, jehož kapitál je požadován. * @return kapitál zadaného státu; null, pokud nebyl nalezen. * / public String getCapital (final String stateName) {return this.statesAndCapitals.get (stateName); }} 

Krok 2: Jarní konfigurační soubor aplikace

Rád bych udržoval Springovu specifickou konfiguraci HTTP odděleně od konfigurace XML fazole. Konfigurace fazole je tedy přesně taková, jaká by se běžně viděla u Spring. Konfigurovat StateCapitalService třídy výše se používá následující konfigurace:

--- jaro-http-config.xml ---

Doposud nebylo nic konkrétního pro HTTP Remoting provedeno. Ve skutečnosti by fazole, její rozhraní a konfigurace kontextu aplikace XML mohla být spuštěna normální třídou Java SE, jako je ta, která je uvedena níže:

--- MainServiceAppContext.java ---

balíček examples.springhttp; importovat org.springframework.context.ApplicationContext; importovat org.springframework.context.support.ClassPathXmlApplicationContext; / ** * Ukazuje, jak lze použít Spring bean bez zapojení HTTP. * / public class MainServiceAppContext {public static void printStateInfo (final StateCapitalServiceIF stateCapitalMapper, final String state) {System.out.println ("Hlavní město" + state + "je" + stateCapitalMapper.getCapital (state)); } / ** * @param args argumenty příkazového řádku * / public static void main (String [] args) {final ApplicationContext context = new ClassPathXmlApplicationContext ("examples / springhttp / spring-http-config.xml"); StateCapitalServiceIF stateCapitalMapper = (StateCapitalServiceIF) context.getBean ("stateCapitalService"); printStateInfo (stateCapitalMapper, "Alabama"); printStateInfo (stateCapitalMapper, "Colorado"); }} 

Krok č. 3: web.xml Soubor

Tento web.xml soubor zná každý, kdo vyvinul webovou aplikaci Java EE. The web.xml použitý v tomto příkladu je zobrazen dále.

  Příklad jednoduchého Spring HTTP Remoting To je míněno jako extrémně jednoduchý příklad použití schopnosti Spring HTTP Remoting. StatesCapitals org.springframework.web.servlet.DispatcherServlet 1 StatesCapitals / StatesCapitals org.springframework.web.context.ContextLoaderListener contextConfigLocation /WEB-INF/examples/springhttp/spring-http-config.xml 

Krok č. 4: Kontextový konfigurační soubor servletu

Protože servlet v tomto příkladu má název „statesCapitals“, je pojmenován konfigurační soubor servletu Spring stateCapitals-servlet.xml je třeba poskytnout. Zobrazí se dále:

--- uvádíCapitals-servlet.xml ---

   examples.springhttp.StateCapitalServiceIF httpStateCapitalService 

Krok č. 5: Testování

Musíme nakonfigurovat klienta tak, aby komunikoval přes HTTP s naší aplikací na straně serveru. Konfigurace je obsažena v spring-http-client-config.xml pro tento příklad a je zobrazen dále:

--- spring-http-client-config.xml ---

   // localhost: 8080 / SpringHTTPExample / statesCapitals příklady.springhttp.StateCapitalServiceIF 

Kód klienta, který používá výše uvedený XML k zavádění kontejneru Spring a volání kódu na straně serveru pomocí protokolu HTTP, je ve třídě HttpClient a tento kód se zobrazí dále:

--- HttpClient.java ---

balíček examples.springhttp.client; import examples.springhttp.StateCapitalServiceIF; importovat org.springframework.context.ApplicationContext; importovat org.springframework.context.support.ClassPathXmlApplicationContext; / ** * Tato třída ukazuje klienta jarní služby vystavené HTTP a ukazuje * jak klient interaguje se serverem, jako by používal normální objekty Java *, místo aby používal něco specifického pro HTTP. * / public class HttpClient {public static void printStateInfo (final StateCapitalServiceIF stateCapitalMapper, final String state) {System.out.println ("Hlavní město" + state + "je" + stateCapitalMapper.getCapital (state)); } public static void main (final String [] argumenty) {final ApplicationContext context = new ClassPathXmlApplicationContext ("examples / springhttp / client / spring-http-client-config.xml"); final StateCapitalServiceIF stateCapitalService = (StateCapitalServiceIF) context.getBean ("stateCapitalProxyService"); printStateInfo (stateCapitalService, "Colorado"); printStateInfo (stateCapitalService, "Alabama"); }} 
$config[zx-auto] not found$config[zx-overlay] not found