环境介绍:本文中服务端客户端使用的都是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实例演示的更多相关文章

  1. Java RMI 介绍和例子以及Spring对RMI支持的实际应用实例

    RMI 相关知识 RMI全称是Remote Method Invocation-远程方法调用,Java RMI在JDK1.1中实现的,其威力就体现在它强大的开发分布式网络应用的能力上,是纯Java的网 ...

  2. 转载:Spring+EhCache缓存实例

    转载来自:http://www.cnblogs.com/mxmbk/articles/5162813.html 一.ehcahe的介绍 EhCache 是一个纯Java的进程内缓存框架,具有快速.精干 ...

  3. Spring+EhCache缓存实例

    一.ehcahe的介绍 EhCache 是一个纯Java的进程内缓存框架,具有快速.精干等特点,是Hibernate中默认的CacheProvider.Ehcache是一种广泛使用的开源Java分布式 ...

  4. 审核流(3)低调奢华,简单不凡,实例演示-SNF.WorkFlow--SNF快速开发平台3.1

    下面我们就从什么都没有,结合审核流进行演示实例.从无到有如何快速完美的实现,然而如此简单.低调而奢华,简单而不凡. 从只有数据表通过SNF.CodeGenerator代码生成器快速生成单据并与审核流进 ...

  5. Spring+EhCache缓存实例(详细讲解+源码下载)(转)

    一.ehcahe的介绍 EhCache 是一个纯Java的进程内缓存框架,具有快速.精干等特点,是Hibernate中默认的CacheProvider.Ehcache是一种广泛使用的开源Java分布式 ...

  6. Spring+EhCache缓存实例(详细讲解+源码下载)

    一.ehcahe的介绍 EhCache 是一个纯Java的进程内缓存框架,具有快速.精干等特点,是Hibernate中默认的CacheProvider.Ehcache是一种广泛使用的开源Java分布式 ...

  7. Spring之RMI 远程方法调用 (Remote Method Invocation)

    RMI 指的是远程方法调用 (Remote Method Invocation) 1. RMI的原理: RMI系统结构,在客户端和服务器端都有几层结构. 方法调用从客户对象经占位程序(Stub).远程 ...

  8. Spring+EhCache缓存实例(具体解说+源代码下载)

    一.ehcahe的介绍 EhCache 是一个纯Java的进程内缓存框架,具有高速.精干等特点,是Hibernate中默认的CacheProvider.Ehcache是一种广泛使用的开源Java分布式 ...

  9. 《精通并发与Netty》学习笔记(13 - 解决TCP粘包拆包(一)概念及实例演示)

    一.粘包/拆包概念 TCP是一个“流”协议,所谓流,就是没有界限的一长串二进制数据.TCP作为传输层协议并不不了解上层业务数据的具体含义,它会根据TCP缓冲区的实际情况进行数据包的划分,所以在业务上认 ...

随机推荐

  1. C++ 虚析构(virtual destructor)原理

    注意:本文仅为个人理解,可能有误! 先看一段代码: #include <iostream> using namespace std; class CBase{ public: CBase( ...

  2. 如何获取继承中泛型T的类型

    @SuppressWarnings("unchecked") public void testT() { clazz = (Class<T>)( (Parameteri ...

  3. 用js判断页面是否加载完成

    这可以通过用document.onreadystatechange的方法来监听状态改变, 然后用document.readyState == “complete”判断是否加载完成. 可以采用2个div ...

  4. SET ANSI_NULLS ON 在T-SQL中是什么意思

    from:https://www.cnblogs.com/kekong/p/6731321.html Transact-SQL 支持在与空值进行比较时,允许比较运算符返回 TRUE 或 FALSE. ...

  5. Python 爬取盗墓笔记的标题,章节,章节名称

    # coding:utf-8import requestsimport jsonfrom bs4 import BeautifulSoup user_agent = 'Mozilla/5.0 (Win ...

  6. zoj 3349 dp + 线段树优化

    题目:给出一个序列,找出一个最长的子序列,相邻的两个数的差在d以内. /* 线段树优化dp dp[i]表示前i个数的最长为多少,则dp[i]=max(dp[j]+1) abs(a[i]-a[j])&l ...

  7. 回溯法——最大团问题(Maximum Clique Problem, MCP)

    概述: 最大团问题(Maximum Clique Problem, MCP)是图论中一个经典的组合优化问题,也是一类NP完全问题.最大团问题又称为最大独立集问题(Maximum Independent ...

  8. JavaScript Observer Pattern

    var Users = { list: [], listeners: {}, add: function(name) { this.list.push({name: name}); this.disp ...

  9. iOS 多线程之 NSOperation 的基本使用

    1.NSOperation,NSOperationQueue 简介 NSOperation,NSOperationQueue是苹果提供给我们的一套多线程解决方案.实际上 NSOperation.NSO ...

  10. Python 获取文件路径及文件目录

    import os print (os.path.dirname(__file__)) print (os.path.abspath(__file__)) print (os.path.abspath ...