首发:个人博客
必须说明:这篇博文只用于自己记录,使用spring的websocket支持一定要看官方文档,权威又简明,不推荐看不专业又啰嗦的国产博文。
已尝试了两种方法,当然,不管哪种方法都要先添加maven依赖:
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-websocket</artifactId>
</dependency>
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-messaging</artifactId>
</dependency><dependency>
<groupId>javax.websocket</groupId>
<artifactId>javax.websocket-api</artifactId>
<version>1.0</version>
</dependency>
第一种方法,对应文档中的25.2这一节:
1)声明个Handler组件:
@Component
public class MyHandler extends TextWebSocketHandler {@Override
public void handleTextMessage(WebSocketSession session, TextMessage message) {
try {
session.sendMessage(message);
} catch (IOException e) {
e.printStackTrace();
}
}}
2)在spring配置文件中配置该组件,注意要写在springmvc的配置文件中而不是spring主配置文件中:
<!-- websocket配置1 -->
<websocket:handlers>
<websocket:mapping path="/myHandler" handler="myHandler"/>
</websocket:handlers>
当然,添加这段配置之前要在xml的根节点beans节点上补充这个声明让spring认识websocket前缀:
xmlns:websocket="http://www.springframework.org/schema/websocket"
3)这就OK了
第二种方法,对应文档中的25.4这一节:
实际是参考了官方的引导文档(一定要看),然后基于参考手册把java配置改为xml配置了。
1)在某个controller中声明:
@MessageMapping("/say")
@SendTo("/topic/greetings")
public String greeting(String message) throws Exception {
return message;
}
2)在springmvc配置文件中添加:
<websocket:message-broker application-destination-prefix="/app">
<websocket:stomp-endpoint path="/hello">
<websocket:sockjs />
</websocket:stomp-endpoint>
<websocket:simple-broker prefix="/topic" />
</websocket:message-broker>
3)测试的页面太长了就不贴了,到这里找吧,在页面的中下部分。
如果懒得找就看官方提供的示例程序中测试页面。
总结:
websocket的意义在让浏览器和服务器保持长连接。
在websocket之前如果想保持长连接,或者采用轮询的方法,或者采用服务器端阻塞的方法,显然都浪费性能。
如果用服务器端阻塞的话,编程中读请求(阻塞的)和写请求(由用户操作触发)也是分开的。
websocket直接就分开它们俩了,浏览器随时可以向服务器中写指令,服务器也随时可以向浏览器写指令,两者都有触发函数监听对方。
这是对无状态的http协议非常重要的补充。
html5技术很大方面就是让B/S自带富客户端编程元素,比如本地存储,长连接这些,这也是单页面程序兴起的重要原因。
真正是一个页面就是一个程序,有界面显示,有操作控件,有临时数据,有持久数据,有与服务器保持的连接。