web-dev-qa-db-fra.com

Renvoyer JSON depuis le servlet

Il s'agit d'un test de requête-réponse très basique. Le navigateur envoie "bonjour du navigateur" à la servlet à l'aide de l'API jQuery $ .ajax, et la servlet reçoit ce message, puis crée un objet JSON à l'aide de la bibliothèque org.json.simple et renvoie au navigateur une réponse JSON avec le message "bonjour du serveur".

J'exécute cela sur localhost et suppose simplement que mon adresse IP est 123.123.12.123, la plate-forme est Ubuntu, le serveur est Tomcat 6.0, fonctionnant dans l'IDE Eclipse.

Test 1. Je démarre le serveur depuis Eclipse, ouvre Firefox, saisis http: // localhost: 8080/myproject/test.jsp , je peux voir que la servlet reçoit un message et que le navigateur reçoit une réponse, le test a réussi.

Le serveur de test 2. fonctionne toujours à l'Eclipse sur Ubuntu, je démarre la machine invitée Windows 7 à partir de VirtualBox et le navigateur Firefox dans Windows 7, entrez http://123.123.12.123:8080/myproject/test.jsp , fonctionne comme prévu, test réussi.

Le serveur de test 3. est toujours en cours d'exécution sur Eclipse sur Ubuntu, ouvrez le navigateur Internet Explorer 9, donnez-lui l'adresse http://123.123.12.123:8080/myproject/test.jsprien ne se passe. Le débogage me donne

Réponse HTTP/1.1 200 OK

Corps de réponse {"message": "bonjour du serveur"}

Le test.jsp est

 <% @ 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> Insérer un titre ici </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 (fonction () {
 var request = ({"message": 'Bonjour du navigateur'}); 
 var jsonobj = JSON.stringify (request); 
 $. ajax ({
 data: {para: jsonobj}, 
 dataType: 'json', 
 url: './TestServlet',
 type:' POST ' , 
 succès: fonction (jsonObj) {
 alerte (jsonObj.message); 
}, 
 error: function () {
 alert ('Ajax readyState:' + xhr.readyState + '\ nstatus:' + xhr.status + '' + err); 
} 
} ); 
}); 
 </script> 
 <body> 
 </body> 
 </html> 

Le code de servlet est

 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; 
 
/** 
 * Classe d'implémentation de servlet TestServlet 
 */
 classe publique TestServlet étend HttpServlet {
 private static final serialVersionUID = 1L; 
 
 /**
 * @see HttpServlet # HttpServlet () 
 */
 public TestServlet () {
 super (); 
} 
 
 /**
 * @see HttpServlet #doGet (demande HttpServletRequest, réponse HttpServletResponse) 
 */
 protégé void doGet (demande HttpServletRequest, réponse HttpServletResponse) lève ServletException, IOException {
 // TO DO Stub de méthode généré automatiquement 
} 
 
 /**
 * @See HttpServlet # doPost (demande HttpServletRequest, réponse HttpServletResponse) 
 *// 
 void doPost protégé (demande HttpServletRequest, réponse HttpServletResponse) lève 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", "bonjour du serveur"); 
 Out.print (obj); 
 
} 
 
} 

Mettre à jour:

Après un examen plus attentif par le changement

 erreur: fonction () {
 alerte ('Ajax readyState:' + xhr.readyState + '\ nstatus:' + xhr.status + '' + err); 
} 

à

 erreur: fonction (xhr, err) {
 alert ('Ajax readyState:' + xhr.readyState + '\ nstatus:' + xhr.status + '' + err); 
} 

J'ai reçu l'alerte readyState: 0 et le statut: 0. Mais je peux voir {"message": "bonjour du serveur"} dans le corps de réponse et l'en-tête de réponse est

 Valeur clé 
 Réponse HTTP/1.1 200 OK 
14
user200340

IE caches AJAX demande agressivement (plus que Firefox, Chrome et Safari, de toute façon). Parfois, vous devez définir le contrôleur d'en-tête de cache lors de la demande. Comme cache:false. J'ai essayé de réparer ton code comme ça

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);

J'ai changé le type de contenu de votre réponse de application/json; charset=utf8 pour juste application/json et cela a fonctionné.

13
viyancs

J'avais le même problème. Cela fonctionnait bien sur Firefox mais pas sur IE ... J'ai découvert en lisant cet article que mon problème était lié au 'Content-Type'. Le problème semble que IE a un problème avec 'charset = UTF8'. Cependant, si vous utilisez 'charset = UTF-8' (avec un tiret) cela fonctionne alors! Votre type de contenu devrait alors être: application/json; charset = UTF-8

3
user2190382
<% 
     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>
0
phuongmychi

en utilisant Gson, vous pouvez envoyer une réponse json

@WebServlet (urlPatterns = {"/ jsonResponse"}) la classe publique JsonResponse étend 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();
    }

}

}

pour plus réponse json du servlet en Java

0
xrcwrn