Servlet 상세 설명 (2): request 와 response 대상
11221 단어 JSP/Servlet
request 대상 은 서버 가 브 라 우 저 에 요청 한 패키지 이 고 response 는 서버 가 서버 에 응답 하 는 패키지 입 니 다.
request 는 요청 정 보 를 꺼 내 고 response 는 브 라 우 저 에 되 돌아 갈 정 보 를 추가 합 니 다.
response 대상 을 사용 하여 http 응답 프로 토 콜 의 정 보 를 설정 합 니 다.
Http 응답 정 보 를 생 성하 여 사용자 에 게 보 냅 니 다.
응답 첫 줄
HTTP/1.1 200 OK
setStatus(int sc)
: 정상 적 인 응답 상태 코드 status code setStatus(int sc, String sm)
: 정상 적 인 응답 상태 코드 를 설정 하고 상태 코드 설명 status message 를 설정 합 니 다. 시간 이 지나 면 정상 적 인 상태 에서 상태 코드 정보 가 사용자 에 게 표시 되 지 않 기 때문에 설정 할 필요 가 없습니다 sendError(int sc)
: 잘못된 상태 코드 설정 sendError(int sc, String sm)
: 잘못된 상태 코드 를 설정 하고 오류 정 보 를 포함 합 니 다 key:value
setHeader(String name, String value)
: 키 쌍 을 설정 하고 값 은 string setDateHeader(String name, long date)
: 키 쌍 을 설정 합 니 다. 값 은 long 이 고 long 은 밀리초 의 표시 setIntHeader(String name, int value)
: 키 쌍 을 설정 하고 값 은 int 형식 setHeader(String name, String value)
: 키 쌍 을 추가 합 니 다. 값 은 string setDateHeader(String name, long date)
: 키 쌍 을 추가 합 니 다. 값 은 long 이 고 long 은 밀리초 의 표시 setIntHeader(String name, int value)
: 키 쌍 을 추가 합 니 다. 값 은 int 형식 몇 개의 일반적인 응답 헤더:
응답 빈 줄
구분자
응답 본문
보 낼 자원
response.getWriter()
: 문자 흐름 가 져 오기 getOutputSteam()
: 출력 바이트 흐름 가 져 오기 수 동 구현:
재 정립 을 실현 하 는 것 은 매우 간단 하 다. 두 단계 만 필요 하 다.
response.setStatus(302)
response.setHeader("Location", "http://www.baidu.com");
직접 구현:
우 리 는
response.setRedirect("http://www.baidu.com")
만 사용 하면 실현 할 수 있다.Servlet 에 접근 하여 브 라 우 저 에 그림 을 전달 합 니 다.
//
InputStream is = getServletContext().getResourceAsStream("/WEB-INFO/mm.jpg");
//
byte[] buffer = new byte[1024];
//
int len = -1;
while((len = is.readBuffer(buffer)) != -1){
os.write(buffer, 0, len);
os.flush();
}
Servlet 에 접근 하여 파일 다운로드
그림 과 유사 하지만 브 라 우 저 는 파일 의 이름과 파일 의 종 류 를 식별 할 수 없습니다. 응답 헤더 에 파일 의 종 류 를 설정 해 야 합 니 다.
ServletContext sc = getServletContext();
String mimeType = sc.getMimeType(" "); // , mime
response.setContentType(type);
됐다.
request 대상 을 통 해 http 요청 프로 토 콜 의 내용 가 져 오기
http 요청 정 보 를 만 드 는 데 사용 합 니 다.
요청 줄
요청 방식 요청 경로 프로 토 콜 / 버 전 번호
request.getMethod()
요청 방식 request.getContextPath()
, getServletPath()
... 요청 경로 가 져 오기 request.getScheme()
요청 프로 토 콜 가 져 오기 키 쌍
request.getHeader(String name)
request.getIntHeader(String name)
request.getDateHeader(String name)
request.getHeaderNames()
request.getHeaders(Sring name)
하나의 key 가 여러 value 빈 줄 요청
본문 요청 (post 만 있 음)
그러나 다음 방법 은 get 이 든 post 요청 이 든 매개 변수 값 을 얻 을 수 있 습 니 다.
String getParameter(String name)
Map getParameterMap()
Enumeration getParameterNames()
String[] getParameterValues(String name)
응답 과 요청 의 난 장 판 문 제 를 해결 하 다.
get 요청 인 코딩 문제 처리
해결 방안:
conf/server.xml URIEncoding="UTF-8"
69 줄 에서<Connector URIEncoding="UTF-8"
connectionTimeout="20000"
port="8888"
protocol="HTTP/1.1"
redirectPort="8443"/>
URIEncoding 을 UTF - 8 로 설정
post 요청 인 코딩 문제 처리
서버 응답 시 데이터, 즉 서버 가 브 라 우 저 에 전달 하 는 데이터 의 인 코딩 형식 은 서버 에서 결정 합 니 다. 인 코딩 할 때 사용 하 는 인 코딩 표, 사용
getByte(" ")
설정 또는 사용 response.setCharacterEncoding( )
설정 입 니 다.이들 의 차 이 는 전 자 는 바이트 흐름 코드 표를 설정 하고 후 자 는 문자 흐름 코드 표를 설정 하 는 것 이다.디 코딩 할 때 사용 하 는 인 코딩 시트 는 http 응답 헤드 를 지정 하여 설정 합 니 다.
클 라 이언 트 가 요청 을 보 낼 때의 난 코드 해결: GET 제출, 매개 변 수 는 URL 에 있 고 URL 의 디 코딩 설정 을 설정 합 니 다. 서버 는 기본적으로 IOS - 8855 - 1 라틴 코드 표 디 코딩 URL 을 사용 합 니 다. 우 리 는
response.setHeader("ContentType","text/html;charset=utf-8")
설정 파일 을 통 해: <Connector
connectionTimeout="20000"
port="8080"
protocol="HTTP/1.1"
redirectPort="8443"/>
속성 추가
tomcat/config/server.xml
서버 의 기본 디 코딩 url 방식 을 utf - 8 로 설정 할 수 있 습 니 다.아니면 doget 방법 에서
받 은 어 지 러 운 문 자 를 새 메타 로 변환 합 니 다:
String name = request.getParamter("name"); //
byte[] bs = name.getBytes("IOS-8859-1"); // ,
String s = new String(bs, "UTF-8"); // ,
POST 제출:
GET 가 디 코딩 을 제출 하 는 것 과 차이 점: 디 코딩 이벤트 와 달리 GET 는 인자 가 URL 에 있 기 때문에 서버 가 요청 을 받 아들 이면 바로 인 자 를 디 코딩 하고 POST 는 Servlet 에서 인 자 를 가 져 오 는 방법 을 호출 할 때 디 코딩 합 니 다.따라서 post 요청 의 난 장 판 을 해결 하 는 것 은 간단 합 니 다. 매개 변수 호출 전에 만 사용 하 십시오.
request.setCharacterEncoding("utf-8");
디 코딩 요청 표를 설정 하면 됩 니 다.
request 전송 요청 실현 및 request 필드
이것 이 바로 전송 요청, 브 라 우 저 전송 요청, servlet 처리 request 와 response 일부 업무 입 니 다. 그러나 전부 처리 할 수 없고 페이지 에 간단하게 표시 할 수 없 기 때문에 처 리 된 request 와 response 를 jsp, jsp 에 보 내 고 업무 수행 을 하 며 브 라 우 저 에 응답 하여 보 여 줍 니 다.
리 트 윗 을 요청 하 는 것 은 주로 분업 작업 에 쓰 인 다.
AServlet doGet():
// *****
//todo AServlet ,
// :=>
// Bservlet
BServlet bServlet = new BServlet();
bServlet.doGet(request, response);
//*****
// request ( , ) , BServlet, AServlet BServlet request ,request request Map。
request.setAttribute("name","Feathers"); // request
request.getRequestDispatcher("/servlet/BServlet").forword(request.response);
BServlet doGet():
// todo
// request
System.out.println((String)request.getAttribute("name"));
주의:
리 트 윗 된 Servlet 에서 브 라 우 저 에 응답 본문 내용 을 출력 할 수 없 지만 응답 헤드 를 추가 할 수 있 습 니 다.Servlet 에 서 는 응답 체 를 추가 하 더 라 도 비 워 지기 때 문 입 니 다.
리 셋 과 리 트 윗 의 차이
요청 포함
리 트 윗 을 요청 합 니 다. 리 트 윗 을 요청 하 는 Servlet 은 요청 체 를 수정 할 수 없습니다. 요청 이 포함 되 어 있 습 니 다. 리 트 윗 을 요청 하 는 것 과 유사 하지만 요청 체 를 수정 할 수 있 습 니 다.용도: 중복 작업 을 해결 하 는 데 사용 합 니 다.반복 되 는 작업 을 이 Servlet 에서 추출 하여 통일 적 으로 처리 합 니 다.
여러 JSP 에서 사용 되 며, 하나의 jsp 는 같은 조작 을 처리 하 는 데 사용 되 며, 나머지 jsp 는 필요 여부 에 따라 순서대로 처리 합 니 다.
구현: AServlet doGet ():
response.setContentType("text/html;charset=utf-8");
//
request.getRequestDispatcher("/servlet/BServlet").include(request,response);
response.getWriter().write("Aservlet ");
BServlet doGet():
response.getWriter().write("Bservlet ");
결과:
Aservlet Bservlet