Wenn der Webserver die HTTP-Anfrage des Clients empfängt, erstellt er für jede Anfrage ein Anforderungsobjekt, das die Anforderung darstellt, und ein Antwortobjekt, das die Antwort darstellt. Da die Anforderungs- und Antwortobjekte Anforderungen und Antworten darstellen, müssen wir nur das Anforderungsobjekt finden, wenn wir die vom Client übermittelten Daten erhalten möchten. Um Daten an den Client auszugeben, suchen Sie einfach nach dem Antwortobjekt.
Kopieren Sie den Codecode wie folgt:
Paket com.yyz.response;
import java.io.IOException;
import java.io.OutputStream;
import javax.servlet.ServletException;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
//Problem bei der Ausgabe von Chinesisch
öffentliche Klasse ResponseDemo erweitert HttpServlet {
public void doGet(HttpServletRequest-Anfrage, HttpServletResponse-Antwort)
wirft ServletException, IOException {
String data = "China";
OutputStream out = Response.getOutputStream();
out.write(data.getBytes());
/**
* out.write(data.getBytes()); Bei diesem Code wird die Codetabelle zweimal überprüft.
* Wenn „China“ von Zeichendaten zu Bytedaten wechselt, wird die Codetabelle gb2312 konsultiert.
* Wenn die Daten zur Anzeige an den Browser gesendet werden, muss die Codetabelle erneut konsultiert werden. Die zu diesem Zeitpunkt konsultierte Codetabelle bezieht sich auf die Browsereinstellungen.
*/
}
public void doPost(HttpServletRequest-Anfrage, HttpServletResponse-Antwort)
wirft ServletException, IOException {
doGet(Anfrage,Antwort);
}
}
Testergebnisse, wenn die Browser-Kodierung auf GB2312 eingestellt ist:
Testergebnisse, wenn die Browser-Kodierung auf UTF-8 eingestellt ist:
Um unsere Website für ausländische Benutzer zugänglich zu machen, müssen wir bei der Konvertierung von Zeichendaten in Bytedaten die Konvertierungscodetabelle als UTF-8 angeben. Wenn der Browser jedoch zu diesem Zeitpunkt mit GB2312 geöffnet wird, werden erneut verstümmelte Zeichen angezeigt. Obwohl dieses Problem mit verstümmeltem Code durch Ändern der Browsereinstellungen gelöst werden kann, trägt es nicht zur Verbesserung des Benutzererlebnisses bei. Daher müssen wir ein Programm verwenden, um dem Browser mitzuteilen, welche Codetabelle er zur Anzeige der Daten heranziehen soll.
Kopieren Sie den Codecode wie folgt:
Paket com.yyz.response;
import java.io.IOException;
import java.io.OutputStream;
import javax.servlet.ServletException;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
//Problem bei der Ausgabe von Chinesisch
öffentliche Klasse ResponseDemo erweitert HttpServlet {
public void doGet(HttpServletRequest-Anfrage, HttpServletResponse-Antwort)
wirft ServletException, IOException {
//Auf der Serverseite, aus welcher Codetabelle die Daten ausgegeben werden, muss dann gesteuert werden, mit welcher Codetabelle der Browser geöffnet wird.
String data = "China";
Response.setHeader("content-type", "text/html;charset=UTF-8");
OutputStream out = Response.getOutputStream();
out.write(data.getBytes("UTF-8"));
}
public void doPost(HttpServletRequest-Anfrage, HttpServletResponse-Antwort)
wirft ServletException, IOException {
doGet(Anfrage,Antwort);
}
}
Erfahren Sie noch einen Trick:
Verwenden Sie das <meta>-Tag in der HTML-Sprache, um das Browserverhalten zu steuern.
<meta http-equiv="Content-type'' content=''text/html;charset=UTF-8">
http-equiv simuliert den HTTP-Antwortheader und weist den Browser an, ihn in der UTF-8-Codetabelle zu öffnen. Echte Antwortheader haben Vorrang vor mit http-equiv simulierten Antwortheadern.
In der tatsächlichen Entwicklung sollte der Server Zeichenströme verwenden, um Textdaten in den Browser zu schreiben. Die Standardcodetabelle des über die getWriter-Antwortmethode erhaltenen Zeichenstroms ist jedoch ISO8859-1. Diese Codetabelle enthält keine entsprechende chinesische Codierung, wird sie also geändert? Die entsprechende Kodierung wird an den Browser gesendet und ist beim Öffnen des Browsers voller Fragezeichen. Die vom Server beim Senden von Daten konsultierte Codetabelle kann über setCharacterEncoding der Antwort geändert werden.
Kopieren Sie den Codecode wie folgt:
Paket com.yyz.response;
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;
//Problem bei der Ausgabe von Chinesisch
öffentliche Klasse ResponseDemo erweitert HttpServlet {
public void doGet(HttpServletRequest-Anfrage, HttpServletResponse-Antwort)
wirft ServletException, IOException {
//Auf der Serverseite, aus welcher Codetabelle die Daten ausgegeben werden, muss dann gesteuert werden, mit welcher Codetabelle der Browser geöffnet wird.
String data = "China";
Response.setHeader("content-type", "text/html;charset=UTF-8");
Response.setCharacterEncoding("UTF-8");
PrintWriter out = Response.getWriter();
out.write(data);
}
public void doPost(HttpServletRequest-Anfrage, HttpServletResponse-Antwort)
wirft ServletException, IOException {
doGet(Anfrage,Antwort);
}
}
Hier sind ein paar kleine Details zu beachten:
1. Response.setCharacterEncoding("UTF-8"); muss vor PrintWriter out = Response.getWriter(); geschrieben werden. Es ist sinnlos, die Codierung festzulegen, nachdem der Zeichenstrom abgerufen wurde.
2. Response.setHeader("content-type", "text/html;charset=UTF-8"); Es gibt eine einfachere Möglichkeit, Response.setContentType("text/html;charset=UTF-8"); zu schreiben.
3.response.setContentType("text/html;charset=UTF-8"); Dieser Code hat eigentlich zwei Funktionen: die Benachrichtigung der Antwort zur Ausgabe in UTF-8 und den Browser zum Öffnen in UTF-8. Das entspricht Response.setHeader("content-type", "text/html;charset=UTF-8"); und Response.setCharacterEncoding("UTF-8");.
4. Durch die obige Lektüre sollten die Leser verstehen, warum die Ausgabe von „response.getOutputStream.write(1)“ im Browser nicht 1 ist. Da es sich bei dem Browser um einen Texteditor handelt, dauert es nach dem Empfang der Daten 1, die Codetabelle nachzuschlagen und dann die entsprechenden Zeichen anzuzeigen. Wenn Sie Zahlen im Browser ausgeben möchten, sollten Sie die Zahlen in Strings umwandeln, Response.getOutputStream.write((1+"").getBytes());.
Verwenden Sie OutputStream (Byte-Stream), um Daten zu senden:
1. Response.getOutputStream().write("China".getBytes());//Daten in Standardcodierung senden
2. Response.getOutputStream().write("China".getBytes("UTF-8"));//Daten in UTF-8-Kodierung senden, der Browser (Standard GB2312) wird verstümmelt angezeigt
Lösung:
2.1 Durch Ändern der Kodierungsmethode des Browsers: IE/"View"/"Encoding"/"UTF-8" (nicht ratsam)
2.2 Informieren Sie den Client über die Codierungsmethode, indem Sie den Antwortheader festlegen: Response.setHeader("Content-type", "text/html;charset=UTF-8");//Informieren Sie den Browser über den Datentyp und die Codierung
2.3 Anforderungsheader durch Meta-Tags simulieren: out.write("<meta http-equiv='Content-Type' content='text/html; charset=utf-8' />".getBytes());
2.4 Über die folgende Methode: Response.setContentType("text/html;charset=UTF-8");