티스토리 뷰

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> ");
}
공지사항
최근에 올라온 글
최근에 달린 댓글
Total
Today
Yesterday
링크
TAG
more
«   2024/05   »
1 2 3 4
5 6 7 8 9 10 11
12 13 14 15 16 17 18
19 20 21 22 23 24 25
26 27 28 29 30 31
글 보관함