Contoh Simple Spring HTTP Remoting

Saya menggunakan entri blog ini untuk mendemonstrasikan dengan contoh sederhana penggunaan HTTP Remoting dari Spring Framework. Ada banyak sumber online tentang hal ini, jadi maksud saya di sini adalah untuk memberikan demonstrasi yang sangat sederhana namun lengkap menggunakan Spring's HTTP Remoting dengan klien non-browser.

Pendekatan Spring untuk HTTP Remoting memungkinkan klien untuk berkomunikasi dengan kode server yang dihosting Spring melalui HTTP tanpa kode klien yang memerlukan pengetahuan apa pun tentang HTTP yang digunakan. Sebaliknya, kode Java klien hanya "melihat" objek Java terkait bisnis normal (biasanya antarmuka) daripada objek khusus HTTP.

Spring HTTP Remoting umumnya membutuhkan Spring dan Java di sisi server dan sisi klien. Namun, jika kedua persyaratan tersebut dapat dipenuhi, Spring HTTP Remoting dapat dengan mudah diterapkan.

Langkah-langkah berikut memungkinkan komunikasi HTTP antara klien dan server yang dihosting Spring. Setelah menguraikan langkah-langkahnya secara singkat, saya akan mempelajarinya lebih detail (termasuk contoh kode).

  1. Buat atau gunakan Spring bean yang biasanya mengimplementasikan antarmuka Java.

    Ini tidak istimewa untuk remot HTTP dan merupakan langkah yang sama yang perlu Anda ambil untuk melakukan banyak hal di Spring (pengecualian penting adalah

    Musim semi JDBC

    yang tidak membutuhkan kacang pegas untuk digunakan).

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

    Seperti Langkah # 1, file XML ini tidak khusus untuk Spring HTTP Remoting, tetapi umum untuk hampir semua pengkabelan dan konfigurasi Spring Framework.

  3. Buat atau tambahkan ke web.xmlfile.

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

    Kerangka MVC musim semi

    . Langkah ini termasuk menambahkan kelas servlet dan pemetaan URL seperti yang biasanya digunakan dengan

    Java EE

    servlet

    dan

    Halaman JavaServer

    . Bagian terpenting dari langkah ini adalah menentukan Musim Semi

    DispatcherServlet

    . "Tautan" opsional juga disediakan di sini

    web.xml

    file ke lokasi konfigurasi konteks di mana satu atau lebih file konteks aplikasi Spring XML berada dan digunakan.

  4. Buat file konteks servlet khusus Spring.

    File XML ini terlihat sangat mirip dengan file konfigurasi XML konteks aplikasi Spring "normal", tetapi namanya ditentukan oleh konvensi nama servlet diikuti dengan tanda hubung dan kata servlet. Dengan kata lain, jika servlet disebut "sesuatu" di file

    web.xml

    file, file konfigurasi servlet Spring ini akan dipanggil

    somewebthing-servlet.xml

    . File ini berisi konfigurasi untuk

    HttpInvokerServiceExporter

    (bagian dari ini yang khusus untuk HTTP Remoting tercakup dalam entri blog ini) dan informasi pemetaan URL.

  5. Uji!

    Meskipun klien sederhana akan menulis tanpa HTTP dalam pikiran dan akan tampak hanya menggunakan objek Java, itu sebenarnya akan memanggil layanan melalui HTTP. Ini akan "dibuktikan" dengan menjalankan klien tanpa menerapkan layanan dan mengawasi kode kesalahan HTTP yang dihasilkan.

Sekarang saya akan beralih ke mendemonstrasikan langkah-langkah di atas secara lebih rinci dan mencoba mengilustrasikannya secara konkret dengan sampel kode.

Langkah # 1: Bean dan Antarmuka

Langkah ini tidak berbeda dengan menentukan kelas dan antarmuka Java yang mereka implementasikan untuk digunakan dengan Spring. Daftar kode berikut menunjukkan antarmuka ( 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: File Konfigurasi Konteks Aplikasi Pegas

Saya ingin menjaga konfigurasi khusus HTTP Spring terpisah dari konfigurasi XML kacang. Oleh karena itu, konfigurasi bean persis seperti yang biasa dilihat pada Spring. Untuk mengkonfigurasi StateCapitalServicekelas di atas, konfigurasi berikut digunakan:

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


    

Sejauh ini, tidak ada yang spesifik untuk HTTP Remoting yang telah dilakukan. Faktanya, kacang, antarmuka, dan konfigurasi konteks aplikasi XML-nya semuanya dapat dijalankan oleh kelas Java SE normal seperti yang ditunjukkan di bawah ini:

--- 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.xmlFile

Ini web.xmlfile akrab bagi siapa saja yang telah mengembangkan aplikasi web Java EE. Yang web.xmldigunakan dalam contoh ini ditampilkan berikutnya.


    
      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: File Konfigurasi Konteks Servlet

Karena servlet dalam contoh ini bernama "StatesCapitals", file konfigurasi servlet Spring dengan nama statesCapitals-servlet.xmlperlu disediakan. Ini ditunjukkan berikut ini:

--- stateCapitals-servlet.xml ---


    
      examples.springhttp.StateCapitalServiceIF httpStateCapitalService 
    

Langkah # 5: Mengujinya

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

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


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

Kode klien yang menggunakan XML di atas untuk mem-bootstrap wadah Spring dan memanggil kode sisi server melalui HTTP ada di kelas HttpClientdan kode itu ditampilkan berikutnya:

--- 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"); } }