Spring provides its own implementation of remoting service known as HttpInvoker. It can be used for http request than RMI and works well across the firewall.

By the help of HttpInvokerServiceExporter and HttpInvokerProxyFactoryBean classes, we can implement the remoting service provided by Spring's Http Invokers.


Http Invoker and Other Remoting techniques

You can use many Remoting techniques, let's see which one can be best for you.

Http Invoker Vs RMI

RMI uses JRMP protocol whereas Http Invokes uses HTTP protocol. Since enterprise applications mostly use http protocol, it is the better to use HTTP Invoker. RMI also has some security issues than HTTP Invoker. HTTP Invoker works well across firewalls.

Http Invoker Vs Hessian and Burlap

HTTP Invoker is the part of Spring framework but Hessian and burlap are proprietary. All works well across firewall. Hessian and Burlap are portable to integrate with other languages such as .Net and PHP but HTTP Invoker cannot be.


Example of Spring HTTP Invoker

To create a simple spring's HTTP invoker application, you need to create following files.

  1. Calculation.java
  2. CalculationImpl.java
  3. web.xml
  4. httpInvoker-servlet.xml
  5. client-beans.xml
  6. Client.java

1) Calculation.java

It is the simple interface containing one method cube.

  1. package com.javatpoint;
  2. public interface Calculation {
  3. int cube(int number);
  4. }

2) CalculationImpl.java

This class provides the implementation of Calculation interface.

  1. package com.javatpoint;
  2. public class CalculationImpl implements Calculation{
  3. public int cube(int number) {
  4. return number*number*number;
  5. }
  6. }

3) web.xml

In this xml file, we are defining DispatcherServlet as the front controller. If any request is followed by .http extension, it will be forwarded to DispatcherServlet.

  1. <?xml version="1.0" encoding="UTF-8"?>
  2. <web-app version="2.5"
  3. xmlns="http://java.sun.com/xml/ns/javaee"
  4. xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
  5. xsi:schemaLocation="http://java.sun.com/xml/ns/javaee
  6. http://java.sun.com/xml/ns/javaee/web-app_2_5.xsd">
  7. <servlet>
  8. <servlet-name>httpInvoker</servlet-name>
  9. <servlet-class>org.springframework.web.servlet.DispatcherServlet</servlet-class>
  10. <load-on-startup>1</load-on-startup>
  11. </servlet>
  12. <servlet-mapping>
  13. <servlet-name>httpInvoker</servlet-name>
  14. <url-pattern>*.http</url-pattern>
  15. </servlet-mapping>
  16. </web-app>

4) httpInvoker-servlet.xml

It must be created inside the WEB-INF folder. Its name must be servletname-servlet.xml. It defines bean forCalculationImpl and HttpInvokerServiceExporter.

  1. <?xml version="1.0" encoding="UTF-8"?>
  2. <beans xmlns="http://www.springframework.org/schema/beans"
  3. xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
  4. xsi:schemaLocation="http://www.springframework.org/schema/beans
  5. http://www.springframework.org/schema/beans/spring-beans.xsd">
  6. <bean id="calculationBean" class="com.javatpoint.CalculationImpl"></bean>
  7. <bean name="/Calculation.http"
  8. class="org.springframework.remoting.httpinvoker.HttpInvokerServiceExporter">
  9. <property name="service" ref="calculationBean"></property>
  10. <property name="serviceInterface" value="com.javatpoint.Calculation"></property>
  11. </bean>
  12. </beans>

5) client-beans.xml

In this xml file, we are defining bean for HttpInvokerProxyFactoryBean. You need to define two properties of this class.

  1. serviceUrl
  2. serviceInterface
  1. <?xml version="1.0" encoding="UTF-8"?>
  2. <beans xmlns="http://www.springframework.org/schema/beans"
  3. xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
  4. xsi:schemaLocation="http://www.springframework.org/schema/beans
  5. http://www.springframework.org/schema/beans/spring-beans.xsd">
  6. <bean id="calculationBean"
  7. class="org.springframework.remoting.httpinvoker.HttpInvokerProxyFactoryBean">
  8. <property name="serviceUrl"
  9. value="http://localhost:8888/httpinvoker/Calculation.http"></property>
  10. <property name="serviceInterface" value="com.javatpoint.Calculation"></property>
  11. </bean>
  12. </beans>

6) Client.java

This class gets the instance of Calculation and calls the method.

  1. package com.javatpoint;
  2. import org.springframework.context.ApplicationContext;
  3. import org.springframework.context.support.ClassPathXmlApplicationContext;
  4. public class Client {
  5. public static void main(String[] args){
  6. ApplicationContext context = new ClassPathXmlApplicationContext("client-beans.xml");
  7. Calculation calculation = (Calculation)context.getBean("calculationBean");
  8. System.out.println(calculation.cube(5));
  9. }
  10. }

Output

  1. Output: 125

How to run this example

Start and deploy the project, here we are assuming that server is running on 8888 port number. If the port number is different, change the serviceURL in client-beans.xml.

Then, Compile and Run the Client.java file.


Web-based Client

In the example given above, we used console based client. We can also use web based client. You need to create 3 additional files. Here, we are using following files:

  1. ClientInvoker.java
  2. index.jsp
  3. process.jsp

ClientInvoker.java

It defines only one method getCube() that returns cube of the given number

  1. package com.javatpoint;
  2. import org.springframework.context.ApplicationContext;
  3. import org.springframework.context.support.ClassPathXmlApplicationContext;
  4. public class ClientInvoker {
  5. public static int getCube(int number){
  6. ApplicationContext context = new ClassPathXmlApplicationContext("client-beans.xml");
  7. Calculation calculation = (Calculation)context.getBean("calculationBean");
  8. return calculation.cube(number);
  9. }
  10. }

index.jsp

It creates a form to get number.

  1. <form action="process.jsp">
  2. Enter Number:<input type="text" name="number"/>
  3. <input type="submit" value="cube" />
  4. </form>

process.jsp

It creates a form to get number.

  1. <jsp:include page="index.jsp"></jsp:include>
  2. <hr/>
  3. <%@page import="com.javatpoint.ClientInvoker"%>
  4. <%
  5. int number=Integer.parseInt(request.getParameter("number"));
  6. out.print("cube of "+number+" is: "+ClientInvoker.getCube(number));
  7. %>

Output

reference from:http://www.javatpoint.com/spring-remoting-by-http-invoker-example

Spring Remoting by HTTP Invoker Example--reference的更多相关文章

  1. Spring Remoting: Remote Method Invocation (RMI)--转

    原文地址:http://www.studytrails.com/frameworks/spring/spring-remoting-rmi.jsp Concept Overview Spring pr ...

  2. Spring Remoting: HTTP Invoker--转

    原文地址:http://www.studytrails.com/frameworks/spring/spring-remoting-http-invoker.jsp Concept Overview ...

  3. Lingo (Spring Remoting) : Passing client credentials to the server

    http://www.jroller.com/sjivan/entry/lingo_spring_remoting_passing_client Lingo (Spring Remoting) : P ...

  4. Spring Remoting: Burlap--转

    原文地址:http://www.studytrails.com/frameworks/spring/spring-remoting-burlap.jsp Concept Overview In the ...

  5. Spring Remoting: Hessian--转

    原文地址:http://www.studytrails.com/frameworks/spring/spring-remoting-hessian.jsp Concept Overview The p ...

  6. Asynchronous calls and remote callbacks using Lingo Spring Remoting

    http://www.jroller.com/sjivan/entry/asynchronous_calls_and_callbacks_using Asynchronous calls and re ...

  7. Spring Framework 4.3.22.RELEASE Reference文档目录

    <Spring Framework Reference Documentation 4.3.22.RELEASE> https://docs.spring.io/spring/docs/4 ...

  8. spring remoting源码分析--Hessian分析

    1. Caucho 1.1 概况 spring-remoting代码的情况如下: 本节近分析caucho模块. 1.2 分类 其中以hession为例,Hessian远程服务调用过程: Hessian ...

  9. Spring Remoting: Hessian

随机推荐

  1. [JS] save txt file

    (function () { var blob = new Blob(['content'], {type: 'text/plain; charset=utf-8'}), blobUrl = URL. ...

  2. tomcat中有关配置文件的说明

    在以往的tomcat使用中本人一直都没有注意到tomcat的conf目录下配置文件的作用,都是"拿来主义"的思想,从未深究.但是最近遇到很多有关tomcat配置的问题,很是头大,所 ...

  3. Linux小知识点汇总

        1.crontab    (1)crontab每10秒执行一次  * * * * * /bin/date >>/tmp/date.txt  * * * * * sleep 10; ...

  4. C++ Primer 5th 第16章 模板与泛型编程

    模板是C++中泛型编程的基础,一个模板就是创建一个类或者函数的蓝图或者说公式. C++模板分为函数模板和类模板. 类模板则可以是整个类是个模板,类的某个成员函数是个模板,以及类本身和成员函数分别是不同 ...

  5. .NET,你真的 知道了吗

    搞清自己是干什么的 有人问你是做什么的,回答是:"我是做,NET开发的",有的人也会问:"那.NER.是什么?"刚开始我认为是一个开打工具,后认为是一个平台,一 ...

  6. MYSQL一对多,两表查询合并数据

    select a.askid,a.title,GROUP_CONCAT(b.message SEPARATOR '----') as content from gg_ask as a join gg_ ...

  7. wamp虚拟机配置

    1.找到httpd.conf 里面:找到 # Virtual hosts 开启虚拟机Include conf/extra/httpd-vhosts.conf 2  编辑httpd-vhosts.con ...

  8. 基于memcached中命令分析函数tokenize_command改造的split函数

    今天使用C重构php代码,需要手写一个split函数,于是就模仿memcached中获取用户命令的函数 static size_t tokenize_command(char *command, to ...

  9. centos下安装cdh5

    http://www.aboutyun.com/thread-9075-1-1.html 基本参考这个   yum clean all yum update     1.保证selinux关闭  /e ...

  10. webpack资料

    https://zhuanlan.zhihu.com/p/20367175?columnSlug=FrontendMagazine http://www.cnblogs.com/tugenhua070 ...