09 - 서블릿(Servlet) 문자열 출력

강철의사나이·2022년 1월 14일
0

8강까지 콘솔에 출력하는 것을 실행했고,
지금부터 사용자(클라이언트)에게 출력하는 것을 실행한다.


자바를 이용해서 웹 프로그램을 만들고 있는데
서블릿은
웹이 담당하는 것은 ui이다.
ui에는 콘솔 ui, 윈도우 ui가 있다.

입력과 출력을 담당하는 부분이 웹으로 바뀌고
웹은 서버에서 클라이언트에게 원격으로 있는 곳에 데이터를 보내서 출력하는 결과를 보여준다.
(또는 원격으로부터 클라이언트에게 입력을 받는 부분을 다룸)

기존의 입력과 출력의 내용이 다르기 때문에 이를 이해하는 것이 자바를 이용해서 웹프로그래밍을 다루는데 도움이 된다.

서비스라는 함수는 우리에게 두 개의 인자를 전해준다.
request객체, rsponse객체

HttpServletRequest
서블릿을 만들 때 필요한 요청 도구

HttpServletResponse response)
출력(응답 도구)

입출력에 대한 내용만 이해하면 기존의 자바에서 사용한 것과 같이 똑같이 만들 수 있다
(이에 더불어서 입출력을 웹으로 할 수 있다)

HttpServletRequest은 입력 도구므로 쓸 필요가 없고

HttpServletResponse이 출력 도구이므로 갖고 있는 도구를 꺼내서 사용자에게 출력을 어떻게 할 것인지 알아보자.

출력이나 입력을 할 때는 stream을 쓰는 것이 기본이다.
(ex)파일 입/출력, 콘솔 입/출력)

네트워크 입출력에서도 stream을 쓴다.
우리는 binary나 byte를 출력하는 것이 아닌 문자를 출력하므로

stream 객체를 그대로 쓰는 것보다
PrintStream객체가 있으므로 랩핑해서 쓰는 것이 낫다.

기본적인 출력 stream 객체를 이용해서 쉽게 문자열을 출력하도록 pritn 계열의 함수들을 제공하는 객체다.

true
네트워크로 출력되는 스트림은 글자를 썼다고 보내는 게 아니라문자가 쌓여야 보내진다.
운영체제가 윈도우일 경우 버퍼가 8kb정도 되는데,
출력 버퍼가 이정도 쌓여야 보내진다.
hello servelt라는 글자를 출력할 때 버퍼를 꽉 채우지 못하면 가지않고 기다린다.
내가 만약 버퍼에 뭔가를 쓰고 print를 했을 때 true를 쓰면
기다리지 말고 말고 pritn 단위로 출력하라는 옵션이다.


print 함수를 써서 문자를 출력할 것이다.
out객체는 Printstream의객체이고,
PrintStream out 객체는
출력이라는 스트림 객체를 랩핑하고 있는 도구이다.

Printstream객체를 사용했으니 기존에 우리가 사용한
syetem.out 객체처럼 println이나 printf나 print를 쓸 수 있다.

이전에 system.out.println("Hello Servlet");을 사용했을 때는 서버쪽 콘솔에 출력됐다면

out.println("Hello Servlet");는 원격에 있는 클라이언트에게 전달된다.

이제 출력을 하려고 하는데 해야 할 것들이 많다.
우선

  1. 소스 코드를 고치고
  2. 컴파일 다시 하고
  3. 배포 다시 하고
  4. 서버 다시 실행하고
  5. 브라우저에 주소 입력을 다시 해야 한다.

이 절차들이 너무 많고 복잡하다.

이 모든 것들을 쉽게 개발하고 쉽게 수정할 수 있도록 통합 환경인 이클립스로 수정하고 개발할 것이다.

이 절차들을 메모장으로 개발해보고 불편함을 느껴보자.

  1. 소스코드 고치기

    OutputStream os = response.getOutputStream();
    //출력스트림을 받는다.
    PrintStream out = new PrintStream(os, true);
    // 출력 스트림을 조작하는 객체를 생성 (true : 스트림의 버퍼가 가득 차지 않아도 출력)
    out.println("Hello Servlet");
    // 문자열 브라우저로 출력
  1. 컴파일 하기
    수정 전

수정 후

빨간색 동그라미를 보면 수정한 부분이 반영됨을 볼 수 있다.

  1. 배포
    톰캣이 갖고 있는 classes 폴더에 옮겨야 함

    classes폴더에 옮긴 후

4.서버 재실행
class파일을 톰캣이 다시 시작하면서 읽어야 함.

  1. 브라우저에서 주소 재입력

출력되는 것을 확인할 수 있다.

만약 문자를 출력하는 것이 기본이라면

이렇게 복잡하게 쓸 필요가 없다.

만약 어떤 파일을 읽어서 파일을 binary로 전달한다면 위처럼 하겠지만,


일반적으로 문자를 출력할 때는
OutputStream os = response.getOutputStream();
얘를 직접 쓰는 것이 아니라

PrintStream을 기본적으로 쓴다.
그리고 이 PrintStream을 기본적으로 제공하는 getter가 있다.

아까는 PrintStream을 쓰는데, 여기서는 왜 PrintWriter를 사용할까
io관련된 스트림을 공부해보면 알 수 있는데

자바에서는 Stream 계열이 있고 Writer 계열이 있다.
문자를 쓰는데 다국어다? => PrintWriter를 사용한다.

여기서 Writer 계열을 이용해서 한국어를 사용하는 우리도
PrintStream을 사용할 수 있는 것이다.

out.println를 메서드를 사용할 수 있는 것은 동일하고
Hello Servelt 대신 한국어를 사용할 수 있다.

앞으로 문자를 출력하겠다 하면 Writer를 얻어서
바로 출력하는 것이 바람직하다.

0개의 댓글