老王最近遇到件烦心事——每次在后台管理系统提交表单,整个页面都要白屏刷新,用户填到一半的长篇内容说没就没。"这体验也太复古了!"开发组长拍着桌子说,这时候,前端小张默默举起手:"要不...咱们试试Ajax?"
简单说,Ajax就像个隐形快递员,传统表单提交好比你要寄文件,得亲自跑邮局(页面刷新),而Ajax是叫个闪送小哥(XMLHttpRequest对象),你在家喝着咖啡(页面无刷新)就把事办了。
在JSP里玩转Ajax分三步走:
<%@ page contentType="text/html;charset=UTF-8" %> <script> function submitForm() { // 1. 阻止表单默认提交行为 event.preventDefault(); // 2. 组装数据(支持FormData自动收集) var formData = new FormData(document.getElementById("myForm")); // 3. 创建Ajax请求 var xhr = new XMLHttpRequest(); xhr.open("POST", "/submitAction", true); // 4. 设置回调函数 xhr.onreadystatechange = function() { if (xhr.readyState == 4 && xhr.status == 200) { // 拿到服务器返回的JSON数据 var result = JSON.parse(xhr.responseText); document.getElementById("resultArea").innerHTML = result.success ? "提交成功!" : "失败原因:" + result.message; } }; // 5. 发送请求(注意文件上传需要特殊处理) xhr.send(formData); } </script> <!-- 表单示例 --> <form id="myForm" onsubmit="submitForm()"> <input type="text" name="username" placeholder="用户名"> <input type="password" name="password" placeholder="密码"> <button type="submit">悄悄提交</button> </form> <div id="resultArea"></div>
@WebServlet("/submitAction") public class FormServlet extends HttpServlet { protected void doPost(HttpServletRequest request, HttpServletResponse response) throws IOException { // 1. 获取参数 String username = request.getParameter("username"); String password = request.getParameter("password"); // 2. 业务处理(模拟数据库操作) boolean success = !username.isEmpty() && !password.isEmpty(); // 3. 返回JSON响应 response.setContentType("application/json"); response.setCharacterEncoding("UTF-8"); PrintWriter out = response.getWriter(); out.print("{\"success\":" + success + ",\"message\":\"参数校验" + (success ? "通过" : "失败") + "\"}"); } }
中文乱码问题
记得在Servlet里设置:
request.setCharacterEncoding("UTF-8"); response.setCharacterEncoding("UTF-8");
文件上传特殊处理
需要修改Ajax代码:
xhr.setRequestHeader("Cache-Control", "no-cache"); xhr.setRequestHeader("X-Requested-With", "XMLHttpRequest");
跨域访问限制
如果前端和后端不在同一个域名下,需要在服务端设置:
response.setHeader("Access-Control-Allow-Origin", "*");
Loading状态提示
在发送请求前显示加载动画:
document.getElementById("loading").style.display = "block"; xhr.onloadend = function() { document.getElementById("loading").style.display = "none"; };
超时处理
xhr.timeout = 5000; // 5秒超时 xhr.ontimeout = function() { alert("服务器响应超时,请重试"); };
使用Fetch API更简洁
现代浏览器推荐写法:
fetch('/submitAction', { method: 'POST', body: formData }).then(response => response.json()) .then(data => console.log(data));
下次当产品经理要求"不要刷新页面"时,你可以淡定地甩出这套方案,好的技术就像空气——用户感觉不到它的存在,但缺了它绝对不行!
本文由 言韵磬 于2025-07-30发表在【云服务器提供商】,文中图片由(言韵磬)上传,本平台仅提供信息存储服务;作者观点、意见不代表本站立场,如有侵权,请联系我们删除;若有图片侵权,请您准备原始证明材料和公证书后联系我方删除!
本文链接:https://vps.7tqx.com/wenda/483414.html
发表评论