【发布时间】:2013-12-06 03:03:41
【问题描述】:
我尝试了许多在这里找到的示例,但没有一个对我有用,我在服务器端收到错误或 null 对象。这是在客户端:
jsonManual = JSON.stringify(x);
alert('send data over: ' + jsonManual); //jasonManual is a valid json string, tested
$.ajax({
type: "POST",
url: "loccol", //loccol.java
data: {jsonManual:jsonManual},
dataType: "json",
contentType: "application/json",
success: function(data, textStatus, jqXHR){
alert(data);
},
error: function(jqXHR, textStatus, errorThrown){
alert("FAIL "+errorThrown);
}
});
服务器端:
public class loccol extends HttpServlet {
private static final Logger log = LoggerFactory.getLogger(loccol.class);
protected void processRequest(HttpServletRequest request, HttpServletResponse response)
throws ServletException, IOException {
response.setContentType("application/json;charset=UTF-8");
PrintWriter out = null;
try {
List<LocationData> manual = new ArrayList<LocationData>();
String jsonManual = request.getParameter("jsonManual");
log.error("JsonManual inside servlet: " + jsonManual);
ObjectMapper m = new ObjectMapper();
JsonNode rootNode = m.readTree(jsonManual);
Iterator<JsonNode> sampleIt = rootNode.getElements();
GeometryFactory gf = new GeometryFactory(new PrecisionModel(), 900913);
while (sampleIt.hasNext()) {
log.info("Starting next sample");
JsonNode sample = sampleIt.next();
LocationData ld = new LocationData();//Create new object
if (sample.get("lon") != null && sample.get("lon").isDouble() &&
sample.get("lat") != null && sample.get("lat").isDouble()) {//We check if sample has lon and lat value
Coordinate c = new Coordinate(sample.get("lon").asDouble(), sample.get("lat").asDouble());
ld.setPoint(gf.createPoint(c));
}
if (sample.get("time") != null && sample.get("time").isLong()) {
ld.setTime(new Date(sample.get("time").asLong()));//Gets a string value
}
if (sample.get("floor") != null && sample.get("floor").isDouble()) {//We check if sample has lon-value
ld.setFloor(sample.get("floor").asDouble());//Gets a string value
}
if (sample.get("accuracy") != null && sample.get("accuracy").isDouble()) {//We check if sample has lon-value
ld.setAccuracy(sample.get("accuracy").asDouble());
}
if (sample.get("type") != null) {//We check if sample has lon-value
ld.setType(sample.get("type").asText());//Gets a string value
}
if (sample.get("speed") != null) {
ld.setSpeed(sample.get("speed").asDouble());
}
if (sample.get("direction") != null) {
ld.setSpeed(sample.get("direction").asDouble());
}
if (sample.get("SomethingThatDoesntExist") != null) {
log.error("This example shows that you can safely check what values a sample has");
}
//manual.add(ld); log.info("manual add");
manual.add(ld);
log.info("manual add");
}
for (int i = 0; i < manual.size(); i++) {
log.info("type in manual sample "+i+": "+manual.get(i).getType());
}
int experimentId = SensorTracking.persistSamples(manual, null);
out = response.getWriter();
out.println("{\"experimentId\":"+experimentId+"}");
} catch (Exception e) {
e.printStackTrace();
response.setStatus(500);
} finally {
if (out != null) {
out.close();
}
}
}
@Override
protected void doGet(HttpServletRequest request, HttpServletResponse response)
throws ServletException, IOException {
processRequest(request, response);
}
@Override
protected void doPost(HttpServletRequest request, HttpServletResponse response)
throws ServletException, IOException {
processRequest(request, response);
}
@Override
public String getServletInfo() {
return "Short description";
}// </editor-fold>
}
【问题讨论】:
-
你能展示一下
jsonManual的样子吗? -
尝试
data: jsonManual和Content-Type: text/html以及在服务器端request.getContent()。 -
@BharathRallapalli 双引号对 JavaScript 对象字面量没有影响。
-
尝试打印
request.getParameterMap(),看看你会得到什么。
标签: java ajax json servlets post