首發:我的博客html
必須說明:這篇博文只用於本身記錄,使用spring的websocket支持必定要看官方文檔,權威又簡明,不推薦看不專業又囉嗦的國產博文。html5
已嘗試了兩種方法,固然,無論哪一種方法都要先添加maven依賴:java
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-websocket</artifactId>
</dependency>
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-messaging</artifactId>
</dependency> git<dependency>
<groupId>javax.websocket</groupId>
<artifactId>javax.websocket-api</artifactId>
<version>1.0</version>
</dependency>github
第一種方法,對應文檔中的25.2這一節:
1)聲明個Handler組件:web
@Component
public class MyHandler extends TextWebSocketHandler {spring@Override
public void handleTextMessage(WebSocketSession session, TextMessage message) {
try {
session.sendMessage(message);
} catch (IOException e) {
e.printStackTrace();
}
}編程}api
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自帶富客戶端編程元素,好比本地存儲,長鏈接這些,這也是單頁面程序興起的重要緣由。
真正是一個頁面就是一個程序,有界面顯示,有操做控件,有臨時數據,有持久數據,有與服務器保持的鏈接。