乡下人产国偷v产偷v自拍,国产午夜片在线观看,婷婷成人亚洲综合国产麻豆,久久综合给合久久狠狠狠9

  • <output id="e9wm2"></output>
    <s id="e9wm2"><nobr id="e9wm2"><ins id="e9wm2"></ins></nobr></s>

    • 分享

      SpringMVC+WebSocket的通用接口映射實現(xiàn)

       aaie_ 2017-04-13

      首先準備環(huán)境:SpringMVC4.0、WebSocket、Tomcat7.0,具體配置就不說了,網(wǎng)上有。

      目的:在控制層(Controller)實現(xiàn)springmvc和websocket的統(tǒng)一接口映射,即websocket訪問后臺也可以像springmvc訪問Controller方法一樣

      實現(xiàn)原理:定義一個主要的websocket處理類,在這個websocket的基礎下進行接口分發(fā)和參數(shù)映射。


      具體方法:

      1.通過字符串或JSON(方便映射前端的js對象)來傳遞訪問的路徑,也就是調用Controller的某個方法。RequestMappingHandlerMapping對象持有Controller的所有配置接口和方法信息,遍歷接口信息,匹配到前端的訪問路徑就可以進行調用了。

      2.參數(shù)映射有很多方案,最簡單的統(tǒng)一用Map傳參,Controller的接口也支持,這樣就實現(xiàn)了接口的通用。


      下面是主要的websocket消息處理類

      1. @SuppressWarnings("unchecked")  
      2. public class MainHandler extends TextWebSocketHandler{  
      3.   
      4.     @Autowired    
      5.     private RequestMappingHandlerMapping requestMappingHandlerMapping;   
      6.       
      7.       
      8.     @Override  
      9.     public void handleTextMessage(WebSocketSession session,  
      10.             TextMessage message) throws Exception {  
      11.         // TODO Auto-generated method stub  
      12.         String msg = message.getPayload();  
      13.         Map<RequestMappingInfo, HandlerMethod> map = requestMappingHandlerMapping.getHandlerMethods();  
      14.         Object result = null;  
      15.           
      16.         String url = msg;  
      17.         Map<String, Object> parameter = new HashMap<String, Object>();  
      18.         Pattern pattern = Pattern.compile("^\\{(\"\\w+\":\\S+,{0,1})+\\}$");  
      19.         if(pattern.matcher(msg).matches()){  
      20.             JSONObject json = JSONObject.fromObject(message.getPayload());  
      21.             if(json.get("url") != null){  
      22.                 url = String.valueOf(json.get("url"));  
      23.                 if(json.get("params") != null){  
      24.                     parameter = (Map<String, Object>) json.get("params");  
      25.                 }  
      26.             }  
      27.         }  
      28.               
      29.         for (Map.Entry<RequestMappingInfo, HandlerMethod> m : map.entrySet()) {  
      30.             RequestMappingInfo info = m.getKey();    
      31.             HandlerMethod method = m.getValue();   
      32.             PatternsRequestCondition p = info.getPatternsCondition();   
      33.             if(p.getPatterns().size() > 0 && p.getPatterns().toArray()[0].equals(url)){  
      34.                 String url_pt = String.valueOf(p.getPatterns().toArray()[0]);  
      35.                 String methodName = url_pt.substring(url_pt.lastIndexOf('/')+1);  
      36.                 Class<?> cls = method.getMethod().getDeclaringClass();  
      37.                 Object controller = cls.newInstance();  
      38.                 boolean success = true;  
      39.                 try{  
      40.                     result = cls.getDeclaredMethod(methodName, Map.class).invoke(controller, parameter);  
      41.                 }catch(Exception e){  
      42.                     success = false;  
      43.                 }  
      44.                 if(!success){  
      45.                     try{  
      46.                         result = cls.getDeclaredMethod(methodName).invoke(controller);  
      47.                     }catch(Exception e){  
      48.                         success = false;  
      49.                     }                 
      50.                 }  
      51.                 if(!success)    result = "未找到指定方法或方法參數(shù)不匹配";  
      52.                 break;  
      53.             }  
      54.                 
      55.         }  
      56.   
      57.         if(result != null){  
      58.             session.sendMessage(new TextMessage(String.valueOf(result).getBytes()));  
      59.         }  
      60.           
      61.     }  
      62.       
      63.   
      64. }  

      前端發(fā)送:

      [javascript] view plain copy
      在CODE上查看代碼片派生到我的代碼片
      1. WSClient.fn.pushMsgEvent = function(msgEvent){  
      2.     if(typeof msgEvent == "function")   this.msgPool.push(_opts.msgEvent);  
      3.     return this.msgPool;  
      4. }  



      細節(jié)說明:
      1.一般來說,SpringMVC和WebSocket的接口整合是在service層,SpringMVC的Controller層通常不做任何業(yè)務處理或少量處理,只負責提供接口。個人實現(xiàn)這套方案只是想通過注解的形式來定義WebSocket的接口,順便通用一下
      2.如果Controller的接口參數(shù)不想用Map,則可以重載一個參數(shù)為Map的函數(shù),如下:
      1. @RequestMapping("/test")  
      2.     public @ResponseBody List test(HttpServletRequest request){  
      3.         return test(request.getParameterMap());  
      4.     }  
      5.       
      6.     public @ResponseBody List test(Map map){  
      7.         System.out.println(map);  
      8.         List<String> tmp = new ArrayList<String>();  
      9.         tmp.add("1222");  
      10.         tmp.add("2333");  
      11.         return tmp;  
      12.     }  


      3.后續(xù)補充...

        本站是提供個人知識管理的網(wǎng)絡存儲空間,所有內容均由用戶發(fā)布,不代表本站觀點。請注意甄別內容中的聯(lián)系方式、誘導購買等信息,謹防詐騙。如發(fā)現(xiàn)有害或侵權內容,請點擊一鍵舉報。
        轉藏 分享 獻花(0

        0條評論

        發(fā)表

        請遵守用戶 評論公約

        類似文章 更多