Spring之rmi实例演示
环境介绍:本文中服务端客户端使用的都是ssm框架,配置文件分为spring_servlet.xml,spring_service.xml,mybatis.xml
在spring里面使用rmi完成远程调用步骤分以下几步:
一、在服务端
1.编写服务端接口
package com.dzf.service;
import java.util.List;
import com.dzf.entity.Author;
public interface RmiServerService {
public List<Author> getAuthorByName(String name);
public Integer insertAuthor(Author author);
}
2.编写具体的实现类
package com.dzf.service; import java.util.List;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;
import org.springframework.transaction.annotation.Transactional;
import com.dzf.dao.AuthorDao;
import com.dzf.entity.Author;
//@Service //这里面不需要自动注入,需要手写bean
public class RmiServerServiceImpl implements RmiServerService { @Autowired
private AuthorDao authorDao; @Override
public List<Author> getAuthorByName(String name) {
// TODO Auto-generated method stub
if(name==null && "".equals(name)){
return null;
}
return authorDao.getAuthorByName(name);
} @Transactional
@Override
public Integer insertAuthor(Author author) {
// TODO Auto-generated method stub
if(author == null){
return null;
}
authorDao.insert(author);
return author.getId(); //返回的插入这条数据的主键值
} }
3.在spring-service.xml中添加服务端的配置
<bean name = "rmiServerService" class="com.dzf.service.RmiServerServiceImpl"></bean>
<bean name="rmiTest" class="org.springframework.remoting.rmi.RmiServiceExporter">
<property name="service" ref="rmiServerService" />
<property name="serviceName" value="rmiServerService" />
<!--这个地方必须写接口的位置全限定名 -->
<property name="serviceInterface" value="com.dzf.service.RmiServerService"/>
<!-- 这个端口不能和项目的端口一样,是个独立的端口 -->
<property name="registryPort" value="8083" />
</bean>
我这里把dao层的写法也贴出来,仅供查考
package com.dzf.dao; import java.util.List; import org.apache.ibatis.annotations.Insert;
import org.apache.ibatis.annotations.Options;
import org.apache.ibatis.annotations.Select;
import org.springframework.stereotype.Repository; import com.dzf.entity.Author; @Repository
public interface AuthorDao { @Select("select * from author t where t.id = #{id}")
public Author getAuthorById(Integer Id); @Select("select * from author t where t.name like concat('%',#{name},'%')")
public List<Author> getAuthorByName(String name); @Insert("insert into author(name,age,tel) values (#{name},#{age},#{tel})")
@Options(useGeneratedKeys=true,keyProperty="id")
public Integer insert(Author author);
}
二、客户端(调用端的配置)
1.编写一个和服务端一模一样的接口
1 package com.dzf.service;
2
3 import java.util.List;
4
5 import com.dzf.entity.Author;
6
7 public interface RmiServerService {
8 public List<Author> getAuthorByName(String name);
9
10 public Integer insertAuthor(Author author);
11 }
2.编写配置文件
<!-- Spring Rmi 客户端配置 -->
<bean id="rmiServerService" class="org.springframework.remoting.rmi.RmiProxyFactoryBean">
<property name="serviceUrl" value="rmi://127.0.0.1:8083/rmiServerService"/>
<property name="serviceInterface" value="com.dzf.rmi.service.RmiServerService"/>
<property name="lookupStubOnStartup" value="false"/>
<property name="refreshStubOnConnectFailure" value="true"></property>
</bean>
3.编写controller层的代码
package com.dzf.rmi.controller; import java.util.List; import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.ResponseBody; import com.dzf.entity.Author;
import com.dzf.rmi.service.RmiServerService; @Controller
@RequestMapping("/rmi")
public class RmiServlet { @Autowired
private RmiServerService rmiServerService; //这个起的名字要和配置文件里面的一样 @RequestMapping("/getAuthorByName")
@ResponseBody
public List<Author> getAuthorByName(){
String name = "a";
return rmiServerService.getAuthorByName(name);
} @RequestMapping("/insert")
@ResponseBody
public Integer insert(){
Author author = new Author();
author.setName("丁");
author.setAge(23);
author.setTel("13033563156");
return rmiServerService.insertAuthor(author);
} }
4.使用接口工具调用
1.

2.

到此可以看到,调用完全没有问题!
总结下:
核心
1.服务端通过org.springframework.remoting.rmi.RmiServiceExporter这个类暴露服务接口
2.服务端和客户端定义同样的接口
3.调用端通过org.springframework.remoting.rmi.RmiProxyFactoryBean调用服务端的暴露的接口
注意:实体类需要实现序列化接口!
Spring之rmi实例演示的更多相关文章
- Java RMI 介绍和例子以及Spring对RMI支持的实际应用实例
RMI 相关知识 RMI全称是Remote Method Invocation-远程方法调用,Java RMI在JDK1.1中实现的,其威力就体现在它强大的开发分布式网络应用的能力上,是纯Java的网 ...
- 转载:Spring+EhCache缓存实例
转载来自:http://www.cnblogs.com/mxmbk/articles/5162813.html 一.ehcahe的介绍 EhCache 是一个纯Java的进程内缓存框架,具有快速.精干 ...
- Spring+EhCache缓存实例
一.ehcahe的介绍 EhCache 是一个纯Java的进程内缓存框架,具有快速.精干等特点,是Hibernate中默认的CacheProvider.Ehcache是一种广泛使用的开源Java分布式 ...
- 审核流(3)低调奢华,简单不凡,实例演示-SNF.WorkFlow--SNF快速开发平台3.1
下面我们就从什么都没有,结合审核流进行演示实例.从无到有如何快速完美的实现,然而如此简单.低调而奢华,简单而不凡. 从只有数据表通过SNF.CodeGenerator代码生成器快速生成单据并与审核流进 ...
- Spring+EhCache缓存实例(详细讲解+源码下载)(转)
一.ehcahe的介绍 EhCache 是一个纯Java的进程内缓存框架,具有快速.精干等特点,是Hibernate中默认的CacheProvider.Ehcache是一种广泛使用的开源Java分布式 ...
- Spring+EhCache缓存实例(详细讲解+源码下载)
一.ehcahe的介绍 EhCache 是一个纯Java的进程内缓存框架,具有快速.精干等特点,是Hibernate中默认的CacheProvider.Ehcache是一种广泛使用的开源Java分布式 ...
- Spring之RMI 远程方法调用 (Remote Method Invocation)
RMI 指的是远程方法调用 (Remote Method Invocation) 1. RMI的原理: RMI系统结构,在客户端和服务器端都有几层结构. 方法调用从客户对象经占位程序(Stub).远程 ...
- Spring+EhCache缓存实例(具体解说+源代码下载)
一.ehcahe的介绍 EhCache 是一个纯Java的进程内缓存框架,具有高速.精干等特点,是Hibernate中默认的CacheProvider.Ehcache是一种广泛使用的开源Java分布式 ...
- 《精通并发与Netty》学习笔记(13 - 解决TCP粘包拆包(一)概念及实例演示)
一.粘包/拆包概念 TCP是一个“流”协议,所谓流,就是没有界限的一长串二进制数据.TCP作为传输层协议并不不了解上层业务数据的具体含义,它会根据TCP缓冲区的实际情况进行数据包的划分,所以在业务上认 ...
随机推荐
- iOS 集成阿里百川最新版(3.1.1.96) 实现淘宝授权登录以及调用淘宝客户端商品详情页
公司最近要做第三方登录,由于是做导购项目,必不可少的有淘宝的授权登录.本来就是一个授权登录,没什么大不了的.但淘宝的无线开放业务——阿里百川更新的最新版本3.1.1.96,开发文档不是不详细,是很 ...
- day10上节内容补充和初始函数
1.上节内容补充 文件的删除和修改: #文件的删除和修改 #文件中全部都要修改 # with open('歌词',encoding='utf-8') as f1,open('歌词.bak','w',e ...
- Unity3d 重力感应
Input.acceleration 加速度 最近一次测量的设备在三维空间中的线性加速度(只读); void Update () { v3=Input.acceleration; } void OnG ...
- Win7系统安装 MySQL 8.0.11
1. 下载 MySQL 8.0.11 版本 下载地址: https://cdn.mysql.com//Downloads/MySQL-8.0/mysql-8.0.11-winx64.zip 2. 下载 ...
- 【BZOJ2226】[Spoj 5971] LCMSum 莫比乌斯反演(欧拉函数?)
[BZOJ2226][Spoj 5971] LCMSum Description Given n, calculate the sum LCM(1,n) + LCM(2,n) + .. + LCM(n ...
- Cocos2d-x Lua Node与Node层级架构
Cocos2d-x Lua采用层级(树形)结构管理场景.层.精灵.菜单.文本.地图和粒子系统等节点(Node)对象.一个场景包含了多个层,一个层又包含多个精灵.菜单.文本.地图和粒子系统等对象.层级结 ...
- 从ELK到EFK
https://my.oschina.net/itshare/blog/775466 http://blog.51cto.com/467754239/1700828 日志系统 日志就是程序产生的,遵循 ...
- 二、docker入门
docker入门 使用场景: 面向产品.面向开发.面向测试.面向运维.面向自动化.面向微服务.面向大规模的分布式架构(微信红包) 虚拟化解决方案: 商业解决方案: VMware vSphere,VMw ...
- eclipse下设置tomcat,修改Java代码不必重启tomcat
1.本文目的:用tomcat进行web开发时,修改Java代码往往要重启代码,当工程较大启动较慢时,严重影响效率,本文通过eclipse下tomcat开发和发布web程序时,对一些Java代码一般修改 ...
- 巨蟒python全栈开发django4:url反向解析图解&&模板渲染2
注意:前端有aaa变量,后端没有aaa变量,存在p标签,但是显示不出来 有p标签,我们可以指定默认值,在没有其他内容的时候 过滤器有60多种,有点多,用到的时候再记和查 结果: 显示是acd 看长度 ...