按钮onclick调用JSP报错,求无表单无AJAX的可行实现方案
嘿,我来帮你理清楚这个问题:
首先你原来的按钮代码报错Uncaught SyntaxError: Invalid regular expression flags,核心原因是onclick属性需要的是可执行的JavaScript代码,而不是直接写URL路径。浏览器看到你写的/chbs/adm/HallNamesValidation.jsp,会把它当成正则表达式(因为首尾是/),但后面的路径部分不是合法的正则标志,自然就炸了。
你不想用<form action>,还得传递数组让JSP的getParameterValues()能拿到,除了已经实现的AJAX,这里有两种适合你的改造方式:
方式1:手动构建隐藏表单提交(推荐,支持POST)
这种方式不用页面上显式写<form>,而是用JS动态创建一个隐藏表单,把数组数据塞进去再提交,完全符合你的需求:
<button name="btnSave" id="btnSave" onclick="submitWithArray()" class="btn btn-success">Save to Database</button> <script> function submitWithArray() { // 1. 创建一个隐藏的form元素 const hiddenForm = document.createElement('form'); hiddenForm.action = '/chbs/adm/HallNamesValidation.jsp'; hiddenForm.method = 'POST'; // POST适合传递多数据,避免URL长度限制 // 2. 假设你的数组数据是这个(替换成你实际的数组) const hallNames = ["学术报告厅A", "学术报告厅B", "多功能厅"]; // 3. 给数组每个元素创建同名的隐藏input,这样JSP能通过getParameterValues拿到数组 hallNames.forEach(name => { const input = document.createElement('input'); input.type = 'hidden'; input.name = 'hallNames'; // 这个name要和JSP里getParameterValues("hallNames")对应 input.value = name; hiddenForm.appendChild(input); }); // 4. 把表单加到页面、提交,之后可以移除 document.body.appendChild(hiddenForm); hiddenForm.submit(); document.body.removeChild(hiddenForm); } </script>
这样提交后,JSP里request.getParameterValues("hallNames")就能拿到完整的数组啦,和用普通表单提交的效果完全一样。
方式2:用GET跳转传递数组(适合数据量小的场景)
如果你的数组数据不多,也可以直接在onclick里拼接URL参数跳转:
<button name="btnSave" id="btnSave" onclick="redirectWithArray()" class="btn btn-success">Save to Database</button> <script> function redirectWithArray() { const hallNames = ["学术报告厅A", "学术报告厅B", "多功能厅"]; // 把数组转成URL参数,记得编码避免乱码 const paramStr = hallNames.map(name => `hallNames=${encodeURIComponent(name)}`).join('&'); window.location.href = `/chbs/adm/HallNamesValidation.jsp?${paramStr}`; } </script>
这种方式会直接跳转到目标JSP,同样能用getParameterValues("hallNames")获取数组,但要注意GET请求的URL长度限制,数据多了就不太合适。
再啰嗦下原写法的问题
你之前直接把URL写在onclick里,浏览器会把/chbs/adm/HallNamesValidation.jsp解析成正则表达式(因为被/包裹),但chbs/adm/HallNamesValidation.jsp不是合法的正则标志(正则标志只能是g、i、m这些单个字母),所以才会抛出那个语法错误。必须把URL放在可执行的JS代码里,比如上面的函数调用方式。
内容的提问来源于stack exchange,提问作者Raky

