一、需求分析

最近在项目中,有个导出word的需求,但是需要传递一些复杂的参数到后端进行数据查询后再进行导出,需要使用window.open()方法实现。如果是简单参数并且参数不重要的话,可以使用get方式直接在url上进行参数拼接,然后后台直接获取即可。但是目前我需要传递的参数有好几个,并且还有一些是序列化后的json等等,有可能会超长。这个时候如果是使用get方式的话,就可能会存在一些问题。因为get方式请求有长度限制,并且url中如果包含非法字符的话,会报错。

由此,我改为了使用post放在在window.open打开新窗口的时候,将所有参数都传递到后端服务。

GET方式:直接在url上面进行拼接

window.open(window.baseUrl + "/xxxx?name=" + name + "&age=" + age

二、实现方式

一般网页的post都是通过form来实现的,所以这里以模拟form表单提交,创建一些隐藏域存放需要传递的参数,然后手动触发form的onSubmit监听事件,将form的target设置成和open的name参数一样的值,通过浏览器自动识别实现了将内容post到新窗口中。

具体代码如下:(笔者使用的是react)

//导出
exportPreviewEvaluationForm = () => {//....省略一些代码const {currentHjId, currentXsid, currentTaskId, currentLcid, currentXsxm} = this.props;this.downloadWord(window.baseUrl + "/xxxxxxx", currentTaskId, currentXsid, currentHjId, currentLcid, currentXsxm, previewFormDetail, cpxIdArr.toString(), "_blank")
};//创建隐藏表单Input域
createHideInput = (name, value) => {let hideInput = document.createElement("input");hideInput.type = "hidden";hideInput.name = name;hideInput.value = value;return hideInput;
};downloadWord = (url, rwid, xsid, hjid, lcid, xm, cpxqxx, cpxIdArr, name) => {let hideSubmitForm = document.createElement("form");hideSubmitForm.id = "tempForm1";hideSubmitForm.method = "post";hideSubmitForm.action = url;hideSubmitForm.target = name;hideSubmitForm.appendChild(this.createHideInput("rwid", rwid));hideSubmitForm.appendChild(this.createHideInput("hjid", hjid));hideSubmitForm.appendChild(this.createHideInput("lcid", lcid));hideSubmitForm.appendChild(this.createHideInput("xsid", xsid));hideSubmitForm.appendChild(this.createHideInput("xm", xm));hideSubmitForm.appendChild(this.createHideInput("cpxqxx", cpxqxx));hideSubmitForm.appendChild(this.createHideInput("cpxids", cpxIdArr));hideSubmitForm.addEventListener('onsubmit', () => {this.openDownloadWindow(name);});document.body.appendChild(hideSubmitForm);hideSubmitForm.submit();document.body.removeChild(hideSubmitForm);
};openDownloadWindow = (name) => {window.open('about:blank', name, 'height=400, width=400, top=0, left=0, toolbar=yes, menubar=yes, scrollbars=yes, resizable=yes,location=yes, status=yes');
};

后端接收:

// 1. 获取导出需要的一些参数
String xsid = request.getParameter("xsid");
String rwid = request.getParameter("rwid");
String hjid = request.getParameter("hjid");
String lcid = request.getParameter("lcid");
String cpxqxx = request.getParameter("cpxqxx");
String xm = request.getParameter("xm");
String cpxIds = request.getParameter("cpxids");

这样就实现了post方式传递复杂参数。

window.open实现post方式复杂参数传递相关推荐

  1. 【Window】线程同步方式1——临界区(关键代码段)

    第一节:[Window]创建线程的3种方式 第二节:[Window]线程同步概述 第三节:[Window]线程同步方式1--临界区(关键代码段) 第四节:[Window]线程同步方式2--互斥量 第五 ...

  2. window.open以post方式提交

    第一种方式 最近在做web项目,碰到需要跨页面传递参数的功能,就是那种需要把当前页面的内容带到新开的子窗体中,以前的做法是传一个id过去,然后在新窗口中去读数据库的内容.虽然不怎么麻烦,但是如果内容么 ...

  3. 页面之间的跳转方式和参数传递以及路由和生命周期

    微信小程序拥有web网页和Application共同的特征,我们的页面都不是孤立存在的,而是通过和其他页面进行交互,来共同完成系统的功能.今天我们来研究小程序页面之间的跳转方式. 1.概述 在Andr ...

  4. exfat最佳单元大小_2020年Window系统重装最佳方式

    重装系统有许多种操作安装方法如介质重装(有官方教程),镜像重装,PE重装,CGI重装,GHOST等方法,其中GHOST这方法当初维修店人就是用的这种,这方法已经过时,不适合如今系统安装. 这里只讲讲一 ...

  5. RedirectToAction()转移方式及参数传递

    今天在做一个功能的时,使用RedirectToAction()需要从这里传几个参数,从网上查了一下,这样解决.真好. Return RedirectToAction("Index" ...

  6. 前端学习(1263):post方式的参数传递

  7. c/c++语言中函数参数传递的三种方式——徐吉平

    此篇为本人处女作,希望大家多多指正 1.这是c/c++中的函数传值方式,函数中只交换了 形参x,y的数值,而实参a,b的值并没有发生变化 #include <stdio.h> void m ...

  8. sh执行文件 参数传递_详解shell中脚本参数传递的两种方式

    方式一:$0,$1,$2.. 采用$0,$1,$2..等方式获取脚本命令行传入的参数,值得注意的是,$0获取到的是脚本路径以及脚本名,后面按顺序获取参数,当参数超过10个时(包括10个),需要使用${ ...

  9. 网页制作之JavaScript部分3--事件及事件传输方式(函数调用 练习题 )重要---持续更新中...

    一. 事件:说白了就是调用函数的一种方式.它包括:事件源.事件数据.事件处理程序. JS事件 1.js事件通常和函数结合来使用,这样可以通过发生的事件来驱动函数的执行,从而引起html出现不同的效果. ...

  10. mybatis mapper xml文件的导入方式和查询方式

    mybatis mapper xml文件的导入方式和查询方式 ssm框架 Mybatis  mapper与SQLSession的关系 每个基于MyBatis的应用都是以一个SqlSessionFact ...

最新文章

  1. 怎样用VB编写.DLL动态链接库文件
  2. 测试Animation大型动画文件拆分播放的可行性
  3. 学习Redis持久化
  4. 文件系统管理 之 Linux 查看磁盘分区、文件系统、使用情况的命令和相关工具介绍...
  5. AUTOSAR从入门到精通100讲(三十七)-AUTOSAR 通信服务-ComM配置及代码分析
  6. python socket模块作用_python之socket模块详解--小白博客
  7. Raid技术精简总结
  8. 名校大厂 AI 高手云集,芒果 TV 音视频算法大赛硕果累累
  9. Android N 将提供分屏功能和新设计的通知控制
  10. 在线分析mysql死锁详解_记一次线上mysql死锁分析(一)
  11. 《精通Matlab数字图像处理与识别》一第6章 频率域图像增强
  12. Android Fragment(一)
  13. SpringBoot @Condition 注解
  14. Odoo12有那些功能?『江苏odoo云整理』
  15. 心动的本质是什么_喜欢上一个人的本质是什么?
  16. 自己实现一个Starter
  17. 使用Teamviewer实现远程控制安卓设备的实现过程记录
  18. Linux下的exec系统调用详解
  19. Markdown 语法手册 (完整整理版)转抄
  20. 用C++解决数学类问题的练习

热门文章

  1. PySpark : Structured Streaming
  2. 比赛结束(第二届易观算法大赛)
  3. 算法:合并两个有序链表21. Merge Two Sorted Lists
  4. 前端获取后台布尔类型_教育平台项目前端:视频讲解
  5. BERT4Rec:知道用户的播放(购买、点击、...)序列 item1, item2, item3,预测下一个播放的item问题。
  6. presto执行一条查询分为七步
  7. DST(对话状态追踪)常用方法
  8. php mysqli 字段缺失,mysqli 为什么不提示字段异常
  9. java传文件到kafka_Java将CSV的数据发送到kafka的示例
  10. windows7安装openssh