前几天,在2个系统中涉及到相互访问,并且返回处理结果。例如:项目A的一个servlet调用项目B的某一个servlet,在jQuery.ajax中不能直接通过json的方式访问。最终搜索了许久,终于发现通过jsonp的方式可以实现。现将处理过程记录下来,以做备忘。
首先,前段js代码实现:
<html>
<head>
<script type='text/javascript' src='jquery-1.8.3.js'></script>
<script type='text/javascript'>
$(function() {
$.ajax( {
type : "get",
url : "http://localhost:8080/TestJOSNP/TestJSONPServlet",
dataType : "jsonp",
jsonpCallback : "success",
success : function(json) {
alert('调用成功!');
},
error: function(jqXHR, textStatus, errorThrown) {
alert("调用失败!");
}
});
});
function success_jsonpCallback(data) {
success(data);
}
</script>
</head>
<body>
</body>
</html>
其次,servlet的实现:
package com.learning;
import java.io.IOException;
import javax.servlet.ServletException;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
public class TestJSONPServlet extends HttpServlet{
@Override
protected void doGet(HttpServletRequest req, HttpServletResponse resp)
throws ServletException, IOException {
this.doPost(req, resp);
}
@Override
protected void doPost(HttpServletRequest req, HttpServletResponse resp)
throws ServletException, IOException {
// json字符串
String retStr = "\"[{'retcode', '5'}]\"";
try
{
// 写回客户端
resp.getWriter().write("success_jsonpCallback(" + retStr + ")");
}
catch (IOException ex)
{
ex.printStackTrace();
}
}
}
ajax的jsonpCallback参数,为jsonp请求指定一个回调函数名,这个值将用来取代jQuery自动生成的随机函数名。这主要用来让jQuery生成自己独特的函数名,这样管理请求更容易,也能方便地提供回调函数和错误处理。
ajax jsonp与普通的ajax请求的主要区别在于——请求响应结果的处理。也就是说,调用jsonp回调函数success_jsonpCallback,并将要响应的字符串或json传入此方法(作为参数值)。此外,ajax jsonp对于同步或异步请求没有影响。