第一步:web.xml中支持異步。全部的filter及servletjavascript
<filter> <filter-name>characterEncoding</filter-name> <filter-class>org.springframework.web.filter.CharacterEncodingFilter</filter-class> <init-param> <param-name>encoding</param-name> <param-value>UTF-8</param-value> </init-param> <init-param> <param-name>forceEncoding</param-name> <param-value>true</param-value> </init-param> <async-supported>true</async-supported> </filter> <filter-mapping> <filter-name>characterEncoding</filter-name> <url-pattern>/*</url-pattern> </filter-mapping> <!-- 註冊中央調度器 --> <servlet> <servlet-name>springmvc</servlet-name><!-- 隨便 --> <servlet-class>org.springframework.web.servlet.DispatcherServlet</servlet-class> <!-- 指定springmvc配置文件位置及文件名 --> <init-param> <param-name>contextConfigLocation</param-name> <param-value>classpath:applicationContext-mvc.xml</param-value><!-- springmvc的配置文件,classpath表明類路徑下 --> </init-param> <!-- 寫一個>0的數字,越小優先級越高(<=0和沒有設置沒區別),代表tomcat服務器在啓動的時候,就將DispatcherServlet對象給建立了 --> <!-- 在tomcat啓動時,直接建立當前servlet --> <load-on-startup>1</load-on-startup> <async-supported>true</async-supported> </servlet>
第二步。pom.xml依賴java
<!-- for support web socket --> <dependency> <groupId>javax.websocket</groupId> <artifactId>javax.websocket-api</artifactId> <version>1.1</version> <scope>provided</scope> <!-- 注意,scope必須爲provided,不然runtime會衝突,若是使用tomcat 8,還須要將TOMCAT_HOME/lib下的javax.websocket-api.jar一併刪除 --> </dependency> <dependency> <groupId>com.fasterxml.jackson.core</groupId> <artifactId>jackson-annotations</artifactId> <version>2.3.0</version> </dependency> <dependency> <groupId>com.fasterxml.jackson.core</groupId> <artifactId>jackson-core</artifactId> <version>2.3.1</version> </dependency> <dependency> <groupId>com.fasterxml.jackson.core</groupId> <artifactId>jackson-databind</artifactId> <version>2.3.3</version> </dependency>
第三步:web
package com.ldr.websocket; import org.springframework.context.annotation.Configuration; import org.springframework.messaging.simp.config.MessageBrokerRegistry; import org.springframework.web.socket.config.annotation.AbstractWebSocketMessageBrokerConfigurer; import org.springframework.web.socket.config.annotation.EnableWebSocketMessageBroker; import org.springframework.web.socket.config.annotation.StompEndpointRegistry; /** * * @author Wang&Yang * @email 867986155@qq.com * @date 2018-05-02 * @remark esno company * @version 1.0.0 * @description: * 這個類表示啓用websocket消息處理,以及收發消息的域 config.enableSimpleBroker("/queue", "/topic");這句表示在/queue", "/topic這兩個域上能夠向客戶端發消息; registry.addEndpoint("/endpointChat").withSockJS();客戶端在此鏈接websocket server */ @Configuration /*別忘記了要讓spring管理咯*/ @EnableWebSocketMessageBroker public class WebSocketConfig extends AbstractWebSocketMessageBrokerConfigurer { @Override public void configureMessageBroker(MessageBrokerRegistry config) { config.enableSimpleBroker("/queue", "/topic"); } @Override public void registerStompEndpoints(StompEndpointRegistry registry) { //註冊一個名字爲"endpointChat" 的endpoint,並指定 SockJS協議。 點對點-用 registry.addEndpoint("/endpointChat").withSockJS(); } }
package com.ldr.websocket; import java.util.HashMap; import java.util.Map; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.messaging.simp.SimpMessagingTemplate; import org.springframework.stereotype.Controller; import org.springframework.web.bind.annotation.RequestMapping; import org.springframework.web.bind.annotation.RequestParam; import com.ldr.base.GsonBean; @Controller public class WebSocketController { public SimpMessagingTemplate template; @Autowired public WebSocketController(SimpMessagingTemplate template) { this.template = template; } @RequestMapping("/noticeDataGenResult") public void noticeDataGenResult(@RequestParam(value="fn") String fileName,@RequestParam(value="rc") String genResult/*1爲成功,0爲失敗*/) { Map<String,String> datas=new HashMap<String,String>(5); datas.put("fileName", fileName); datas.put("genResult", genResult); template.convertAndSend("/topic/getResponse", new GsonBean(200, datas)); } }
第四步:jspspring
<!-- websock.js --> <script type="text/javascript" src="../sys/js/websock/sockjs.min.js"></script> <script type="text/javascript" src="../sys/js/websock/stomp.min.js"></script> $(function () { connect(); }); function connect() { var sock = new SockJS("../endpointChat"); var stomp = Stomp.over(sock); stomp.connect('guest', 'guest', function(frame) { stomp.subscribe('/topic/getResponse', function (response) { //訂閱/topic/getResponse 目標發送的消息。這個是在控制器的@SendTo中定義的。 var resultObj=$.parseJSON(response.body); console.dir(resultObj); }); }); }