금요일, 1월 10
Shadow

#027 JSP를 사용해 보자

미분류
1. JSP가 되어 보자 그리하여 JSP는 서블릿이 되었더라 컨테이너가 서블릿을 작성하는 과정은 먼저 여러분이 작성한 JSP파일을 서블릿 소스코드 파일로 바꾼뒤, 서블릿 클래스로 컴파일 합니다. 돌아왔든 바로왔든 결국은 서블릿이 됩니다. 스크립틀릿 코드 <% out.println(Counter.getCount()); %> 표현식 코드 <%= Conter.getCounter() %> 변수, 메소드 선언문 <%! int count=0; %> <%! int doubleCunt(); %> -> JSP 선언문에 기술하면 클래스 내부에 서비스 메소드나 여타 메소드의 바깥쪽에 위치하게 됩니다 여기에 간단한 정적인 변수나 메소드 아니면 인스턴스변수나 메소드를 만들수 있습니다. 컨테이너와 내장객체 비교 API -> 내장객체 JSPWriter -> out HttpServletRequest -> request HttpServletResponse -> response HttpSession -> session ServletContext -> application ServletConfig -> config JspException -> exception PageContext -> pageContext Object -> page 생성된 서블릿의 API 컨테이너는 JSP 파일을 HttpJspPage 인터페이스를 구현한 서블릿 클래스를 변환하여 생성합니다. 아래 나와있는 AP...

#026 세션관리

미분류
대화상태 유지하기 세션은 어떻게 작동하는가 1. 다이아나는 dark를 선택 한 다음 submit 버튼을 클릭합니다. 컨테이너는 BeerAPP서블릿의 새로운 스레드로 요청을 보냅니다. BeerApp스레드는 다이아나의 세션을 찾아서 세션의 속성에 그녀가 선택한 Dark를 저장합니다. 2. 서블릿은 비즈니스 로직을 실행하고 응답합니다. 여기서 질문을 하나 더 하죠 생각하는 가격대는 어떻게 됩니까? 3. 다이아나는 페이지에 뿌려진 새오운 질문을 보고는 생각합니다. 그리고는 비싸다는 Expenseive를 선택하고는 submit 버튼을 클릭합니다. 컨테이너는 beerApp서블릿의 새로운 스레드로 요청을 보냅니다. BeerApp스레드는 다이아나의 세션을 찾아서 세션의 속성으로 그녀가 선택한 expensive를 저장합니다 . 4. 서블릿은 비즈니스 로직을 실행하고 응답합니다. 이 경우는 앞서한 질문에 대한 응답이겠죠 5. 다이아나의 세션은 여전이 활성화 상태입니다. 테리가 pale를 선택하고 submit버튼을 클릭합니다. 컨테이너는 테리의 요청을 beerApp서블릿의 새로운 스레드로 보냅니다. BeeraApp서블릿의 스레드는 테리를 위한 새로운 새션을 만듭니다. 그리고 테리가 선택한 Pale을 저장하기 위하여 setAttribute()메소드를 호출합니다. 문제점 하나 - 컨테이너는 클라이언트를 어떻게 구분하는가? 클라이언트는 유일한 세션 ID가 필요하다. 클라이언트가 제일 처음 요청을 보낼때 컨테이너는 클라이언트의 유일한 세션ID를 생성하는거죠 그리고 이 값을 Response에 넣어 클라이언...

#025 속성과 리스너

미분류
01. 웹 애플리케이션이 되어 보자 도와주세요 ~ 초기화 파라미터 서블릿도 초기화 파라미터가 있습니다. DD파일에서.. <init-param> <param-name> adminEmail</param-name> <param-value>likewecare@wike.com</param-value> </init-param> 서블릿 코드에서 : out.println(getServletConfig().getInitParameter("adminEmail")); 서블릿 초기화가 된 다음에야 서브릿 초기화 파라미터를 사용할수 있습니다. 메소드가 리턴한 ServletConfig, 객체에 대한 참조를 가지고 ServletConfig의 메소드를 호출할수 잇습니다. GetInitParameter()메소드 같은것 말이죠 그러나 서블릿 생성자에서는 이 메소드를 호출할수 없습니다. 서블릿이 일생을 잘 훓어보면 너무 일찍 호출했다는 것을 알수 있을겁니다. 컨테이너가 서블릿의 init()을 호출하고 난 다음에야, 서블릿은 서블릿의 정체성을 갖기 때문입니다. *컨테이너가 서블릿을 초기화할때, 서블릿마다 하나식 ServletConfig를 생성합니다. 컨테이너는 DD에서 서블릿 초기화 파라미터를 읽어 이 정보를 ServletConfig로 넘겨줍니다. 그다음 ServletConfig를 서블릿 init() 메소드에 제공하지요 컨테이너가 서블릿을 초기화 할때 단 한번만 서블릿 초기화 파라미터를 읽습니다. 컨테이너가 서블릿을 만들때 DD를 읽어...

#024 요청과 응답

미분류
01. 서블릿이 되어 보자. 서블릿은 컨테이너가 관리합니다. Request, Response 객체를 생성하고, 서블릿의 새로운 스레드를 만들어 서블릿 service() 메소드를 호출하고, Request와 Response 객체에 대한 참조를 인자로 넘긴다는 내용입니다. 1. 사용자가 서블릿에 대한 링크(URL)을 클릭합니다. 2. 컨테이너는 요청된 Request가 서블릿이라는 것을 간파하고는 다음 두개의 객체를 생성합니다. 1)HttpServletResponse 2)HttpServletRequest 3. 접수한 요청의 URL을 분석하여 어떤 서블릿을 요청했즌지 파악합니다. 그다음 해당 서블릿 스레드를 생성하여 Request, Response  객체참조를 넘깁니다. 4. 컨테이너는 서블릿 Service() 메소드를 호출합니다. 브라우저에서 지정한 방식에 따라 doget()을 호출할지 doPost()를 호출할지 결정합니다. 클라이언트가 HTTP GET 메소드를 날렸다면, service()  메소드는 서블릿의 doGet(0 메소드를 호출합니다. 호출할때 Request와 Response객체를 인자로 넘깁니다. 5. 서블릿 클라이언트에게 응답을 작성하기 위하여 response 객체를 사용합니다. 이작업을 완료하면 Response에 대한 제어는 컨테이너에게 넘깁니다. 6. service() 메소드가 끝나면, 스레드를 소멸하거나 아니면 컨테이너가 관리하는 스레ㅐ드 풀로 돌려보냅니다. 그다음 Requset와 Response 객체는 가비지 컬렉션이 될 준비를 할 것이며, 이 객체에 댛나 참조는 이제 범위...

#023 초간단 MVC

미분류
01. 초간단 미니 MVC 튜토리얼 실제 웹 애플리케이션을 빌드해보자 1. 사용자화면(브라우저에 화면에 어떤 내용을 보여줄것인가)에 대하여 살표 봅시다. 이는 고차원 구조화 작업입니다. 2. 이번 프로젝트에서 사용할 개발 환경을 만들어 봅시다. 여기서 마든 개발 환경은 다른 장에서 계속하여 예제로 사용할 것입니다. 3. 이번 프로젝트에서 사용할 배포호나경을 만들어 봅시다. 여게서 마든 배포 호나경은 다른 장에서 계속해서 에제로 사용할 것입니다. 4. 웹 애플리케이션에 들어가는 여러 콤포넌트는 반복적인 개발과 테스트를 통하여  구현할것입니다. 애플리케이션 아캐텍처는 이렇게.. 1. 클라이언트라 form.html을 요청합니다. 2. 요청을 받은 컨테이너가 form.html을 파일시스템에서 읽어 옵니다. 3. form.html을 브라우저로 넘겨줍니다. 화면을 보고 사용자가 맥주 색깔에 관련된 질문에 자신의 취향을 입력합니다. 4. 사용자가 선택한 정보를 컨테이너로 보냅니다. 5. 컨테이너는 URL을 분석하여 담당 서블릿을 찾아 요청을 넘깁니다. 6. 서블릿은 BeerExpert 클래스를 호출합니다. 7. BeerExpert클래스는 맥주에 대한 조언을 서블릿으로 넘겨줍니다. 서블릿은 이 정보를 Request객체에 저장합니다. 8. JSP에 Request 객체를 forwad 합니다. 9. JSP는 서블릿이 넣어 놓은 정보를 Request객체에서 추출합니다. 10. JSP는 여기에 바탕하여 HTML페이지를 작성합니다. 11. 컨테이너는 이 페이지를 한껏 대하고 있는 사용자에게 넘겨줍...

#022 조금 더 깊이 들어가보죠

미분류
01. 웹애플리케이션 아키텍쳐 컨테이너, 넌 누구냐? 서블릿에는 main() 메소드가 없다는데. 서블릿은 컨테이너라 부르는 자바 애플리케이션의 지배를 받습니다. 아파치와 같은 웹 서버가 사용자로 부터 서블릿에 대한 요청을 받으면 서블릿을 바로 후출하는것이 아니라, 서블릿을 관리하고 있는 컨터네이너에게 이 요청을 넘깁니다. 여기서 컨테이너란 물론 서블잇이 배포된 컨테이너를 말하겠죠. 요청을 넘겨받은 컨테이너는 HTTP Request와 HTTP Response 객체를 만들어, 이를 인자로 서블릿 doPost()나 doGet() 메소드 중 하나를 호출합니다. 클라이언트->요청->웹서버->컨텐이너->서블릿->컨테이너->우베서버->응답->클라이언트 컨테이너가 주는 혜택? 컨테이너가 서블릿을 실해아고 관리한다는 것은 이미 말했다. 하지만 컨테이너가 꼭 필요한가요? 1. 통신 지원 : 서버와 대화하기 위해 개발자가 직접 ServerSocket을 만들고, 특정 포트에 리스닝하고, 연결 요청이 들어오면 스트림을 생성하는등 이러한 복잡한 인련의 일을 할 필요가 없다는 것이죠 컨테이너는 어떻게 웹서버와 통신해야 하는지 잘 알고 있으며, 이러한 통신 기능을 API로 제공합니다. 따라서 우베서버와 서블릿이 서로 통신하기 위한 통로인 통신API에 대해 개발자가 고민할 피룡가 없다는 것이죠 2. 생명주기 관리 : 컨테이너는 서블릿의 탄생과 죽음을 관리하빈다. 개발자 관점에서 보자면, 서블릿 클래스를 로딩하여 인스턴스호 하고, 초기화 메소드를 호출하고, 요청...

#021 먼저 간략히 알아봅시다.

미분류
01. 서블릿과 JSP는 어디에 쓰는 물건이고 웹 서버는 어떤일을 하나요? 클라이언트는 서버에게 요청을 한다. 서버는 요청한 내용을 응답한다. 요청 : 요청에는 요청한것에 대한 이름과 주소 정보가 들어있다. 응답 : 클라이언트가 요청한 내용이 들어있다. 물론 서버가 못찻는 경우, 오류 메시지가 대신 들어간다. 클라이언트는 무엇을 하나? 웹 클라이언트는 사용자가 서버에 요청을 보낼수 있는 기능을 제공합니다. 요청을 보내고 난 다음, 서버가 보애농ㄴ 요청의 결과를 화면에 출력하는 일도 클라이언트의 역할이죠 사용자 : 사용자가 웹 페이지에 있는 링크를 클릭합니다. 브라우저 : 부라우저는 이를 요청으로 만들어 서버에 넘깁니다. 서버 : 서버는 요청한 페이지를 열심히 찾습니다. 서버 : 서버는 응답을 만든다음, 이를 브라우저로 내려 보냅니다. 브라우저 : 브라우저느는 전달받은 HTML을 사용자가 볼수 있도록 화면에 출력합니다. HTTP 프로토콜 , 넌 누구냐! HTTP는 TCP/IP위에 들아갑니다. TCP는 한쪽 노드에서 다른 쪽 노드로 파일을 보내는 녀석입니다. 물론 여러개로 잘라서 보낼수도 있지요. IP는 한 호스트에 목적지 호수트까지 패킷을 옮기고 이동하기 위한 기반 프로토콜이라고 할수 있죠 HTTP는 이와 별개로 웹에서만 사용하는 프로토콜입니다. HTTP는 TCP/IP 기반으로 하여, TCP/IP를 이용해서 한지점에서 다른지점으로 요청과 응답을 전송합니다. HTTP의 구조는 요청/응답의 끊임없는 주고 받음 이라고 할수 있습니다. 클라이언트는 요청하고서버는 여기에 응답...

#020 두번째 이야기 . HeadFrist Servlet & JSP

미분류
좀더 자세한 Sevlet에 대해 알아보기 위해 HeadFirst 책을 고르기로 했다. 다들 이책을 추천해서 이책을 골라보았지만 초보자가 ㅗ기에는 조금 많이 어려운 내용이었습니다. 동작원리를 설명한것은 좋았지만 내용이 너무 과다하게 많을 뿐더라 너무 자세하게 나와있다는 것이 단점중에 단점이라고 할수 있겠다. 처음 SCWCD를 따기위해 이 책을 골랐지만 이책은 너무 어려워서 포기를 하다가 이번에 다시 보기로한../ 1년이라는 시간동안 먼지가 쌓여 있는 책을 다시 보기로 했다. 목차는 1. 서블릿과 JSP는 어디에 쓰는 물건인고?: 서문 학습 목표 웹 서버와 클라이언트는 무엇을 하나요, 어떻게 대화하죠? 2분짜리 HTML 가이드 HTTP 프로토콜. 넌 누구냐! HTTP GET, POST 요청 및 HTTP 응답을 해부해보자. URL로 웹 페이지가 어디 있는지 어떻게 알지? 웹 서버, 정적인 웹 페이지 그리고 CGI 서블릿의 신비를 벗겨보자: 작성, 배포, 실행 JSP는 'HTML에 자바를 넣을 순 없을까'라는 고민에서 탄생했다네요. 2. 웹 애플리케이션 아키텍처: 개요 학습 목표 컨테이너의 정체는 무엇이며 개발자에게 어떤 의미이죠? 코드는 어떤 모습일까?(무엇이 서블릿을 서블릿답게 만드는가) 서블릿에 이름을 붙인 뒤 DD에서 URL과 매핑하기 스토리: 밥은 지금 결혼정보 사이트를 만들고자 합니다(MVC 도입) MVC 디자인 패턴은 이런 문제를 해결합니다. 실제 배포 서술자(DD) J2EE에는 무엇이 들어 있나 3. 초 간단 미니 MVC 튜토리얼: 실...

#018 웹 어플리케이션 이벤트 처리

미분류
01. ServletContextListener를 이요한 이벤트 러치 웹 컨테이너는 우베 어플리케이션이 시작되거나 종료되는 시점에 특정 클래스의 메서드를 실행할수 있는 기능을 제공하고 있다. 이 기능을 사용하면 웹 어플리케이션을 실행하는데 필요한 초기화 작업이나 웹 어플리케이션이 종료된 후 사용된 자원을 반환하는등의 작업을 수행할수 있다. 웹 어플리케이션이 시작되고 종료될때 특정한 기능을 실행하려면 다음과 같이 코드를 작성하면 된다. javax.servlet.ServletContextListener 인터페이스를 구현한 클래스를 작성한다. web.xml 팡리에 1번에서 작성한 클래스를 등록한다. ServletContextListener 인터페이스를 구현한 클래스가 웹 어플리케이션이 시작되거나 종료될때 실행하도록 하려면  web.xml 파일에 <listener> 태그와 <listener-class> 태그를 사용해서 오나전한 클래스 이름을 명시해 주면 된다. <listener> <listener-class> kame.jdbc.loader.DBCPInitListener</listener-class> </listener>...

#019 MVC 패턴 구현

미분류
01. 모델 2구조와 MVC 패턴 JSP 기반 웹 어플리케이션의 구조에는 크게 모델1구조와 모델2구조가 있다. JSP 에서 모든 로직과 출력을 처리하느냐 아니면 JSP에서 출력만 처리하느냐에 따라서 모델 1구조와 모델2구조로 구분된다. 1.1 모델1구조 모델1구조는 JSP를 이용한 단순한 모델이다. 지금까지 살펴본 거의 대부분의 JSP 페이지가 모델1구조를 사용하고 있다. 보통 처음 JSP를 배울때 사용하는 구조가 모델1구조인데 웹브라우저의 요청이 곧바로 JSP에 전달된다. 웹 브라우저의 요청을 받은 JSP는 자바빈이나 서비스 클래스를 사용해서 웹 브라우저가 요청한 작업을 처리하고 그 결과를 클리이언트에 출력해 준다. JSP 페이지에서 웹 브라우저가 요청한 것들을 처리한다는것은 JSP 페이지에 비즈니스로직을 처리하기 위한 코드와 웹 브라우저에 결과를 보여줄출력 관련 코드가 섞인다는 것을 의미한다. 원하는 작업을 수행하고 그 결과를 출력하는 경우가 많은데 이것이 모델 1구조의 전형적인 예이다. 1.2 모델2구조 모델 2구조는 모델1구조와 달리 웹 브라우저의 요청을 하나의 서블릿이 받게 된다. 서블릿은 웹 브라우저의 요청을 알맞게 처리한후 그 결과를 보여줄 JSP 페이지로 포워딩한다. 포워딩을 통해서 요청 흐름을 받은 JSP 페이지는 결과화면을 클라이언트에 전송한다. 즉 서블릿이 비즈니스 로직 부분을 처리하게 되는 것이다. 모델2구조의 특징은 웹 브라우저의 모든 요청이 단일 진입점, 즉 하나의 서블릿에서 처리된다는 점이다. 하나의 서블릿이 우베 브라우저의 모든 요청을 받기 때문에 서블릿은 웹 ...