前端JSON数据传值到后端接收方式

博客介绍了前后端数据交互情况,包括前端JS请求发送数据,后端Controller接收;反之,后端Controller封装数据,前端页面用el表达式接收。还提及应用于树形菜单,但未展示相关代码。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

前端发送的数据:

前端JS请求:

1  //demo为JSON格式数据
2  let para ={
3      dataJ: JSON.stringfiy(demo);
4  }
5  //这一段是Vue封装的方法,本质就是一条url
6  this.$http.post('${webRoot}/demo?list', para,{emulateJSON: true}); 

后端Controller接收数据:

 1 @RequestMapping(params = "list")
 2 @ResponseBody
 3 public void treeList(String treedata , HttpServletRequest request, HttpServletResponse response, DataGrid dataGrid){
 4 //      request.getParameterValues("treedata");
 5         JSONArray jsonArray = JSONArray.fromObject(treedata);
 6         for (Object o : jsonArray) {
 7             JSONObject jo = (JSONObject)o;
 8             System.out.println(jo.getString("parent"));
 9         }
10 }

=================分割线===========================

反之

后端Controller封装数据:

 1     @RequestMapping(params = "query")
 2     public void query(HttpServletRequest request) {
 3         //父级
 4         Map<String,Object> parentMap=new HashMap<String, Object>();
 5         parentMap.put("id", "001");
 6         parentMap.put("name", "王某");
 7         //子级
 8         Map<String,Object> childMap=new HashMap<String, Object>();
 9         childMap.put("id", "child001");
10         childMap.put("name", "王孩子");
11         //将子级Map封装成List
12         List<Map<String,Object>> ChildMapList=new ArrayList<Map<String,Object>>();
13         ChildMapList.add(childMap);
14         //将子级MapList写进父级Map中
15         parentMap.put("children", ChildMapList);
16         //将父级Map封装成List
17         List<Map<String,Object>> parentMapList=new ArrayList<Map<String,Object>>();
18         parentMapList.add(parentMap);
19         //将封装好的数据转换成Json
20         JSONArray arr = JSONArray.fromObject(parentMapList);
21         request.setAttribute("mapList", arr);
22 
23         request.setAttribute("mapList", arr);
24         
25     }

前端页面el表达式接收 ${mapList}  后数据格式:

----------展开后:

 

我是应用在树形菜单的,这一部分代码就不展示了。效果如下:

 

转载于:https://www.cnblogs.com/ic710/p/11043486.html

<think>嗯,用户想了解如何从前端通过WebSocket将递到基于Netty的后端。首先,我需要回顾一下WebSocket的基本原理,以及Netty在其中的作用。WebSocket允许全双工通信,这对于实时应用很重要。Netty作为高性能的网络框架,处理WebSocket连接应该很高效。 接下来,用户需要具体的教程,所以步骤要分清楚。可能需要从前端代码开始,比如使用JavaScript或者Vue来建立WebSocket连接,然后发送消息。后端部分,用Netty搭建服务器,处理握手、接收消息等。 然后,想到用户提供的引用中有提到Vue和Spring Boot的集成,但用户现在用的是Netty后端,不是Spring Boot。不过引用3提到了Netty的高性能,所以需要专注于Netty的配置。可能需要指导如何创建Netty的WebSocket服务器,处理前端发来的消息。 还要考虑数据格式,比如使用JSON,前后端需要统一。前端发送数据时可能需要字符串化,后端解析。同时,处理WebSocket的握手,比如检查Upgrade头,添加处理器。 可能遇到的问题包括跨域,所以Netty需要配置支持跨域。另外,保持连接的持久性,处理不同的帧类型,比如TextWebSocketFrame。 然后,验证部分,如何测试前端发送消息,后端是否正确接收并响应。可能需要示例代码,比如前端用Vue组件,后端用Netty的ChannelHandler。 最后,常见问题,比如连接失败、数据解析错误、跨域问题,这些都需要在回答中提到解决方案。确保用户能一步步实现,并处理可能出现的错误。 现在需要组织这些思路,分步骤说明,给出代码示例,确保前后端代码能对应,并解释关键部分。同时,引用相关的参考资料,比如引用3关于Netty的高性能特性,加强回答的可信度。</think>### 前端 WebSocket 与 Netty 后端数据交互实现步骤 #### 一、前端 WebSocket 连接实现(以 Vue3 为例) ```javascript // WebSocket工具类 class SocketClient { constructor(url) { this.socket = new WebSocket(url); this.socket.onopen = () => console.log('WebSocket connected'); this.socket.onmessage = (e) => this.handleMessage(e.data); this.socket.onerror = (err) => console.error('WebSocket error:', err); } handleMessage(data) { try { const msg = JSON.parse(data); console.log('Received:', msg); // 处理业务逻辑 } catch (e) { console.error('Message parse error:', e); } } send(message) { if (this.socket.readyState === WebSocket.OPEN) { this.socket.send(JSON.stringify(message)); } } } // Vue组件中使用 export default { mounted() { this.ws = new SocketClient('ws://localhost:8080/ws'); }, methods: { sendData() { this.ws.send({ type: 'chat', content: 'Hello Netty', timestamp: Date.now() }); } } } ``` #### 二、Netty 服务端核心配置 ```java // WebSocket初始化配置 public class WebSocketServerInitializer extends ChannelInitializer<SocketChannel> { @Override protected void initChannel(SocketChannel ch) { ChannelPipeline pipeline = ch.pipeline(); // HTTP协议处理 pipeline.addLast(new HttpServerCodec()); pipeline.addLast(new HttpObjectAggregator(65536)); // WebSocket协议升级配置 pipeline.addLast(new WebSocketServerProtocolHandler("/ws", null, true)); // 自定义业务处理器 pipeline.addLast(new WebSocketFrameHandler()); } } // 自定义消息处理器 public class WebSocketFrameHandler extends SimpleChannelInboundHandler<TextWebSocketFrame> { @Override protected void channelRead0(ChannelHandlerContext ctx, TextWebSocketFrame frame) { String request = frame.text(); System.out.println("Received: " + request); // 处理业务逻辑 ctx.writeAndFlush(new TextWebSocketFrame("Server response: " + request.toUpperCase())); } @Override public void channelActive(ChannelHandlerContext ctx) { System.out.println("Client connected: " + ctx.channel().remoteAddress()); } } ``` #### 三、关键配置说明 1. **协议升级处理**: - `WebSocketServerProtocolHandler` 负责处理 HTTP 到 WebSocket 的协议升级握手 - 路径 `/ws` 需要与前端连接地址匹配 - 支持跨域配置(通过设置响应头)[^3] 2. **消息格式**: ```json { "type": "message", "content": "Hello", "timestamp": 1629876543210 } ``` 推荐使用 JSON 格式进行结构化数据输 3. **Netty 性能优化**: ```java EventLoopGroup bossGroup = new NioEventLoopGroup(1); // 接收连接 EventLoopGroup workerGroup = new NioEventLoopGroup(); // 默认线程数=CPU核心数*2 ServerBootstrap b = new ServerBootstrap(); b.group(bossGroup, workerGroup) .channel(NioServerSocketChannel.class) .option(ChannelOption.SO_BACKLOG, 100) .childOption(ChannelOption.SO_KEEPALIVE, true); ``` #### 四、验证流程 1. 启动 Netty 服务端 2. 前端访问页面建立连接 3. 浏览器控制台观察 WebSocket 连接状态 4. 发送测试消息并验证双向通信 #### 五、常见问题处理 | 问题现象 | 解决方案 | |-----------------------|---------------------------------| | 连接失败 (1006 错误) | 检查跨域配置、协议头处理 | | 消息解析异常 | 统一前后端序列化/反序列化协议 | | 高并发下消息丢失 | 配置流量控制(ChannelOption.WRITE_BUFFER_WATER_MARK)| | 长时间无响应断连 | 添加心跳检测机制 | 通过上述实现,可构建支持 10,000+ 并发连接的高性能 WebSocket 服务[^3]。实际生产环境中建议: 1. 添加 TLS 加密(wss://) 2. 实现消息重试机制 3. 使用 Protobuf 替代 JSON 提升输效率
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值