서블릿을 이용한 문자출력

MIN·2023년 9월 16일
0

Servlet/JSP

목록 보기
2/21
post-thumbnail
이 글은 유튜버 네이처님의 강의를 시청한 내용을 토대로 작성한 글입니다.
혹시 잘못된 내용이 있을 시 댓글로 알려주시면 감사하겠습니다 ^U^

웹페이지에 서블릿을 이용하여 문자열 출력을 해보려 한다!
처음이니 다른 개발도구를 사용하지 않고 메모장으로 시작해보겠다.

🌱 자바파일 만들기

WAS서버인 톰캣이 자바파일을 읽을 때 class의 이름은 중요치않게 생각한다. HttpServlet을 상속한 파일을 확인하기 때문에 내 마음대로 class이름을 지어준다. 또한 Service메서드를 main메서드처럼 사용할 예정이다.
나머지는..사실 너무 헷갈린다..뭐가 이렇게 복잡해....
작성한 예는 아래와 같다.

import javax.servlet.*;
import javax.servlet.http.*;
import java.io.*;

public class Min extends HttpServlet {
	public void service(HttpServletRequest request
    					, HttpServletResponse response)
                        throws IOException, ServletException
    {
    System.out.println("Hello, Servlet!");
    }
}

위 내용을 Min.java로 저장해 준다.

🌱 컴파일 하기

이제 이 파일을 컴파일하여 Min.class파일을 만들어줘야 한다!

위 java파일이 있는 탐색기 위치에서 cmd를 열고 바로 컴파일 명령어를 갈겨준다.

javac Min.java

(javac 명령어는 java compile이라는 뜻으로 해당 파일을 class파일로 컴파일 해준다.)

하지만..!! 컴파일이 되지않고 오류가 발생한다.
그 이유는 import한 servlet관련 파일들이 jdk에서 기본적으로 제공하는 것들이 아니기 때문이다. 따라서 위 파일을 제공하는 라이브러리를 직접 연결시켜주어야 한다.
그 라이브러리의 위치는
설치한 톰캣 폴더의 lib > servlet-api.jar 이다!

다시 cmd로 돌아가 위 라이브러리의 경로만 다시 붙여주면 되는데 경로를 넣는 명령어는 -cp이다

javac -cp 설치한톰캣폴더\lib\servlet-api.jar Min.java

이 명령어를 실행후 내가 만든 java파일 아래에 class파일이 생성된 것을 볼 수 있다.

🌱 실행하기

위에서 class파일도 만들었겠다 이제 실행을 시켜야 하는데 이 클래스 파일의 위치를 어디에 넣어야 하는걸까?
약속된 위치에 넣어주어야 하는데 그 위치는 다음과 같다.

톰캣폴더 > sebapps > ROOT > WEB-INF > classes

위의 classes폴더에 넣어주어야 하는데 classes폴더가 없다면 생성 후 넣어주면 된다. 그럼 이제 넣기만 하면 끝인걸까??

아니다.ㅎ

위 classes폴더가 담긴 WEB-INF 폴더는 특별한 의미를 지니고 있다.
바로 서버측에서만 사용하도록 되어있다는 것인데 여기에 담긴 파일들은 클라이언트가 아무리 호출을 해도 나타나지 않는 특징을 지닌다. 즉, 클라이언트에게서 숨겨진 폴더라는 것이다.
따라서 여기에 클래스파일을 담겠다는 약속은 기본적으로 클라이언트에게 보여주지 않겠다는 의미가 되겠다.

그렇다면 어떻게 클라이언트에게 해당 내용을 전달할 수 있을까?

클라이언트가 a를 요청하면 서버에서 a와 매핑된 코드를 찾는다.
a와 b가 매핑되어있다고 치면 서버는 a와 매핑된 b라는 코드를 뒤져서 실행을 시키게 되는 것이다.

이렇게 연결시켜주는 매핑작업을 우리가!! 해야한다.
(정말..해야할 일이 많다...)

매핑을 하는 파일이 따로 있는데 그 파일의 위치는 다음과 같다.

webapps > ROOT > WEB-INF > web.xml

web.xml 의 아래쪽에

위 코드가 적힌 부분 바로 아래에 매핑코드를 적어주면 된다.

<servlet>
    <servlet-name>hey</servlet-name>
    <servlet-class>Min</servlet-class>
</servlet>

<servlet-mapping>
    <servlet-name>hey</servlet-name>
    <url-pattern>/hello</url-pattern>
</servlet-mapping>

위 코드를 해석하면 다음과 같다.
클라이언트가 url을 통해 hello를 보내면
서버는 hello를 찾는다. hello파일이 없다면 매핑된 것이 있는지 확인한다.
확인을 해보니 hello는 hey와 매핑이 되어있고 hey는 클래스에서 Min을 의미한다.
이제 서버는 숨겨진 폴더 WEB-INF에서 Min클래스를 찾게된다.

매핑 끝^^

톰캣 내부의 파일을 건들였기 떄문에 startup.bat파일을 실행시켜준다.
이제 인터넷 주소창으로 가서 확인을 해보겠다.

localhost:8080/hello

오타가 없다면 계속해서 하얀 화면이 출력될 것이다.
내가 출력하도록 입력한 Hello, Servlet! 은 어디로 갔을까..
바로 startup.bat파일을 실행시킬 때 나오는 검은 콘솔에 출력이 되어있을 것이다. 🤤


🌱 웹페이지에 출력하기

정말...정말 해야할 일이 많다.
우리는 콘솔창에 출력을 하는 것이 목표가 아니다.
이제부터 우린 콘솔과 웹페이지, 총 2번 출력하는 것을 목표로 해야한다.

그렇게 하기 위해서는 맨 처음에 만들었던 java파일을 손봐야한다.

import javax.servlet.*;
import javax.servlet.http.*;
import java.io.*;

public class Min extends HttpServlet {
	public void service(HttpServletRequest request
    					, HttpServletResponse response)
                        throws IOException, ServletException
    {
    	OutputStream os = response.getOutputStream();
        PrintStream out = new PrinStream(os,true);
        out.println("Hello, Servlet!");
    }
}

매개변수로 받은 response를 통해 stream함수를 불러온다.
stream은 입출력을 받을 때 쓰는것이라고 한다.
불러온 것을 os에 저장하는데 우리는 문자열을 출력할 것이므로 문자열 출력에 용이한 PrintStream을 사용해준다.
매개변수 부분에 os와 true를 넣어주는데, true를 넣는 이유는 원래는 버퍼가 다차야만 출력을 해주는데 그거를 기다리지 않고 바로 출력을 해주게끔 하는 거라고 한다...근데 무슨말인지 모르겠음...ㅠ


이제 다시 java파일을 컴파일도 다시 해야한다.
하지만 컴파일을 한 후 이를 classes파일로 옮겨주기만 하면 이제 진짜
최종_최종_최최종_찐_최종 이다.

다시 주소창에서 localhost:8080/hello를 쳐주면 웹페이지에
Hello, Servlet! 이 출력됨을 볼 수 있다.

그래..서블릿아...널 웹페이지에서 만나니 너무나도 기쁘구나 ㅠㅠ 세상에 태어난걸 축하한다..^^ 🎉

profile
기초부터 시작하는 감쟈 ※ 소개글 확인해주세요!! ※

0개의 댓글