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缓冲区的实际情况进行数据包的划分,所以在业务上认 ...
随机推荐
- C++ 虚析构(virtual destructor)原理
注意:本文仅为个人理解,可能有误! 先看一段代码: #include <iostream> using namespace std; class CBase{ public: CBase( ...
- 如何获取继承中泛型T的类型
@SuppressWarnings("unchecked") public void testT() { clazz = (Class<T>)( (Parameteri ...
- 用js判断页面是否加载完成
这可以通过用document.onreadystatechange的方法来监听状态改变, 然后用document.readyState == “complete”判断是否加载完成. 可以采用2个div ...
- SET ANSI_NULLS ON 在T-SQL中是什么意思
from:https://www.cnblogs.com/kekong/p/6731321.html Transact-SQL 支持在与空值进行比较时,允许比较运算符返回 TRUE 或 FALSE. ...
- Python 爬取盗墓笔记的标题,章节,章节名称
# coding:utf-8import requestsimport jsonfrom bs4 import BeautifulSoup user_agent = 'Mozilla/5.0 (Win ...
- zoj 3349 dp + 线段树优化
题目:给出一个序列,找出一个最长的子序列,相邻的两个数的差在d以内. /* 线段树优化dp dp[i]表示前i个数的最长为多少,则dp[i]=max(dp[j]+1) abs(a[i]-a[j])&l ...
- 回溯法——最大团问题(Maximum Clique Problem, MCP)
概述: 最大团问题(Maximum Clique Problem, MCP)是图论中一个经典的组合优化问题,也是一类NP完全问题.最大团问题又称为最大独立集问题(Maximum Independent ...
- JavaScript Observer Pattern
var Users = { list: [], listeners: {}, add: function(name) { this.list.push({name: name}); this.disp ...
- iOS 多线程之 NSOperation 的基本使用
1.NSOperation,NSOperationQueue 简介 NSOperation,NSOperationQueue是苹果提供给我们的一套多线程解决方案.实际上 NSOperation.NSO ...
- Python 获取文件路径及文件目录
import os print (os.path.dirname(__file__)) print (os.path.abspath(__file__)) print (os.path.abspath ...