티스토리 뷰
1-4. 개발환경 세팅 및 준비
- 환경 세팅
> JRE/JDK 설치 (이미 설치되어 있었음)
> Eclipse for Java EE 설치: 자바 웹개발을 위한 플러그인들이 같이 들어있음
> Preference에서 에디터, HTML/CSS/JSP 파일들에 대한 인코딩을 UTF-8로 세팅
> Apache Tomcat 설치. JAVA_HOME 환경변수 세팅 제대로 되어있는지 확인
- 테스트
> 자바 프로젝트 생성
> Package Explorer에는 src라는 폴더밖에 안보이지만 실제로는 .project, bin 등 여러 폴더가 더 만들어진다. src에 파일을 만들고 컴파일하면 bin 폴더 안에 .class 파일이 생성됨
> 자바 웹 프로그래밍을 위해 Java EE Perspective로 넘어가서 Dynamic Web Project 생성.
Target Runtime 지정 필요: 웹 애플리케이션을 실행하기 위한 WAS를 지정 (Apache Tomcat 8.5 선택)
> 서블릿: URL 요청을 처리하는 프로그램.
Create Servlet -> 패키지 이름, 클래스 이름 임의로 지정 -> 'URL mapping' 지정
'http://localhost:8080/프로젝트이름/URL mapping 값' 으로 접속하면 얘가 실행되게 한다.
그 다음엔 어떤 메서드를 기본으로 상속받을건지 선택할 수 있는데, 일단 doGet만 활성화시켜주고 생성
> doGet: HTTP get 요청을 받을때 얘가 실행됨
> doGet() 메서드 안에 코딩
response.setContentType("text/html;charset=UTF-8"); // 내가 응답할 내용은 text, html 형식이며 UTF-8 형식이다
PrintWriter out = response.getWriter();
out.print("<h1>Hello Servlet!</h1>"); // 여기 HTML 코드를 넣으면 된다
> response 객체: 응답에 대한 각종 정보를 추상화시켜놓은 객체
> Run as -> Run on Server
이미 톰캣을 다른 창에서 실행해놓은 상태라면 이미 8080포트가 사용중이라는 에러가 뜬다. 종료하고 다시 실행
> Window -> Web Browser 항목에서 사용할 웹 브라우저를 변경할 수 있음
+ Java Code Conventions (코딩 규칙)
> 클래스이름은 첫글자를 대문자로
> 프로젝트, 패키지 이름은 소문자로
1-5. 서블릿
- 서블릿이란?
자바 Web App의 구성요소 중 동적인 처리를 맡는 부분으로, WAS에서 동작하는 자바 클래스.
HttpServlet 클래스를 상속받음.
JSP와 서블릿을 같이 사용한다면, HTML 화면구성 등은 JSP로 표현하고 복잡한 로직은 서블릿으로 구현함.
Java Web App = HTML + CSS + 이미지 등 리소스 + 자바 클래스 (Servlet/package/인터페이스) + 각종 설정파일
- WEB-INF 폴더: 톰캣에서 돌릴 웹 애플리케이션에 대한 내용들을 이 폴더에 담는다
web.xml 파일 (매니페스트 비슷한 것), lib 폴더 (jar 파일들), classes 폴더 (java 패키지, 클래스들)
- 서블릿 작성방법: ver 3.0을 기준으로 다름
> ver 3.0 이상: web.xml 파일을 사용하지 않고 자바 어노테이션 (annotation) 을 사용
* 어노테이션: 클래스나 함수이름 바로 위에 회색 글씨로 표시되는 @~. 코드에 대한 메타데이터로, 주석과는 달리 사람이 이해하기 위한 것 뿐 아니라 컴파일러나 개발툴, 프레임워크에게 어떤 정보를 전달하는 역할을 함
> ver 3.0 미만: web.xml 파일에 서블릿을 등록
- 실습 (exam31)
> Dynamic web module version을 3.1로 지정
> Context root: localhost:8080/ 다음에 올 이름
> 자동으로 web.xml을 만들 것인지 정할 수 있는 체크박스가 있는데, 지금은 필요없지만 web.xml이 필요한 경우 체크
> 서블릿 클래스 이름 위에 어노테이션으로
@WebServlet("/...") 이런게 있는데 이 값을 바꿔주면 URL mapping 값이 바뀜
> doGet, doPost... 같은 메서드들을 보면 기본적으로 request, response라는 파라미터를 받게 되어있는데 말 그대로 HTTP 요청, 응답을 다루는 객체임
- 실습 (exam25: 서블릿 2.5버전)
서블릿을 만들면 저런 코드가 web.xml에 자동으로 들어감. (안드로이드에서 액티비티를 만들면 자동으로 매니페스트에 추가되는 거랑 비슷하다고 보자)
요청을 받으면 servlet-mapping 안에서 맞는 url-pattern을 찾고, 해당 url-pattern이랑 쌍인 servlet-name을 위쪽의 서블릿 리스트에서 찾아서, 그 서블릿 클래스를 실행하도록 되어있음.
URL을 바꾸고 싶으면 (위에서 어노테이션 부분을 바꿨듯) url-pattern 부분을 바꿔주면 된다.
- 서블릿의 생명주기 (Lifecycle)
생성자 -> init() -> service() -> destroy()
> 생성자: 요청이 들어오면 요청된 객체가 메모리에 있는지 없는지 체크해서, 없으면 생성함
> init(): 처음 생성될때 생성자 이후에 실행
> service(): 요청이 들어올 때마다 실행 (페이지 새로고침시 init은 실행되지 않고 service만 재실행)
> destroy(): WAS가 종료되거나, 서블릿이 갱신될 경우 실행
- service(request, response) 메서드
HttpServlet의 service() 메서드는 "템플릿 메서드 패턴" 으로 구현되어 있음
> 클라이언트의 요청이 GET인지 POST인지에 따라서 doGet, doPost를 호출함
- doGet(), doPost() 의 동작 예시
> doGet() 에는 form 태그 (method=post, action=mapping된 URL) 를 포함한 HTML을 출력하도록 코딩.
> doPost() 에는 위의 doGet() 으로 만들어진 페이지에서 Submit을 누르면 나오는 결과 페이지를 코딩.
HTML form 태그로부터 입력된 값을 받아오려면: req.getParameter("name")
- HttpServletRequest, HttpServletResponse 객체
WAS는 웹브라우저로부터 서블릿 요청을 받으면, 이 2개의 객체를 생성하여 서블릿에게 전달함
> Request 객체에는 요청할때 들어온 다양한 정보들을 담음 (헤더, 파라미터, 쿠키, URI/URL...)
> Response 객체에는 요청을 한 클라이언트에게 보내줘야 할 정보들을 담음 (Content Type, 응답코드 및 메시지...)
아래는 Request 객체에서 헤더 정보를 뽑아내서 출력해보는 코드.
Enumeration<String> headerNames = request.getHeaderNames(); // req 객체가 갖고있는 헤더들을 get
while(headerNames.hasMoreElements()) { // 순회하면서 출력
String headerName = headerNames.nextElement();
String headerValue = request.getHeader(headerName); // getHeader()
out.println(headerName + " : " + headerValue + " <br> ");
}