Contoh Pemulihan HTTP Musim Semi yang Sederhana

Saya menggunakan entri blog ini untuk menunjukkan dengan contoh sederhana penggunaan HTTP Remoting Spring Framework. Terdapat banyak sumber dalam talian mengenai perkara ini, jadi tujuan saya di sini adalah untuk memberikan demonstrasi yang sangat mudah tetapi lengkap menggunakan Spring HTTP Remoting dengan pelanggan bukan penyemak imbas.

Pendekatan Spring untuk HTTP Remoting membolehkan klien berkomunikasi dengan kod pelayan yang dihoskan oleh Spring melalui HTTP tanpa kod pelanggan yang memerlukan pengetahuan mengenai HTTP yang digunakan. Sebaliknya, kod Java klien hanya "melihat" objek Java yang berkaitan dengan perniagaan biasa (biasanya antara muka) dan bukan objek khusus HTTP.

Spring HTTP Remoting umumnya memerlukan Spring dan Java di kedua-dua pelayan dan pelanggan. Namun, jika kedua-dua syarat tersebut dapat dipenuhi, Spring HTTP Remoting dapat diterapkan dengan mudah.

Langkah-langkah berikut membenarkan komunikasi HTTP antara klien dan pelayan yang dihoskan oleh Spring. Setelah terlebih dahulu menguraikan langkah-langkahnya secara ringkas, saya akan membahasnya dengan lebih terperinci (termasuk contoh kod).

  1. Buat atau gunakan Spring bean yang ada yang biasanya menggunakan antara muka Java.

    Ini bukan sesuatu yang istimewa untuk pemindahan semula HTTP dan merupakan langkah yang sama yang perlu anda lakukan untuk melakukan banyak perkara pada musim bunga (pengecualian

    Musim bunga JDBC

    yang tidak memerlukan kacang Spring untuk digunakan).

  2. Buat fail konfigurasi Spring XML untuk mengaitkan kacang yang dibuat pada langkah # 1 dengan konteks aplikasi Spring.

    Seperti Langkah # 1, fail XML ini tidak khusus untuk Spring HTTP Remoting, tetapi biasa untuk hampir semua pendawaian dan konfigurasi Spring Framework.

  3. Buat atau tambah ke web.xmlfail.

    Langkah ketiga ini adalah langkah pertama yang lebih khusus untuk Spring HTTP Remoting, tetapi masih berlaku dengan

    Rangka kerja Spring MVC

    . Langkah ini merangkumi menambahkan kelas servlet dan pemetaan URL seperti yang biasa digunakan

    Java EE

    servlet

    dan

    Halaman JavaServer

    . Bahagian terpenting dari langkah ini adalah menentukan Musim Bunga

    DispatcherServlet

    . "Pautan" pilihan juga disediakan dalam ini

    web.xml

    fail ke lokasi konfigurasi konteks di mana satu atau lebih fail konteks aplikasi Spring XML terletak dan digunakan.

  4. Buat fail konteks servlet khusus Spring.

    Fail XML ini mirip seperti fail konfigurasi XML konteks aplikasi Spring yang "normal", tetapi namanya ditentukan oleh konvensyen nama servlet diikuti dengan tanda hubung dan kata servlet. Dengan kata lain, jika servlet disebut "anyebthing" di

    web.xml

    fail, fail konfigurasi servlet Spring ini akan dipanggil

    somewebthing-servlet.xml

    . Fail ini mengandungi konfigurasi untuk

    HttpInvokerServiceExporter

    (bahagian ini khusus untuk HTTP Remoting yang diliputi dalam entri blog ini) dan maklumat pemetaan URL.

  5. Uji!

    Walaupun pelanggan sederhana akan menulis tanpa mempertimbangkan HTTP dan nampaknya hanya menggunakan objek Java, ia sebenarnya akan menggunakan perkhidmatan melalui HTTP. Ini akan "terbukti" dengan menjalankan klien tanpa perkhidmatan digunakan dan memerhatikan kod ralat HTTP yang dihasilkan.

Sekarang saya akan terus menunjukkan langkah-langkah di atas dengan lebih terperinci dan berusaha menggambarkannya secara konkrit dengan contoh kod.

Langkah # 1: Kacang dan Antaranya

Langkah ini tidak berbeza dengan menentukan kelas Java dan antaramuka yang mereka laksanakan untuk digunakan dengan Spring. Senarai kod berikut menunjukkan antara muka ( StateCapitalServiceIF) dan kelas pelaksana ( StateCapitalService) yang digunakan untuk contoh ini.

--- StateCapitalServiceIF.java ---

package examples.springhttp; import java.io.Serializable; /** * The State Capital Service interface that the client will use to access * server-side functionality via HTTP. */ public interface StateCapitalServiceIF extends Serializable { /** * Provide capital of state whose name is provided. * * @param stateName Name of state whose capital is desired. * @return Capital of the specified state; null if not found. */ public String getCapital(final String stateName); } 

--- StateCapitalService.java ---

package examples.springhttp; import java.util.Map; /** * Implementation of functionality to be run after being called by client via * HTTP. */ public class StateCapitalService implements StateCapitalServiceIF { Map statesAndCapitals = null; public StateCapitalService() { } /** * Set my states to state capitals mapping. * * @param statesAndCapitals States to state capitals mapping. */ public void setStatesAndCapitals(final Map statesAndCapitals) { this.statesAndCapitals = statesAndCapitals; } /** * Provide capital of state whose name is provided. * * @param stateName Name of state whose capital is desired. * @return Capital of the specified state; null if not found. */ public String getCapital(final String stateName) { return this.statesAndCapitals.get(stateName); } } 

Langkah # 2: Fail Konfigurasi Konteks Aplikasi Spring

Saya ingin memastikan konfigurasi khusus HTTP Spring terpisah dari konfigurasi XML kacang. Oleh itu, konfigurasi kacang sama seperti yang biasa dilihat oleh Spring. Untuk mengkonfigurasi StateCapitalServicekelas di atas, konfigurasi berikut digunakan:

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


    

Setakat ini, tiada perkara khusus untuk HTTP Remoting yang dilakukan. Sebenarnya, kacang, antaramuka, dan konfigurasi konteks aplikasi XMLnya semuanya dapat dijalankan oleh kelas Java SE biasa seperti yang ditunjukkan di bawah:

--- MainServiceAppContext.java ---

package examples.springhttp; import org.springframework.context.ApplicationContext; import org.springframework.context.support.ClassPathXmlApplicationContext; /** * Demonstrates how Spring bean can be used without any HTTP involvement. */ public class MainServiceAppContext { public static void printStateInfo( final StateCapitalServiceIF stateCapitalMapper, final String state) { System.out.println( "The capital of " + state + " is " + stateCapitalMapper.getCapital(state)); } /** * @param args the command line arguments */ 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"); } } 

Langkah # 3: web.xmlFail

Ini web.xmlfail adalah biasa kepada sesiapa yang telah membangunkan aplikasi web Java EE. Yang web.xmldigunakan dalam contoh ini ditunjukkan seterusnya.


    
      Simple Spring HTTP Remoting Example This is meant as an extremely simple example of using Spring's HTTP Remoting capability. statesCapitals org.springframework.web.servlet.DispatcherServlet 1 statesCapitals /statesCapitals org.springframework.web.context.ContextLoaderListener contextConfigLocation /WEB-INF/examples/springhttp/spring-http-config.xml 
    

Langkah # 4: Fail Konfigurasi Konteks Servlet

Kerana servlet dalam contoh ini dinamakan "StatesCapitals," fail konfigurasi servlet Spring yang statesCapitals-servlet.xmlperlu diberi. Ia ditunjukkan seterusnya:

--- StatesCapitals-servlet.xml ---


    
      examples.springhttp.StateCapitalServiceIF httpStateCapitalService 
    

Langkah # 5: Mengujinya

Kita perlu mengkonfigurasi klien untuk berkomunikasi melalui HTTP dengan aplikasi sisi pelayan kita. Konfigurasi untuk ini terdapat dalam spring-http-client-config.xmlcontoh ini dan ditunjukkan seterusnya:

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


    
      //localhost:8080/SpringHTTPExample/statesCapitals examples.springhttp.StateCapitalServiceIF 
    

Kod klien yang menggunakan XML di atas untuk boot container Spring dan memanggil kod sisi pelayan melalui HTTP ada di kelas HttpClientdan kod tersebut ditunjukkan seterusnya:

--- HttpClient.java ---

package examples.springhttp.client; import examples.springhttp.StateCapitalServiceIF; import org.springframework.context.ApplicationContext; import org.springframework.context.support.ClassPathXmlApplicationContext; /** * This class demonstrates a client of a Spring HTTP-exposed service and shows * how the client interacts with the server as if using normal Java objects * rather than using anything HTTP specific. */ public class HttpClient { public static void printStateInfo( final StateCapitalServiceIF stateCapitalMapper, final String state) { System.out.println( "The capital of " + state + " is " + stateCapitalMapper.getCapital(state)); } public static void main(final String[] arguments) { 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"); } }