发表于: 2016-08-31 13:50:37
4 2666
【完成任务】
1. Java RMI (Remote Method Invocation)
见《Java Network Programming》第18章。
链接:http://pan.baidu.com/s/1cBnmNk
先写个RMI HelloWorld感受一下。
(1) 新建一个继承remote的接口
(2) 再来一个继承UnicastRemoteObject的实现类
(3) 然后将实现类的的实例注册到RMI的注册表中
(4) 最后从注册表中拿到该实例。
(5) 启动测试
a) 先运行HelloServer将实例注册到RMI注册表中
b) 然后运行HelloClient拿到实例并运行其方法
(6) 这个过程就像去拿一个代理对象一样,并不复杂。
2. Srping RMI
感谢曹小瞒同学的链接:http://blog.csdn.net/shirdrn/article/details/6359254
Spring 封装了RMI让其的用法更为简便。
(1) 依然新建一个接口,不过不用继承Remote
(2) 然后写个它的实现类,也不用继承UnicastRemoteObject
(3) 再配置一个注册表的信息(server.xml)
(4) 然后写一个启动server的方法
创建一个加载server.xml的spring容器就算是启动server了。
(5) Server端写完了再来写Client端,先得写一个从注册表中拿注册实例的配置文件client.xml
(6) 再写一个main方法拿到实例
(7) 测试
a) 先运行RmiServer
b) 再运行RmiClient
结果如下:
(8) spring整合了JavaRMI,写接口的时候不需要继承Remote,其实现类不用继承UnicastRemoteObject。Spring大法好。
3. SpringMVC + Mybatis +RMI
(1) 首先新建聚合的maven工程。
Packaging选pom。
(2) 新建 core,service 和controller 子项目
新建时选Maven Module
然后Parent Project 选择SpringRMI-Test
(3) 建完过后的工程目录
(4) 我自己写的demo是
Springrmi-student的pom文不需要引jar包
(5) 首先写core的model 和service
Student.class得继承Serializable:
StudentService接口:
(6) 然后写service
因为core和service不再是同一个工程,所以service的pom文件得引入core。
studentDao, StudentServiceImpl, jdbc.properties, log4j.properties 及spring-mybatis的配置和之前的spring-mybatis一样,不再赘述。
不同是的spring配置文件里得加入server的配置。
然后在StartServer里启动server。
(7) 最后controller
按照springmvc的流程走就行了。
先配置web.xml
再配置springrmi-client.xml
Controller跟springmvc-mybatis的写法一毛一样。
写完了事。
(8) 测试
a) 首先把springrmi-student进行 clean install 打包(目前我也不知道为什么),然后对springrmi-student-core进行clean install打包。因为发布springrmi-student-controller的时候需要springrmi-student-core的jar包。
b) 先启动service层的StartServer
c) 再用tomcat启动controller
d) 访问
成功。
能看到这的观众老爷一定是真爱粉。常言道,没demo说个xx。
好哒,RMI+SpirngRMI+SpringMVC-Mybatis-RMI链接如下:
http://pan.baidu.com/s/1o8rRT0I
【遇到问题】
1. Springrmi-student-service 的spring配置文件写成了两个,spring-mybatis.xml(已改成spring-mybatis-server.xml)和server.xml。
然后加载了两个spring容器,从第二个容器中拿到的studentService中studentDao没有注入进去。一直报空指针。
这是因为两个容器分开加载,第二个容器并没有加载spring-mybatis的配置,也没有扫描studentDao。从中拿到的studentService自然就没有studentDao的注入。(晓进进,你害得我一顿好找啊)。
只要将两个xml并成一个,然后从spring容器中过去studentService就OK了。
2. Springrmi-student-controller的web.xml中的Spring监听器没有打开
这个完全是自己挖坑自己跳。
对,监听器一直是被我注释的。
因为我一直以为我配置了contextConfigLocation监听器会默认打开。我擦嘞。
额,因为我之前的springmvc-mybatis就是注释的。
然后启动就一直报创建创建studentController bean 失败,autowird失败。因为我压根就没有加载spring-client.xml的spring容器。(妈个鸡,找了一下午,知道真相的我眼泪掉下来)。
我很好奇我为啥会有配置了contextConfigLocation后会自动启动spring监听器这种想法。
然后我看了看spirngmvc-mybatis的web.xml。
这个项目不需要配置spring监听器就能启动。
看了一会,发现了。
我擦,DispatcherServlet加载的contextConfigLocation和spring容器加载的contextConfigLocation是同一个文件。这个时候不管有没有spring容器的contextConfigLocation工程都能正常访问。
妈个鸡,一直以为是springmvc给自动起了个监听器,再次暴露自己无知的嘴脸。
3. 手贱的我在tomcat的webapp下放了一个没有spring监听器的springrmi-student-controller-0.0.1 -SNAPSHOT.war。
然后不管我怎么改controller里面的东西,报的错都是
我擦勒,当时感觉闯到鬼老哟,controller里面的东西都删完了还报这么个错。
嗯,又找了一下午。
感谢培宇大师兄拯救了我,大师兄最帅。(两次问大师兄的问题都是改这个工程的代码,然后看另一个工程报的错,蠢得发指)。
【目前收获】
1. 改bug的时候实在找不到了,去吃个饭,遛个弯,看个女团,说不定灵感就来了。
2. 弱智的bug是居多滴。
【后续安排】
1. 任务9我来了。
评论