java:jsonp前后端实例演示
来源:互联网 发布:vero moda淘宝旗舰店 编辑:程序博客网 时间:2024/05/21 22:32
1.后端用servlet,放在tomcat中启动。
jsonpServlet.java:
package test;import java.io.IOException;import javax.servlet.ServletException;import javax.servlet.annotation.WebServlet;import javax.servlet.http.HttpServlet;import javax.servlet.http.HttpServletRequest;import javax.servlet.http.HttpServletResponse;//@WebServlet("/jsonpServlet")public class jsonpServlet extends HttpServlet {private static final long serialVersionUID = 1L; public jsonpServlet() { super(); }protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {//response.getWriter().append("Served at: ").append(request.getContextPath());String callback = (String)request.getParameter("callback"); String jsonData = "{\"id\":\"3\", \"name\":\"zhangsan\", \"telephone\":\"13612345678\"}";//为了演示效果,json数据是写死的 String retStr = callback + "(" + jsonData + ")"; response.getWriter().append(retStr);}protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {doGet(request, response);}}
2.前端测试页面testjsonp.html:
<!doctype html><html> <head> <meta http-equiv="Content-Type" content="text/html; charset=utf-8"> <title>测试页面</title> <script type="text/javascript" src="jquery.js"></script> </head> <body><input type="button" value="点我测试本地" onclick="r()" /> <script>var tt=null;function r(){rds();console.log("第1次tt:"+tt);d();console.log("第2次tt:"+tt);}function rds(){var url="http://localhost:8080/demoProj/jsonpServlet";$.ajax({url: url, type:'get',dataType:'jsonp',async: false,jsonp:'callback',jsonpCallback:"cb",data:"",success:function(rs) {tt=rs;console.log("我是rds()里面的tt:"+tt);console.log("我是rds的方法:"+rs);}});}function d(){tt="ddfdd";}function cb(r){ tt=r;console.log("我是rds()里面的tt:"+tt); console.log("我是cb方法! "+r); }</script> </body></html>
4.结果:
5.解析:
(1)为了测试jsonp,在servlet写了个小例子,发布到tomcat启动,就可以用ajax请求url测试后端接口,不需要搭建spring web项目,只需在web.xml里配置一下servlet和servlet-mapping,简单快捷,这个值得借鉴。
(2)后端Servlet的doGet()方法只能无返回值(void),别急,幸好这时就可以用response.getWriter().append(str);将后端数据返回给前端。
(3) 如果前端定义的回调函数名cb,后端也用这个名+括号包裹参数:cb(result),返回给前端,前端页面定义的cb函数就能获取到后端return给他的值result。
(4)执行顺序是:console.log("第1次tt:"+tt);——d()——console.log("第2次tt:"+tt);——rds()的success——cb()
在ajax中配置了async: false即同步了,那也不管用,也改不了ajax的异步特性。
注:
类型:Boolean
默认值: true。默认设置下,所有请求均为异步请求。如果需要发送同步请求,请将此选项设置为 false。
注意,同步请求将锁住浏览器,用户其它操作必须等待请求完成才可以执行。
也就是async只影响用户其他操作对tt值的影响,但不影响浏览器对js解释性运行的特性的认定,也不影响浏览器对js中的ajax异步特性的认定。此规定就是让ajax动态改变布局页面时,锁死浏览器禁止用户的其他操作再次对此局部页面产生影响,此规定不会影响浏览器内部已经解释性运行着js。
但是没有ajax异步请求的d()能顺利赋值成功且几乎同时执行,就证明了rds()中ajax的这一步特性和异步回调cb()也是异步的。
这就解决了跨域问题的同时也解决了前端报错:
Uncaught SyntaxError: Unexpected token :
这个错就是在说后端返回的数据格式不对,后端返回的直接是json格式数据,遇到了冒号救护报错,不是cb(result)格式的。所以这时就要改后端代码,用前端传过来的回调函数名+括号包裹数据,再返回给前端。
- java:jsonp前后端实例演示
- 前后端表单校验实例
- 前后端分离之Java后端
- java JSONP使用实例
- java前后端技术栈
- java前后端传值
- 前后端演示SHA1,MD5加密登录(带数据库)
- 构建SpringMVCRestful前后端分离项目实例
- java前后端开发中乱码问题
- ajax前后端(java)实现
- java实现前后端交互导出excel
- java ajax json 前后端数据传输
- java前后端通信常见问题汇总一
- WebSocket 前后端DEMO(java)
- jsonp跨域请求,vue-resource + php前后端分裂做webapp
- Json格式前后端传输的ajax实例
- 前后端分离项目之数据导出为word实例
- 解决跨域的jsonp+Java实例
- 【变治法】霍纳法则C++代码实现,求一个多项式在一个给定点的值
- 三周五次课(11月3日) 1.生成式和生成器 2.迭代器 3.装饰器
- 工厂模式
- 大数据集群之CDH版本搭建完整版
- 浅谈Java中的equals和==
- java:jsonp前后端实例演示
- java 设计模式之单例模式
- bzoj 4034(树链剖分)
- 5G:非正交多址接入(NOMA)与串行干扰删除(SIC)
- Android秋招面经
- 常用的兼容IE6及小技巧
- 死锁的四个必要条件以及怎样处理
- 2、进程的基本概念和思想、状态与转换
- AGC 018 C Coin (堆)