Spring RMI (Spring 远程方法调用)
所需jar包...? 不纠结,一股脑儿全导! 源码地址:http://pan.baidu.com/s/1jG8eOmy
先放结构图如下,客户端和服务端都在一个项目中.也可以把服务端的xxx导成jar包放到新的客户端项目中去.

其中绿色部分为服务器端代码, 红色部分为客户端代码.
现在是服务/客户端全整到一块去的项目,如果要把客户端独立出来,可以把绿色服务器端代码导成jar包放到单独的客户端项目中,用Client.java进行调用.
Client.java: 客户端入口调用类
Car.java: POJO类(C/S共用)
IKeyboard.java: RMI 接口类(C/S共用)
Keyboard.java: RMI实现类
IVehicle.java: RMI接口类(C/S共用)
Vehicl: RMI实现类
remote-client-local.xml: 客户端spring配置文件
remote-servlet.xml: 服务端spring配置文件
1. 服务端
web.xml
<?xml version="1.0" encoding="UTF-8"?>
<web-app xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns="http://java.sun.com/xml/ns/javaee" xsi:schemaLocation="http://java.sun.com/xml/ns/javaee http://java.sun.com/xml/ns/javaee/web-app_2_5.xsd" id="WebApp_ID" version="2.5">
<display-name>SpringRMI</display-name>
<servlet>
<servlet-name>Spring MVC Dispatcher Servlet</servlet-name>
<servlet-class>org.springframework.web.servlet.DispatcherServlet</servlet-class>
<init-param>
<param-name>contextConfigLocation</param-name>
<param-value>classpath*:/remote-servlet.xml</param-value>
</init-param>
<load-on-startup>2</load-on-startup>
</servlet>
<servlet-mapping>
<servlet-name>Spring MVC Dispatcher Servlet</servlet-name>
<url-pattern>/</url-pattern>
</servlet-mapping>
</web-app>
remote-servlet.xml
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE beans PUBLIC "-//SPRING//DTD BEAN//EN" "http://www.springframework.org/dtd/spring-beans.dtd"> <beans> <!-- 交通工具接口-->
<bean id="vehicle" class="com.king.code.service.invoke.Vehicle"/>
<bean name="/vehicle" class="org.springframework.remoting.httpinvoker.HttpInvokerServiceExporter">
<property name="service" ref="vehicle" />
<property name="serviceInterface" value="com.king.code.service.invoke.IVehicle" />
</bean> <!-- 键盘 接口-->
<bean id="keyboard" class="com.king.code.service.invoke.Keyboard"/>
<bean name="/keyboard" class="org.springframework.remoting.httpinvoker.HttpInvokerServiceExporter">
<property name="service" ref="keyboard" />
<property name="serviceInterface" value="com.king.code.service.invoke.IKeyboard" />
</bean>
</beans>
Car.java
package com.king.code.service.invoke;
import java.io.Serializable;
public class Car implements Serializable{
/**
* 车
*/
private static final long serialVersionUID = 1883838732853579826L;
String id="6";
String model ="宝马M6";
String speed ="320公里/小时";
String result ="未检测";
public Car() {
super();
}
public Car(String id, String model, String speed, String result) {
super();
this.id = id;
this.model = model;
this.speed = speed;
this.result = result;
}
public String getId() {
return id;
}
public void setId(String id) {
this.id = id;
}
public String getModel() {
return model;
}
public void setModel(String model) {
this.model = model;
}
public String getSpeed() {
return speed;
}
public void setSpeed(String speed) {
this.speed = speed;
}
public String getResult() {
return result;
}
public void setResult(String result) {
this.result = result;
}
@Override
public String toString() {
return "Car [id=" + id + ", model=" + model + ", speed=" + speed
+ ", result=" + result + "]";
}
}
IKeyboard.java
package com.king.code.service.invoke;
/**
* 键盘服务接口
* @author King
*
*/
public interface IKeyboard {
public String invoke(String requestInfo );
}
Keyboard.java
package com.king.code.service.invoke;
/**
* 键盘服务实现类
* @author King
*
*/
public class Keyboard implements IKeyboard {
@Override
public String invoke(String requestInfo){
System.out.println("press------");
System.out.println(requestInfo);
System.out.println("leave------");
return "success";
}
}
IVehicle.java
package com.king.code.service.invoke; /**
* 交通公具服务接口
* @author King
*
*/
public interface IVehicle {
/**
* 检测该车是否合格
* @param car
* @return
*/
public Car detect(Car car );
}
Vehicle.java
package com.king.code.service.invoke; /**
* 交通公具服务实现类
* @author King
*
*/
public class Vehicle implements IVehicle {
@Override
public Car detect(Car car){
System.out.println("start detect------");
System.out.println("该车信息"+car);
car.setResult("99% is ok");
System.out.println("end detect------");
return car;
} }
2. 客户端
Client.java
package com.king.code.client.invoke; import org.springframework.context.ApplicationContext;
import org.springframework.context.support.ClassPathXmlApplicationContext; import com.king.code.service.invoke.Car;
import com.king.code.service.invoke.IKeyboard;
import com.king.code.service.invoke.IVehicle;
/**
* 客户端调用类
* @author King
*
*/
public class Client {
//读取配置文件
static ApplicationContext context = new ClassPathXmlApplicationContext("remote-client-local.xml"); public static void main(String[] args) {
new Client().invokeKeyboard();
new Client().invokeVehicle();
} public void invokeKeyboard() {
IKeyboard service = (IKeyboard) context.getBean("keyboard");
String requestInfo = "i'm logitech keyboard,press twice";
String responseInfo = service.invoke(requestInfo);
System.out.println(responseInfo);
} public void invokeVehicle() {
IVehicle service = (IVehicle) context.getBean("vehicle");
Car request = new Car();
System.out.println("该车状态(检测前):"+request.getResult());
Car response = service.detect(request);
System.out.println("该车状态(检测后):"+response.getResult());
} }
remote-client-local.xml
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE beans PUBLIC "-//SPRING//DTD BEAN//EN" "http://www.springframework.org/dtd/spring-beans.dtd"> <beans> <!-- 交通工具接口 -->
<bean id="vehicle"
class="org.springframework.remoting.httpinvoker.HttpInvokerProxyFactoryBean">
<property name="serviceUrl">
<value>http://localhost:8080/SpringRMI/vehicle</value>
</property>
<property name="serviceInterface">
<value>com.king.code.service.invoke.IVehicle</value>
</property>
</bean> <!-- 键盘接口 -->
<bean id="keyboard"
class="org.springframework.remoting.httpinvoker.HttpInvokerProxyFactoryBean">
<property name="serviceUrl">
<value>http://localhost:8080/SpringRMI/keyboard</value>
</property>
<property name="serviceInterface">
<value>com.king.code.service.invoke.IKeyboard</value>
</property>
</bean> </beans>
客户端打印:
success
该车状态(检测前):未检测
该车状态(检测后):99% is ok
服务端打印:
press------
i'm logitech keyboard,press twice
leave------
start detect------
该车信息Car [id=6, model=宝马M6, speed=320公里/小时, result=未检测]
end detect------
Spring RMI (Spring 远程方法调用)的更多相关文章
- Spring RMI (Spring 远程方法调用)【原】
所需jar包...? 不纠结,一股脑儿全导! 源码地址:http://pan.baidu.com/s/1jG8eOmy 先放结构图如下,客户端和服务端都在一个项目中.也可以把服务端的xxx导成j ...
- Java bean与Spring、Spring MVC关系
Java Bean Java语言欠缺属性.事件.多重继承功能.所以,如果要在Java程序中实现一些面向对象编程的常见需求,只能手写大量胶水代码.Java Bean正是编写这套胶水代码的惯用模式或约定. ...
- 深入分析Spring 与 Spring MVC容器
1 Spring MVC WEB配置 Spring Framework本身没有Web功能,Spring MVC使用WebApplicationContext类扩展ApplicationContext, ...
- spring/spring boot/spring cloud开发总结
背景 针对RPC远程调用,都在使用dubbo.dubbox等,我们也是如此.由于社区暂停维护.应对未来发展,我们准备尝试新技术(或许这时候也不算什么新技术了吧),选择使用了spring ...
- Spring 系列: Spring 框架简介 -7个部分
Spring 系列: Spring 框架简介 Spring AOP 和 IOC 容器入门 在这由三部分组成的介绍 Spring 框架的系列文章的第一期中,将开始学习如何用 Spring 技术构建轻量级 ...
- Maven+Spring MVC Spring Mybatis配置
环境: Eclipse Neon JDK1.8.0 Tomcat8.0 先决条件: Eclipse先用maven向导创建web工程.参见本站之前随笔. 本机安装完成mysql5:新建用户xuxy03设 ...
- [原创]java WEB学习笔记109:Spring学习---spring中事物管理
博客的目的:①总结自己的学习过程,相当于学习笔记 ②将自己的经验分享给大家,相互学习,互相交流,不可商用 内容难免出现问题,欢迎指正,交流,探讨,可以留言,也可以通过以下方式联系. 本人互联网技术爱好 ...
- 手动创建Spring项目 Spring framework
之前学习框架一直是看的视频教程,并且在都配套有项目源码,跟着视频敲代码总是很简单,现在想深入了解,自己从官网下载文件手动搭建,就遇到了很多问题记载如下. 首先熟悉一下spring的官方网站:http: ...
- [Spring框架]Spring AOP基础入门总结二:Spring基于AspectJ的AOP的开发.
前言: 在上一篇中: [Spring框架]Spring AOP基础入门总结一. 中 我们已经知道了一个Spring AOP程序是如何开发的, 在这里呢我们将基于AspectJ来进行AOP 的总结和学习 ...
随机推荐
- [原创]cocos2d-x研习录-第二阶 概念类之节点类(CCNode)
节点类CCNode在基本概念中并不存在,它是为了建立基本概念之间的关联关系而抽象出来的中间辅助类.这个类在Cocos2D-x中极为重要,它为概念类之间搭建了一座宏伟的桥梁.它的继承关系图如下: ...
- truncate有外键约束的表,报ORA-02266处理。
问题描述:当父表有子表的外键约束时,无法直接truncate父表.报ORA-02266: unique/primary keys in table referenced by enabled fore ...
- foreach属性-动态-mybatis中使用map类型参数,其中key为列名,value为列值
http://zhangxiong0301.iteye.com/blog/2242723 最近有个需求,就是使用mybatis时,向mysql中插入数据,其参数为map类型,map里面的key为列名, ...
- State Machine.(状态机)
What is a State Machine? Any device that changes its state from one to another due to some actions a ...
- ADF_Starting系列7_使用EJB/JPA/JSF通过ADF构建Web应用程序之创建UI View
2013-05-01 Created By BaoXinjian
- int和NSInteger区别
NSInteger会自动根据操作系统的位数(32或者64位)返回最大的类型 查到c语言中,int和long的字节数是和操作系统指针所占位数相等. 但c语言中说,long的长度永远大于或等于int ob ...
- IDEA中PlantUML的使用
PlantUML官网地址:http://www.plantuml.com/ IDEA中安装PlantUML Plugins File-->Settings-->Plugins-->I ...
- 使用CSS和jQuery实现对话框
因为项目中要显示一些对话框,但用alert显得太丑,后从网上找了一些插件,但有觉得不好用,因此自己试用CSS和jQuery写了一个对话框,代码如下: <!DOCTYPE html> < ...
- 配置VS使用winteracter
一.winteracter是什么?为什么要用VS代替wide?winteracter 是一款强大的 Fortran 图形界面函数库,可方便的用 Fortran 生成GUI界面,对话框,菜单,绘图等操作 ...
- The prefix "context" for element "context:component-scan" is not bound.
在beans里面加上下面信息: xmlns:context="http://www.springframework.org/schema/context" xsi:schemaLo ...