打开APP
userphoto
未登录

开通VIP,畅享免费电子书等14项超值服

开通VIP
SpringMVC+WebSocket的通用接口映射实现
userphoto

2017.04.13

关注

首先准备环境:SpringMVC4.0、WebSocket、Tomcat7.0,具体配置就不说了,网上有。

目的:在控制层(Controller)实现springmvc和websocket的统一接口映射,即websocket访问后台也可以像springmvc访问Controller方法一样

实现原理:定义一个主要的websocket处理类,在这个websocket的基础下进行接口分发和参数映射。


具体方法:

1.通过字符串或JSON(方便映射前端的js对象)来传递访问的路径,也就是调用Controller的某个方法。RequestMappingHandlerMapping对象持有Controller的所有配置接口和方法信息,遍历接口信息,匹配到前端的访问路径就可以进行调用了。

2.参数映射有很多方案,最简单的统一用Map传参,Controller的接口也支持,这样就实现了接口的通用。


下面是主要的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 = "未找到指定方法或方法参数不匹配";  
  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. }  

前端发送:

[javascript] view plain copy
  1. WSClient.fn.pushMsgEvent = function(msgEvent){  
  2.     if(typeof msgEvent == "function")   this.msgPool.push(_opts.msgEvent);  
  3.     return this.msgPool;  
  4. }  



细节说明:
1.一般来说,SpringMVC和WebSocket的接口整合是在service层,SpringMVC的Controller层通常不做任何业务处理或少量处理,只负责提供接口。个人实现这套方案只是想通过注解的形式来定义WebSocket的接口,顺便通用一下
2.如果Controller的接口参数不想用Map,则可以重载一个参数为Map的函数,如下:
  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.后续补充...
本站仅提供存储服务,所有内容均由用户发布,如发现有害或侵权内容,请点击举报
打开APP,阅读全文并永久保存 查看更多类似文章
猜你喜欢
类似文章
【热】打开小程序,算一算2024你的财运
springMvc直接接收json数据自动转化为Map<String,String>
springMVC对于controller处理方法返回值的可选类型
springBoot初体验
spring3 的restful API RequestMapping介绍
SpringMvc和servlet简单对比介绍
SpringMVC数据绑定全面示例(复杂对象,数组等)
更多类似文章 >>
生活服务
热点新闻
分享 收藏 导长图 关注 下载文章
绑定账号成功
后续可登录账号畅享VIP特权!
如果VIP功能使用有故障,
可点击这里联系客服!

联系客服