Reputation: 35
I tried many examples I found here but none worked for me, I get error or a null
object on the server side. This is on client side:
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);
}
});
server side:
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>
}
Upvotes: 1
Views: 2942
Reputation: 1108682
Your mistake is here:
contentType: "application/json",
This is wrong. When you intend to use request.getParameter()
and friends in the servlet, then it expects a content type of application/x-www-form-urlencoded
, which happens to be the default content type of HTML <form>
and jQuery $.ajax()
.
Just get rid of that wrong content type instruction.
Upvotes: 3