System.out.println("Hello, World");

-HttpSession을 이용한 Session관리

-클라이언트의 상태값을 서버측에 저장하여 Session관리

-javax.servlet.httpSession 객체를 이용하여 관리한다.

-클라이언트의 상태값은 Attribute로 관리됨


-장점

-관리할 수 있는 상태값(클라이언트 데이터)의 종류나 크키나 개수의 제한이 없다.

-서버에 저장되므로 cookie에 비해 보안상 유리

-단점

-서버에 부담을 준다


-HttpSession 객체 생성

-HttpServletRequest객체.getSessioin()

-기존 Session이 있으면 기존 Sessioin객체를, 없으면 새로 생성하여 리턴


-HttpServletRequest객체.getSession(false)

-기존 Session이 있으면 기존 Sessioin객체를, 없으면 null을 return

- JSP와 Servlet을 같이 쓰면 이걸 쓸 경우는 거의 없다.


-HttpSession 객체의 주요 메소드

-setAttribute(String name, Object Value);

-getAttribute(String name) : Object value

-removeAttribute(String name)

-getAttributeNames() : Enumeration

-invalidate() : session 객체를 소멸시킨다 -로그아웃할때 이용한다.

-setmaxInactiveInterval(int 초) : 클라이언트가 마지막 요청을 한 뒤 인수로 받은 시간만큼 지나도 요청이 안들어 오면 session을 소멸시킨다. (자동로그아웃)

-getId() : String - jsessionID값 리턴



<HttpSession 예제 만들기>

개요

- Write_form.html을 이용하여 텍스트박스를 만든뒤 아무 String값을 넣었을떄 저장한다.

- 저장한 String 값을 ShowServlet을 이용하여 출력해준다.

- 저장된 String 값을 RemoveServlet을 이용하여 제거한다.


package : servlet.session

name :     WriteServlet - /session_write

               ShowServlet - /session_show

               RemoveServlet - /session_remove


- html

WebContent

폴더  : session

이름 : write_form.html


[WriteServlet.java]


[ ShowServlet]


[RemoveServlet]


[write_form.html]


결과 화면

1. Write_form.html을 실행하여 아무 단어나 쳐본다.


2. 현재까지 입력된 값과 jSessionID가 출력되면 성공한것이다. 


3. RemoveServlet을 실행하였을 경우 모든 List가 사라지기 때문에 <입력한 글 보기>를 선택해봤자 아까 list가 null값이면 write_form.html로 리다이렉트 설정을 해줬기 때문에 write_form.html로 이동하게 된다.


Posted by 김마농

 요청 디스패치(Request Dispatch)방식

-Request(요청)이 살아있는 상태에서 수행을 이동시킨다.

-Request Scope를 이용해 데이터(attribute)를 공유 할 수 있다.

-javax.servlet.RequestDispatcher 객체를 이용해 처리

- 요청 디스패치가 더 많이 쓰이는 방식이다.


-구문

RequestDispatcher drp = request.getRequestDispatcher("url");

- 웹브라우저를 기준으로 해야 하기 때문에 절대경로를 쓰지 않는다.

rdp.forward(request,response);


<요청 디스패치 예제>

개요

 - 체크박스를 선택하면 정상적으로 화면이 출력된다.

 - 만약 체크박스를 선택하지 않았다면 error.jsp로 이동하여 에러화면이 출력된다.


servlet

package : servlet.dispatch

name : ErrorPronServlet

url : /error_pron_dispatch


html

folder : dispatch

이름 :req.html

  error.jsp


[ErrorPronServlet.java]


[req.html]


[error.jsp]


결과 화면

1. 체크를 선택했을 경우



2. 체크를 선택하지 않았을 경우



위 화면과 같이 출력되면 성공이다.



Posted by 김마농

1. 이클립스를 킨 다음 Data Source Explorer 항목 밑에 있는 Database Connections를 오른쪽 마우스를 눌러서 New를 선택한다.

2. 이클립스를 오라클이랑 연동해야 하니 당연히 오라클은 선택한다.


3. 네모상자로 표시된 New Driver 버튼을 선택한다.



4. 현재 설치된 오라클 버전이 10이기 때문에 10을 선택한다. 만일 설치된 오라클이 다른 버전일 경우 버전에 따라 선택하면 된다.


5. JAR List 탭을 선택한뒤 Add JAR/ZIP 버튼을 선택한다.


6. 오라클 설치된 위치에 따라 다른데 C드라이브에 설치되어 있다면 

C:\oraclexe\app\oracle\product\10.2.0\server\jdbc\lib\ojdbc14.jar를 선택한후 OK를 누른다.


7. 다음과 같이 설정을 입력해준다. User name과 Password는 오라클마다 다른데 예전에 만들어둔 scott/tiger를 넣어주었다.


8. 그다음 밑에 있는 Test Connection을 선택하여 Ping이 정상인지 확인한다. 


9. 쿼리를 작성하기 위해 밑쪾에 있는 scrapbook을 선택한다.


10. 그럼 밑과 같은 화면이 나오는데 여기서 원하는 쿼리문을 작성하고 실행시키면


11. 다음과 같이 성공유/무와 결과가 출력된다.



12. 만약 오라클과 연결을 끊고 싶으면 Data Source에서 New Oracle을 선택하고 오른쪾 마우스를 누른뒤 Disconnect를 선택하면 끊어진다.


13. DIsconnected로 나오면 오라클과 연결이 끊어진것이다.


14. 다시 연결하고 싶으면 New Oracle에서 오른쪽 마우스를 누른뒤 Connect를 누르면 된다.



Posted by 김마농

ServletContext를 이용한 회원검색 서비스



위와 같은 사진처럼 ID, 이름, 나이, 성별을 입력하고 전송을 누르면 회원정보들이 출력되는 서비스를 만들 것이다.


<html>

request_member_form.html


<Listener>

SaveRequestMemberListener.java


ShowAllReqMemberServlet.java


SaveReqMemberServlet.java


<MemberDTO>

MemberDTO.java



Posted by 김마농

Session 관리

-Http프로토콜은 stateless한 특징을 가진다.

-stateless -상태유지를 못한다 -> 클라이언트의 데이터를 유지하지 못함


-Session

○하나의 클라이언트가 프로그램을 시작해서 종료할때까지

○하나의 세션동안 여려번의 요청과 응답이 반복 될 수 있다.

○하나의 세션동안 클라이언트의 데이터는 유지되어야 한다.


-Session 관리 개념

○HTTP 프로토콜의 특징은 클라이언트의 상태를 유지 못하므로 CGI에서 지원

○방식

-Cookie를 이용

-Session을 이용

-URLRewriting을 이용


-Cookie를 이용한 Session관리

○쿠키

- 서버가 브라우저(client)로 전송하는 text 데이터

- 쿠키는 클라이언트의 정보를 유지하기 위한 데이터로 Web Browser에 저장된다.

->클라이언트 단에 저장

- key-value 형태로 관리된다.

- 저장 데이터의 종류는 문자열만 가능

-Web Browser는 쿠키를 사이트 별로 관리한다.

-웹브라우저가 종료되면 쿠키는 죽어버린다.


○장점

-서버에 부하를 줄일 수 있다.


○단점

-관리 할 수 있는 데이터의 종류, 크기에 제약이 있다.

-보안상 문제가 있다.


○구문

-쿠키 생성

-javax.servlet.http.Cookie 사용 - 하나의 쿠키 값을 가지는 객체

-HttpServletResponse.addCookie(Cookie c) : 쿠키를 client로 전송

ex)Cookie c = new Cookie("name","value");

response.addCookie(c);


-쿠키값 조회

-HttpServletRequest.getCookies() : Cookie[]

ex)Cookie[] c = request.getCookies();


- Cookie 클래스 주요 메소드

-getName() : String  - name 값 조회

-getValue() : String  -value 값 조회

-setMaxAge(int 초(sec)) - 쿠키가 웹 브라우저에 저장될 시간 설정

- 초: 양수 = 지정될 시간

: 음수 = web browser가 살아있는 동안까지만

: 0초 = 삭제

- 한글 encode처리




<Cookie 예제>

개요

- SetCookie로 현재 시간을 알아내서 cookie에 저장한다. 

- GetCookie로 SetCookie에서 넘겨준 값을 출력한다.

Servlet

folder : servlet.cookie

GetCookieServlet.java

SetCookieServlet1.java

url : /getServlet

/setServlet


HTML

folder : cookie

cookie.html


[GetCookieServlet.java]


[SetCookieServlet1.java]


[cookie.html]


결과화면

1. SetCookie를 실행한다.


2. GetCookie요청을 누르면 getCookie가 실행되어 set에서 넘겨준 값을 출력한다.


SetCookieServlet을 통해 쿠키 정보를 전송하고 GetCookieServlet을 조회하면 전송된 쿠키가 출력된다. 하지만 GetCookieServlet을 통해 서버를 재 시작하면 request.getCookie()를 통해 조회한 값이 없어진다. 즉, 웹브라우저가 살아 있는 동안만 쿠키 정보를 조회할 수 있다.


Posted by 김마농

○ Multi-thread상황에서 Data 동기화(Synchronized)

- 데이터를 공유하는 상황에서 한 클라이언트가 데이터 사용중인 다른 클라이언트가 이 데이터를 수정했을때 데이터의 무결성이 깨져 버린다.


○ Multi thread 상황에서 Data동기화 문제의 소지(synchronized)

- Local 변수 (X)

- Instance 변수 (O) : 동시에 변경을 시도 할때

- Static 변수 (O)

- Attribute

◎ request scope (X)

◎ session scope 이론적으로는 가능(O), 실제로는 불가능(X)

◎ application scope (O)


○ Data 동기화 처리 개념

- 사용중인 데이터에 Lock을 건다.


구문

synchronized(this){


데이터 사용


} //데이터 사용 끝(Lock 해제)


◆ synchronized 사용전

- 동시에 두 클라이언트가 접속을 시도하면 5초후 둘다 같은 숫자를 부여 받는다.


◆ synchronized 사용후

- 동시에 두 클라이언트가 접속을 시도하면 조금이라도 먼저 시도한 클라이언트가 5초 후 앞 번호를 가져간다. (다른 숫자 부여)

  그리고 2번쨰 클라이언트는 총 10초의 sleep time을 갖는다.(앞 클라이언트의 작업이 끝날 동안 Lock이 걸리기 때문)

Posted by 김마농

리다이렉트(Redirect)방식

- 응답시 클라이언트에게 요청할 url을 알려주어 다시 요청하도록 하는 방식

- 요청과 응답이 한번 더 일어난다.

- Request Scope를 이용한 데이터(Attribute) 공유를 할 수 없다.

-HttpServletResponse 객체를 이용하여 처리




-구문

response.sendRedirect("url");

- 웹브라우저를 기준으로 해야 하기 때문에 절대경로를 쓰지 않는다.

 

<요청 리다이렉트 예제>

개요

 - 체크박스를 선택하면 정상적으로 화면이 출력된다.

 - 만약 체크박스를 선택하지 않았다면 error.jsp로 이동하여 에러화면이 출력된다.


Servlet

package : servlet.redirect

name : ErrorPronServlet

url :/error_pron


html

folder : /redirect/req.html

                 error.jsp


[ErrorPronServlet.java]


[req.html]


[error.jsp]


결과 화면

1. 체크를 선택했을 경우




2. 체크를 선택하지 않았을 경우



위 화면과 같이 출력되면 성공이다.


Posted by 김마농

Attribute(속성)

-Attribute(속성)이란?

Web Application 구성 컴포넌트들(Servlet,m JSP, Listener)이 공유하는 객체



-scope(적용영역)

- Attribute들을 공유하기 위한 공유 장소의 영역(저장장소)

- 공유 범위에 따라 3가지 영역이 있다.


1. requset scope : HttpServletRequest 이용

-요청 ~ 응답까지 공유


2. session scope : HttpSession 이용

-한명의 클라이언트(웹브라우저)가 로그인 ~ 로그아웃

3. application scope : ServletContext 이용

-Application 시작 ~ 종료시까지 공유


- 관련 메소드

Attribute는 key-value쌍으로 관리된다.

*setAttribute(String key, Object value) : 공유영역에 Attribute 저장 [Binding]


*getAttribute(String key) : Object value : 저장된 Attribute 조회 [lookup]


*removeAttribute(String key) : 저장된 Attribute 삭제


*getAttributeNames() : Enumeration : Attribute들에 연결된 name들 조회



<예제>

[SetAttributeServlet.java]


[GettAttributeServlet.java]


결과




Posted by 김마농

Event 모델

- Event : 컴포넌트에 가해진 동작, 변화

- Event Listenter

1. 컴포넌트에서 Event가 발생하는 것을 감시하는 Container.

2. 발생한 Event를 처리하는 동작을 가진 객체(Listener class)

- Event Handler : 발생한 Event를 처리하는 동작(메소드)

- Event Source : Event가 발생한 컴포넌트 

ex)버튼을 클릭하면 안녕이라고 출력한다.


Event Source : 버튼

Event : 클릭

Event Handler : 안녕을 출력하는 동작


ServletContextEvent

시작하고 종료될때 2번 생성된다.


<예제>

1. Listener를 다음과 같이 추가한다.


2. 패키지와 클래스 이름은 다음과 같이 작성해준다. 그리고 Next를 선택한다.


3. LiftCycle 체크박스를 체크를 해주고 Finish를 선택하여 완료한다. 


4. Listener코드는 다음과 같이 작성한다. 우리는 이 코드로 Listener가 언제언제 작동하는지 확인할 것이다.



5. 그리고 서버를 올리게 되면 contextInitialized가 작동하여 다음과 같이 출력된다.


6. 서버를 stop하면 contextDestroy가 작동하여 다음과 같이 출력한다.


Posted by 김마농

초기 파라미터

 - 서버단 컴포넌트(Servlet, JSP, Listener등)이 사용하는 문자열중 나중에 변경 될 수 있는 문자열을 web.xml에 등록해 놓고 컴포넌트에서는 호출하여 사용

 - 나중에 변경시 설정에서만 바꾸면 컴포넌트의 수정없이 변경 가능

 - 초기 파라미터 2가지

* 특정 서블릿 JSP만 사용할 수 있는 초기 파라미터

 - ServletConfig 사용

* Application내 모든 Servlet이 사용할 수 있는 초기 파라미터 - ServletContext 이용


 * javax.servlet.ServletConfig

 - Servlet 객체가 일하는데 필요한 정보를 가지고 있는 객체

 - WebContainer가 생성하여 Servlet()의 init() 호출시 중집

 - Servlet 객체당 하나씩 생성


*ServletConfig를 이용한 초기 파라미터 처리

1. Web.xml에 초기 파라미터 설정

<servlet>

<servlet-name>서블릿 객체 이름</servlet-name>

<servlet-class>서블릿 클래스 이름</servlet-class>

<init-param>

<param-name>초기파라미터 이름</param-name>

<param-value>초기 파라미터 값</param-value>

</init-param>

</servlet>

-초기 파라미터가 여러개인 경우 <init-param>을 반복

ex)

2. 코드상에서 조회

ServletConfig 객체.getInitParameter(String paramName) : String paramValue

주석처리한것처럼 해도 되지만 2줄을 써서 할바에야 한줄로 간단히 하는게 더 빠르다.


ex)예제 만들기

1. greeting_form.html을 다음과 같이 만들어주고 서버를 올려서 결과처럼 나오는지 확인한다.


2. 그리고 web.xml에서 초기파라미터를 설정해줘야 하니 다음과 같이 작성한다.


3. web.xml도 설정해줬으니 여기서 파라미터를 받는 GreetingServlet를 설정한다.



4. greeting_form.html에서 이름 텍스트 박스에서 이름을 작성한후 영어 전송을 했을떄 다음과 같이 나오면 성공적으로 한 것이다.


5. 이번에는 web.xml에서 서블릿을 한개 더 만들어서 서블릿을 2개 이용해보겠다. web.xml에 다음과 같이 더 추가한다.


6. 이제 greeting_form.html에서 밑에 있는 한글전송을 눌러봐서 다음과 같이 나오나 확인한다. 




*javax.servlet.ServletContext

-web Application이 자체 또는 일하는데 필요한 정보를 가지고 있는 객체

-web Component는 Web Application과 관련된 정보를 조회하거나 업무를 처리할 때 ServletContext type객체를 이용

-web Applictaion이 시작할 때 Web container에 의해 생성된다.

-Servlet의 getServletContext()를 통해 조회

-ServletContext ctx - getServletContext();

-web Application 당 하나가 생성됨


*ServletContext를 이용한 초기 파라미터 처리

1. web.xml에 초기 파라미터 설정

<web-app>

<context-param>

<param-name>초기파라미터이름</param-name>

<param-value>초기파라미터 값</param-value>

</context-param>


2. 코드상에서 조회

ServletContext객체.getInitParameter(String paramName) : String paramValue


ex)만들어 보기

1. web.xml에 파라미터를 설정한다.



2. ContextParamServlet 작성


3. 서버를 재가동하여 http://127.0.0.1:8088/myweb/ContextParamServlet 이 제대로 나오는지 확인한다.


○ javax.servlet.ServletConfig vs javax.servlet.ServletContext

확인한다ServletConfig는 서블릿당 하나니며, ServletContext는 웹 어플리케이션 당 하나이다. 

웹 어플리케이션은 오직 하나의 ServletContext으로 전체 웹 어플리케이션에서 정보를 공유한다. 그러나 웹 어플리케이션 안에 있는 서블릿은 자신만의 ServletConfig를 가진다. 컨테이너는 웹 어플리케이션이 배포되는 시점에 ServletContext를 생성하며, 서블릿이나 JSP(서블릿의 일종)에서 이용 가능하도록 한다. 


 - 동일 웹 어플리케이션에서 컨테스트 초기화 파라미터 이름과 서블릿 초기화 파라미터 이름이 같아도 상관없는 이유는 ServletContext와 ServletConfig는 서로 다른 객체며, 

   동일한 이름을 사용하더라도, 서로 다른 이름공간을 사용하기에 충돌이 일어나지 않는다.


Posted by 김마농