웹 서버가 클라이언트의 http 요청을 받으면 요청을 나타내는 요청 객체와 각 요청에 대한 응답을 나타내는 응답 객체를 생성합니다. 요청과 응답 개체는 요청과 응답을 나타내므로 클라이언트가 제출한 데이터를 얻으려면 요청 개체만 찾으면 됩니다. 클라이언트에 데이터를 출력하려면 응답 객체를 찾으세요.
다음과 같이 코드 코드를 복사합니다.
패키지 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;
//중국어 출력에 문제가 있습니다.
공개 클래스 ResponseDemo는 HttpServlet을 확장합니다.
공개 무효 doGet(HttpServletRequest 요청, HttpServletResponse 응답)
ServletException, IOException이 발생합니다.
문자열 데이터 = "중국";
OutputStream 출력 = response.getOutputStream();
out.write(data.getBytes());
/**
* out.write(data.getBytes()); 이 코드에는 코드 테이블을 두 번 확인하는 작업이 포함됩니다.
* "중국"이 문자 데이터에서 바이트 데이터로 변경되는 경우 gb2312 코드 테이블을 참조합니다.
* 데이터가 표시를 위해 브라우저로 전송되면 코드 테이블을 다시 참조해야 합니다. 이때 참조하는 코드 테이블은 브라우저 설정과 관련됩니다.
*/
}
공개 무효 doPost(HttpServletRequest 요청, HttpServletResponse 응답)
ServletException, IOException이 발생합니다.
doGet(요청,응답);
}
}
브라우저 인코딩이 GB2312로 설정된 경우의 테스트 결과:
브라우저 인코딩이 UTF-8로 설정된 경우의 테스트 결과:
외국 사용자가 당사 웹사이트에 접근할 수 있도록 하기 위해 문자 데이터를 바이트 데이터로 변환할 때 변환 코드 테이블을 UTF-8로 지정해야 합니다. 하지만 이때 GB2312로 브라우저를 열면 다시 깨진 문자가 나타납니다. 이러한 잘못된 코드 문제는 브라우저 설정을 변경하여 해결할 수 있지만 사용자 경험을 향상시키는 데 도움이 되지 않습니다. 따라서 데이터를 표시하기 위해 참조해야 할 코드 테이블을 브라우저에 알려주는 프로그램을 사용해야 합니다.
다음과 같이 코드 코드를 복사합니다.
패키지 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;
//중국어 출력에 문제가 있습니다.
공개 클래스 ResponseDemo는 HttpServlet을 확장합니다.
공개 무효 doGet(HttpServletRequest 요청, HttpServletResponse 응답)
ServletException, IOException이 발생합니다.
//서버 측에서 데이터가 출력되는 코드 테이블은 브라우저가 열리는 코드 테이블을 제어해야 합니다.
문자열 데이터 = "중국";
response.setHeader("content-type", "text/html;charset=UTF-8");
OutputStream 출력 = response.getOutputStream();
out.write(data.getBytes("UTF-8"));
}
공개 무효 doPost(HttpServletRequest 요청, HttpServletResponse 응답)
ServletException, IOException이 발생합니다.
doGet(요청,응답);
}
}
한 가지 비결을 더 알아보세요:
브라우저 동작을 제어하려면 HTML 언어의 <meta> 태그를 사용하세요.
<meta http-equiv="Content-type'' content=''text/html;charset=UTF-8">
http-equiv는 HTTP 응답 헤더를 시뮬레이션하고 브라우저에 UTF-8 코드 테이블에서 열도록 지시합니다. 실제 응답 헤더는 http-equiv로 시뮬레이션된 응답 헤더보다 우선합니다.
실제 개발에서 서버는 문자 스트림을 사용하여 브라우저에 텍스트 데이터를 써야 합니다. 그런데 응답의 getWriter 메소드를 통해 얻은 문자 스트림의 기본 코드 테이블은 ISO8859-1입니다. 이 코드 테이블에는 해당 중국어 인코딩이 없으므로 변경됩니다. 해당 인코딩이 브라우저로 전송되고, 브라우저가 열리면 물음표로 가득 차 있습니다. 데이터 전송 시 서버에서 참조한 코드 테이블은 응답의 setCharacterEncoding을 통해 수정할 수 있습니다.
다음과 같이 코드 코드를 복사합니다.
패키지 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;
//중국어 출력에 문제가 있습니다.
공개 클래스 ResponseDemo는 HttpServlet을 확장합니다.
공개 무효 doGet(HttpServletRequest 요청, HttpServletResponse 응답)
ServletException, IOException이 발생합니다.
//서버 측에서 데이터가 출력되는 코드 테이블은 브라우저가 열리는 코드 테이블을 제어해야 합니다.
문자열 데이터 = "중국";
response.setHeader("content-type", "text/html;charset=UTF-8");
response.setCharacterEncoding("UTF-8");
PrintWriter 출력 = response.getWriter();
out.write(데이터);
}
공개 무효 doPost(HttpServletRequest 요청, HttpServletResponse 응답)
ServletException, IOException이 발생합니다.
doGet(요청,응답);
}
}
여기서 주의해야 할 몇 가지 작은 세부 사항이 있습니다.
1. response.setCharacterEncoding("UTF-8");은 PrintWriter out = response.getWriter(); 앞에 작성되어야 합니다. 문자 스트림을 얻은 후에 인코딩을 설정하는 것은 쓸모가 없습니다.
2. response.setHeader("content-type", "text/html;charset=UTF-8"); response.setContentType("text/html;charset=UTF-8");을 작성하는 더 간단한 방법이 있습니다.
3.response.setContentType("text/html;charset=UTF-8"); 이 코드에는 실제로 UTF-8로 출력하도록 응답을 알리는 기능과 UTF-8로 열도록 브라우저에 알리는 기능이 있습니다. 이는 response.setHeader("content-type", "text/html;charset=UTF-8") 및 response.setCharacterEncoding("UTF-8");과 동일합니다.
4. 위 내용을 통해 독자는 브라우저에서 response.getOutputStream.write(1)의 출력이 1이 아닌 이유를 이해할 수 있어야 합니다. 브라우저는 텍스트 편집기이기 때문에 데이터를 받은 후 코드 테이블을 조회하고 해당 문자를 표시하는 데 1이 걸립니다. 브라우저에서 숫자를 출력하려면 숫자를 문자열 response.getOutputStream.write((1+"").getBytes());로 변환해야 합니다.
OutputStream(바이트 스트림)을 사용하여 데이터를 보냅니다.
1. response.getOutputStream().write("China".getBytes());//기본 인코딩으로 데이터 보내기
2. response.getOutputStream().write("China".getBytes("UTF-8"));//UTF-8 인코딩으로 데이터를 보내면 브라우저(기본 GB2312)가 깨져서 나타납니다.
해결책:
2.1 브라우저의 인코딩 방법 변경: IE/"View"/"Encoding"/"UTF-8" (권장하지 않음)
2.2 응답 헤더를 설정하여 클라이언트에 인코딩 방법을 알립니다. response.setHeader("Content-type", "text/html;charset=UTF-8");//브라우저에 데이터 유형 및 인코딩을 알립니다.
2.3 메타 태그를 통해 요청 헤더 시뮬레이션: out.write("<meta http-equiv='Content-Type' content='text/html; charset=utf-8' />".getBytes());
2.4 다음 방법을 통해: response.setContentType("text/html;charset=UTF-8");