It is a very basic request-response test. Browser sends "hello from browser" to servlet using jQuery $.ajax API, and servlet receives this message, then create a JSON object using org.json.simple library and sends back to browser a JSON response with message "hello from server".
I am running this on localhost and just assume my IP address is 123.123.12.123, the platform is Ubuntu, server is Tomcat 6.0, running in the Eclipse IDE.
Test 1. I start the server from Eclipse, open Firefox, enter http://localhost:8080/myproject/test.jsp, I can see servlet receives message and browser receives response, test passed.
Test 2. server is still running at the Eclipse at Ubuntu, I start Windows 7 guest machine from VirtualBox and the Firefox browser in the Windows 7, enter http://123.123.12.123:8080/myproject/test.jsp, works as I expected, test passed.
Test 3. server is still running at Eclipse at Ubuntu, open Internet Explorer 9 browser, give it address http://123.123.12.123:8080/myproject/test.jsp, nothing happens. The debug gives me
Response HTTP/1.1 200 OK
Response body {"message":"hello from server"}
The test.jsp is
<%@ page language="java" contentType="text/html; charset=UTF-8" pageEncoding="UTF-8"%> <!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd"> <html> <head> <meta http-equiv="Content-Type" content="text/html; charset=UTF-8"> <title>Insert title here</title> </head> <script src="//ajax.googleapis.com/ajax/libs/jquery/1.7.1/jquery.js" type="text/javascript"></script> <script type="text/javascript" src="release/js/libs/json2.js"></script> <script> $(document).ready(function(){ var request = ({"message":'Hello from browser'}); var jsonobj=JSON.stringify(request); $.ajax({ data: {para:jsonobj}, dataType: 'json', url: './TestServlet', type: 'POST', success: function(jsonObj){ alert(jsonObj.message); }, error: function() { alert('Ajax readyState: '+xhr.readyState+'\nstatus: '+xhr.status + ' ' + err); } }); }); </script> <body> </body> </html>
The servlet code is
import java.io.IOException; import java.io.PrintWriter; import javax.servlet.ServletException; import javax.servlet.http.HttpServlet; import javax.servlet.http.HttpServletRequest; import javax.servlet.http.HttpServletResponse; import org.json.simple.JSONObject; import org.json.simple.JSONValue; /** * Servlet implementation class TestServlet */ public class TestServlet extends HttpServlet { private static final long serialVersionUID = 1L; /** * @see HttpServlet#HttpServlet() */ public TestServlet() { super(); } /** * @see HttpServlet#doGet(HttpServletRequest request, HttpServletResponse response) */ protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException { // TODO Auto-generated method stub } /** * @see HttpServlet#doPost(HttpServletRequest request, HttpServletResponse response) */ protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException { request.setCharacterEncoding("utf8"); response.setCharacterEncoding("utf8"); response.setContentType("application/json"); PrintWriter out = response.getWriter(); JSONObject jsonObj = (JSONObject) JSONValue.parse(request.getParameter("para")); System.out.println(jsonObj.get("message")); JSONObject obj = new JSONObject(); obj.put("message", "hello from server"); out.print(obj); } }
Update:
After a closer look by change
error: function() { alert('Ajax readyState: '+xhr.readyState+'\nstatus: '+xhr.status + ' ' + err); }
to
error: function(xhr,err) { alert('Ajax readyState: '+xhr.readyState+'\nstatus: '+xhr.status + ' ' + err); }
I got alert readyState:0 and status:0. But I can see {"message":"hello from server"} at Response body and the response header is
Key Value Response HTTP/1.1 200 OK
To send a JSON response from the Servlet we first need to convert the Employee object into its JSON representation. There are many java libraries available to convert an object to there JSON representation and vice versa. Most prominent of them would be the Gson and Jackson libraries.
The requests are generated by Python to retrieve the data from a particular resource URI. If the response of the request is returned in JSON format then the content of the response can be retrieved using the response. json() function. It returns the response by using a Python dictionary object.
IE caches AJAX requests aggressively (more than Firefox, Chrome, and Safari, anyway).
Sometimes you need to set cache header controller when request. Like cache:false
. I tried to fix your code like this
request.setCharacterEncoding("utf8");
//response.setCharacterEncoding("utf8");
response.setContentType("application/json");
PrintWriter out = response.getWriter();
JSONObject jsonObj = (JSONObject) JSONValue.parse(request.getParameter("para"));
System.out.println(jsonObj.get("message"));
JSONObject obj = new JSONObject();
obj.put("message", "hello from server");
out.print(obj.toString());
I changed your response content-type from application/json; charset=utf8
to just application/json
and that worked.
I was having the same problem. It was working well on Firefox but not on IE... I found out reading this post that my problem was related to the 'Content-Type'. The problem seems that that IE has problem with 'charset=UTF8'. However, if you use 'charset=UTF-8' (with a dash) it is then working! Your Content-Type should then be: application/json;charset=UTF-8
If you love us? You can donate to us via Paypal or buy me a coffee so we can maintain and grow! Thank you!
Donate Us With