Lorsque le serveur Web reçoit la requête http du client, il crée un objet de requête représentant la requête et un objet de réponse représentant la réponse pour chaque requête. Étant donné que les objets de requête et de réponse représentent des requêtes et des réponses, si nous voulons obtenir les données soumises par le client, il nous suffit de trouver l'objet de requête. Pour envoyer des données au client, recherchez simplement l'objet de réponse.
Copiez le code comme suit :
paquet com.yyz.response ;
importer java.io.IOException ;
importer java.io.OutputStream ;
importer javax.servlet.ServletException ;
importer javax.servlet.http.HttpServlet ;
importer javax.servlet.http.HttpServletRequest ;
importer javax.servlet.http.HttpServletResponse ;
//Problème avec la sortie du chinois
la classe publique ResponseDemo étend HttpServlet {
public void doGet (demande HttpServletRequest, réponse HttpServletResponse)
lance ServletException, IOException {
Données de chaîne = « Chine » ;
OutputStream out = réponse.getOutputStream();
out.write(data.getBytes());
/**
* out.write(data.getBytes()); Ce code implique de vérifier la table de codes deux fois.
* Lorsque « Chine » passe des données de caractères aux données d'octets, la table de codes gb2312 sera consultée.
* Lorsque les données sont envoyées au navigateur pour affichage, la table de codes doit être consultée à nouveau. La table de codes consultée à ce moment est liée aux paramètres du navigateur.
*/
}
public void doPost (demande HttpServletRequest, réponse HttpServletResponse)
lance ServletException, IOException {
doGet (demande, réponse);
}
}
Résultats des tests lorsque le codage du navigateur est défini sur GB2312 :
Résultats des tests lorsque le codage du navigateur est défini sur UTF-8 :
Afin de rendre notre site Web accessible aux utilisateurs étrangers, lorsque nous convertissons des données de caractères en données d'octets, nous devons spécifier la table de codes de conversion comme UTF-8. Mais à ce moment-là, si le navigateur est ouvert avec GB2312, des caractères tronqués réapparaîtront. Bien que ce problème de code tronqué puisse être résolu en modifiant les paramètres du navigateur, cela ne favorise pas l’amélioration de l’expérience utilisateur. Par conséquent, nous devons utiliser un programme pour indiquer au navigateur quelle table de codes consulter pour afficher les données.
Copiez le code comme suit :
paquet com.yyz.response ;
importer java.io.IOException ;
importer java.io.OutputStream ;
importer javax.servlet.ServletException ;
importer javax.servlet.http.HttpServlet ;
importer javax.servlet.http.HttpServletRequest ;
importer javax.servlet.http.HttpServletResponse ;
//Problème avec la sortie du chinois
la classe publique ResponseDemo étend HttpServlet {
public void doGet (demande HttpServletRequest, réponse HttpServletResponse)
lance ServletException, IOException {
// Côté serveur, de quelle table de codes les données sont sorties, il est alors nécessaire de contrôler avec quelle table de codes le navigateur est ouvert.
Données de chaîne = « Chine » ;
réponse.setHeader("content-type", "text/html;charset=UTF-8");
OutputStream out = réponse.getOutputStream();
out.write(data.getBytes("UTF-8"));
}
public void doPost (demande HttpServletRequest, réponse HttpServletResponse)
lance ServletException, IOException {
doGet (demande, réponse);
}
}
Apprenez encore une astuce :
Utilisez la balise <meta> en langage HTML pour contrôler le comportement du navigateur.
<méta http-equiv="Content-type'' content=''text/html;charset=UTF-8">
http-equiv simule l'en-tête de réponse HTTP et indique au navigateur de l'ouvrir dans la table de codes UTF-8. Les en-têtes de réponse réels ont priorité sur les en-têtes de réponse simulés avec http-equiv.
Dans le développement réel, le serveur doit utiliser des flux de caractères pour écrire des données texte dans le navigateur. Cependant, la table de codes par défaut du flux de caractères obtenu via la méthode de réponse getWriter est ISO8859-1. Il n'y a pas de codage chinois correspondant dans cette table de codes, elle sera donc modifiée ? L'encodage correspondant est envoyé au navigateur, et lorsque le navigateur est ouvert, il est plein de points d'interrogation. La table de codes consultée par le serveur lors de l'envoi des données peut être modifiée via setCharacterEncoding de réponse.
Copiez le code comme suit :
paquet com.yyz.response ;
importer java.io.IOException ;
importer java.io.PrintWriter ;
importer javax.servlet.ServletException ;
importer javax.servlet.http.HttpServlet ;
importer javax.servlet.http.HttpServletRequest ;
importer javax.servlet.http.HttpServletResponse ;
//Problème avec la sortie du chinois
la classe publique ResponseDemo étend HttpServlet {
public void doGet (demande HttpServletRequest, réponse HttpServletResponse)
lance ServletException, IOException {
// Côté serveur, de quelle table de codes les données sont sorties, il est alors nécessaire de contrôler avec quelle table de codes le navigateur est ouvert.
Données de chaîne = « Chine » ;
réponse.setHeader("content-type", "text/html;charset=UTF-8");
réponse.setCharacterEncoding("UTF-8");
PrintWriter out = réponse.getWriter();
out.write(données);
}
public void doPost (demande HttpServletRequest, réponse HttpServletResponse)
lance ServletException, IOException {
doGet (demande, réponse);
}
}
Il y a quelques petits détails à noter ici :
1. réponse.setCharacterEncoding("UTF-8"); doit être écrit devant PrintWriter out = réponse.getWriter();. Il est inutile de définir l'encodage après avoir obtenu le flux de caractères.
2. réponse.setHeader("content-type", "text/html;charset=UTF-8"); Il existe une manière plus simple d'écrire réponse.setContentType("text/html;charset=UTF-8");.
3.response.setContentType("text/html;charset=UTF-8"); Ce code a en fait deux fonctions : notifier la réponse à la sortie en UTF-8 et le navigateur à ouvrir en UTF-8. Cela équivaut à Response.setHeader("content-type", "text/html;charset=UTF-8"); et Response.setCharacterEncoding("UTF-8");.
4. Grâce à la lecture ci-dessus, les lecteurs devraient être capables de comprendre pourquoi la sortie de réponse.getOutputStream.write(1) dans le navigateur n'est pas 1 ; Le navigateur étant un éditeur de texte, après avoir reçu les données, il faudra 1 pour rechercher la table de codes, puis afficher les caractères correspondants. Si vous souhaitez afficher des nombres dans le navigateur, vous devez transformer les nombres en chaînes, réponse.getOutputStream.write((1+"").getBytes());.
Utilisez OutputStream (flux d'octets) pour envoyer des données :
1. réponse.getOutputStream().write("China".getBytes());//Envoyer les données dans l'encodage par défaut
2. réponse.getOutputStream().write("China".getBytes("UTF-8"));//Envoyez les données en codage UTF-8, le navigateur (GB2312 par défaut) apparaîtra tronqué
Solution:
2.1 En changeant la méthode d'encodage du navigateur : IE/"View"/"Encoding"/"UTF-8" (déconseillé)
2.2 Informer le client de la méthode d'encodage en définissant l'en-tête de réponse : réponse.setHeader("Content-type", "text/html;charset=UTF-8");//Informer le navigateur du type de données et de l'encodage
2.3 Simulez les en-têtes de requête via des balises méta : out.write("<meta http-equiv='Content-Type' content='text/html; charset=utf-8' />".getBytes());
2.4 Par la méthode suivante : Response.setContentType("text/html;charset=UTF-8");