15

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
ROMANIA_engineer
  • 54,432
  • 29
  • 203
  • 199
user200340
  • 3,301
  • 13
  • 52
  • 74
  • what your problem..? i'm still confuse with your question...can you tell me with simple speaking..? – viyancs Mar 10 '12 at 12:08
  • Sorry for the long question. With the code above (test.jsp and TestServlet). Test 3 failed. But Test 1 and 2 passed. – user200340 Mar 10 '12 at 12:38

4 Answers4

15

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.

Sotirios Delimanolis
  • 274,122
  • 60
  • 696
  • 724
viyancs
  • 2,289
  • 4
  • 39
  • 71
  • sorry for the late response, it worked, thanks. Can you explain more the reason behind it? – user200340 Mar 13 '12 at 14:39
  • when request and response with httpRequest IE is being cache headers and the headers not be updated.please see this link to be details http://greenash.net.au/thoughts/2006/03/an-ie-ajax-gotcha-page-caching/ – viyancs Mar 14 '12 at 03:06
  • OK, in that post, the Ajax works fine in the first load, but not after it. But my problem is that the Ajax response is not working at all on IE. Also, how is response.setCharacterEncoding("utf8"); related with response cached header? Thanks – user200340 Mar 14 '12 at 15:21
  • i think any problem when $.ajax is get response in IE with Charset ("utf8"). but it's possible with IE supper cache too. – viyancs Jun 19 '15 at 07:27
3

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

0
<% 
     Gson gs = new Gson();
     BeanHelpBH bh = new BeanHelpBH();
     List<Baihatmoi> lst = bh.getTenbaihatbyName("Ao moi ca mau");
    String bha = gs.toJson(lst);
    response.setContentType("application/json");
    response.setCharacterEncoding("UTF-8");
    out.print(bha);
    out.flush();


%>

  script : 
        <script>
             $(document).ready(function(){
               $.get('jsontest.jsp',function(data){
            [enter image description here][1] console.log(data);

              });

           });
        </script>
phuongmychi
  • 1
  • 1
  • 1
-1

using Gson you can send json response

@WebServlet(urlPatterns = {"/jsonResponse"})
public class JsonResponse extends HttpServlet {

@Override
protected void doGet(HttpServletRequest request, HttpServletResponse response)
        throws ServletException, IOException {
    response.setContentType("application/json");
    response.setCharacterEncoding("utf-8");
    Student student = new Student(12, "Ram Kumar", "Male", "1234565678");
    Subject subject1 = new Subject(1, "Computer Fundamentals");
    Subject subject2 = new Subject(2, "Computer Graphics");
    Subject subject3 = new Subject(3, "Data Structures");
    Set subjects = new HashSet();
    subjects.add(subject1);
    subjects.add(subject2);
    subjects.add(subject3);
    student.setSubjects(subjects);
    Address address = new Address(1, "Street 23 NN West ", "Bhilai", "Chhattisgarh", "India");
    student.setAddress(address);
    Gson gson = new Gson();
    String jsonData = gson.toJson(student);
    PrintWriter out = response.getWriter();
    try {
        out.println(jsonData);
    } finally {
        out.close();
    }

}

}

for more json response from servlet in java

xrcwrn
  • 5,339
  • 17
  • 68
  • 129