Ketika server web menerima permintaan http klien, itu akan membuat objek permintaan yang mewakili permintaan dan objek respons yang mewakili respons untuk setiap permintaan. Karena objek permintaan dan respons mewakili permintaan dan respons, jika kita ingin mendapatkan data yang dikirimkan oleh klien, kita hanya perlu mencari objek permintaan. Untuk mengeluarkan data ke klien, cari saja objek responsnya.
Copy kode kodenya sebagai berikut:
paket com.yyz.response;
impor java.io.IOException;
impor java.io.OutputStream;
impor javax.servlet.ServletException;
impor javax.servlet.http.HttpServlet;
impor javax.servlet.http.HttpServletRequest;
impor javax.servlet.http.HttpServletResponse;
//Masalah dengan keluaran bahasa Mandarin
kelas publik ResponseDemo memperluas HttpServlet {
public void doGet (permintaan HttpServletRequest, respons HttpServletResponse)
melempar ServletException, IOException {
String data = "Tiongkok";
OutputStream keluar = respon.getOutputStream();
keluar.tulis(data.getBytes());
/**
* out.write(data.getBytes()); Kode ini melibatkan pemeriksaan tabel kode dua kali.
* Ketika "China" berubah dari data karakter ke data byte, tabel kode gb2312 akan dikonsultasikan.
* Ketika data dikirim ke browser untuk ditampilkan, tabel kode perlu dikonsultasikan kembali. Tabel kode yang dikonsultasikan kali ini terkait dengan pengaturan browser.
*/
}
public void doPost (permintaan HttpServletRequest, respons HttpServletResponse)
melempar ServletException, IOException {
doGet(permintaan,tanggapan);
}
}
Hasil pengujian ketika pengkodean browser diatur ke GB2312:
Hasil pengujian ketika pengkodean browser diatur ke UTF-8:
Agar situs web kami dapat diakses oleh pengguna asing, ketika kami mengubah data karakter menjadi data byte, kami harus menentukan tabel kode konversi sebagai UTF-8. Namun saat ini, jika browser dibuka dengan GB2312, karakter kacau akan muncul kembali. Meskipun masalah kode yang kacau ini dapat diselesaikan dengan mengubah pengaturan browser, hal ini tidak kondusif untuk meningkatkan pengalaman pengguna. Oleh karena itu, kita perlu menggunakan program untuk memberi tahu browser tabel kode mana yang harus dilihat untuk menampilkan data.
Copy kode kodenya sebagai berikut:
paket com.yyz.response;
impor java.io.IOException;
impor java.io.OutputStream;
impor javax.servlet.ServletException;
impor javax.servlet.http.HttpServlet;
impor javax.servlet.http.HttpServletRequest;
impor javax.servlet.http.HttpServletResponse;
//Masalah dengan keluaran bahasa Mandarin
kelas publik ResponseDemo memperluas HttpServlet {
public void doGet (permintaan HttpServletRequest, respons HttpServletResponse)
melempar ServletException, IOException {
//Di sisi server, dari tabel kode mana data dikeluarkan, maka perlu untuk mengontrol tabel kode mana yang membuka browser.
String data = "Tiongkok";
respon.setHeader("tipe konten", "teks/html;charset=UTF-8");
OutputStream keluar = respon.getOutputStream();
keluar.tulis(data.getBytes("UTF-8"));
}
public void doPost (permintaan HttpServletRequest, respons HttpServletResponse)
melempar ServletException, IOException {
doGet(permintaan,tanggapan);
}
}
Pelajari satu trik lagi:
Gunakan tag <meta> dalam bahasa HTML untuk mengontrol perilaku browser.
<meta http-equiv="Jenis konten'' content=''teks/html;charset=UTF-8">
http-equiv mensimulasikan header respons HTTP dan memberitahu browser untuk membukanya dalam tabel kode UTF-8. Header respons nyata lebih diutamakan daripada header respons yang disimulasikan dengan http-equiv.
Dalam pengembangan sebenarnya, server harus menggunakan aliran karakter untuk menulis data teks ke browser. Namun, tabel kode default dari aliran karakter yang diperoleh melalui metode respons getWriter adalah ISO8859-1. Tidak ada pengkodean bahasa Mandarin yang sesuai di tabel kode ini, jadi akankah diubah? Pengkodean yang sesuai dikirim ke browser, dan saat browser dibuka, penuh dengan tanda tanya. Tabel kode yang dikonsultasikan oleh server saat mengirim data dapat dimodifikasi melalui setCharacterEncoding respons.
Copy kode kodenya sebagai berikut:
paket com.yyz.response;
impor java.io.IOException;
impor java.io.PrintWriter;
impor javax.servlet.ServletException;
impor javax.servlet.http.HttpServlet;
impor javax.servlet.http.HttpServletRequest;
impor javax.servlet.http.HttpServletResponse;
//Masalah dengan keluaran bahasa Mandarin
kelas publik ResponseDemo memperluas HttpServlet {
public void doGet (permintaan HttpServletRequest, respons HttpServletResponse)
melempar ServletException, IOException {
//Di sisi server, dari tabel kode mana data dikeluarkan, maka perlu untuk mengontrol tabel kode mana yang membuka browser.
String data = "Tiongkok";
respon.setHeader("tipe konten", "teks/html;charset=UTF-8");
respon.setCharacterEncoding("UTF-8");
PrintWriter keluar = respon.getWriter();
keluar.tulis(data);
}
public void doPost (permintaan HttpServletRequest, respons HttpServletResponse)
melempar ServletException, IOException {
doGet(permintaan,tanggapan);
}
}
Ada beberapa detail kecil yang perlu diperhatikan di sini:
1. respon.setCharacterEncoding("UTF-8"); perlu ditulis di depan PrintWriter out = respon.getWriter();. Tidak ada gunanya mengatur pengkodean setelah mendapatkan aliran karakter.
2. respon.setHeader("content-type", "text/html;charset=UTF-8"); Ada cara yang lebih sederhana untuk menulis respon.setContentType("text/html;charset=UTF-8");.
3.response.setContentType("text/html;charset=UTF-8"); Kode ini sebenarnya memiliki dua fungsi: memberi tahu respons terhadap keluaran dalam UTF-8 dan browser untuk dibuka di UTF-8. Itu setara dengan respon.setHeader("content-type", "text/html;charset=UTF-8"); dan respon.setCharacterEncoding("UTF-8");.
4. Melalui bacaan di atas, pembaca seharusnya dapat memahami mengapa keluaran respon.getOutputStream.write(1); Karena browser adalah editor teks, setelah menerima data, diperlukan 1 untuk mencari tabel kode, dan kemudian menampilkan karakter yang sesuai. Jika Anda ingin menampilkan angka di browser, Anda harus mengubah angka tersebut menjadi string, respon.getOutputStream.write((1+"").getBytes());.
Gunakan OutputStream (byte stream) untuk mengirim data:
1. respon.getOutputStream().write("China".getBytes());//Kirim data dalam pengkodean default
2. respon.getOutputStream().write("China".getBytes("UTF-8"));//Kirim data dalam pengkodean UTF-8, browser (default GB2312) akan tampak kacau
Larutan:
2.1 Dengan mengubah metode pengkodean browser: IE/"View"/"Encoding"/"UTF-8" (tidak disarankan)
2.2 Beri tahu klien tentang metode pengkodean dengan mengatur header respons: respon.setHeader("Content-type", "text/html;charset=UTF-8");//Beri tahu browser tentang tipe data dan pengkodean
2.3 Simulasikan header permintaan melalui tag meta: out.write("<meta http-equiv='Content-Type' content='text/html; charset=utf-8' />".getBytes());
2.4 Melalui metode berikut: respon.setContentType("text/html;charset=UTF-8");