반응형

  HttpSessionListener를 이용해 웹 페이지 로그인 시 접속자수와 모든 접속자 ID를 표시해 주는 기능을 구현하겠습니다.

 

Login2.html

  첫번째 서블릿인 LoginTest 클래스 파일에는 setAttribute()를 이용해 loginUser를 세션에 바인딩하면 LoginImpl 클래스 에 구현된 이벤트 핸들러를 이용해 접속자수를 1 증가시킵니다. 그리고 user_list에 접속자 ID를 저장한 다음ServletContext 객체에 바인딩합니다.

LoginTest

 

LogoutTest 서블릿에서는 로그아웃 링크를 클릭하면 접속자 수를 1 감소시키고 user_list에 로그아웃한 접속자 ID를 삭제한 후 다시 user_list를 ServletContext 객체에 바인딩하도록 설정합니다.

LogoutTest

  LoginImpl 클래스는 HttpSessionListener를 구현해 세션 생성과 소멸 시 이벤트를 처리하는 핸들러입니다.

  중요한 것은 LoginImpl에서 구현한 HttpSessionBindingListener와는 다르게 HttpSessionListener는 반드시 리스너를 구현한 이벤트 핸들러를 애너테이션을 이용해서 등록해야 된다는 것입니다.

  리스너를 등록한 이벤트 핸들러를 이용해서 세션을 생성할 때는 SessionCreated()메서드로 이벤트를 처리하고, 세션을 삭제할 때는 sessionDestroyed() 메서드로 이벤트를 처리합니다.

LoginImpl

 

반응형

'2020 > JSP SERVLET' 카테고리의 다른 글

JSP 변환 과정  (0) 2019.12.11
JSP의 등장  (0) 2019.12.10
HttpSessionBindingListener 로그인 접속자 수 표시  (0) 2019.12.10
Servlet Listener API  (0) 2019.12.09
Filter API 사용자 정의 필터 만들기  (0) 2019.12.09
블로그 이미지

꽃꽂이하는개발자

,
반응형

HttpSessionBindingListener를 이용해 현재 웹 페이지에 로그인한 접속자수를 알아보는 기능을 구현하겠습니다.

login2.html

LoginTest 클래스를 다음과 같이 작성합니다. LoginImpl loginUser=new LoginImpl(user_id,user_pw)를 실행하여 전송된 ID와 비밀번호를 저장합니다. 또 session.setAttribute("loginUser", loginUser) 세션에 바인딩 시 미리 HttpSessionBinding Listener를 구현한 LoginImpl의 valueBound() 메서드를 호출합니다.

LoginTest

 

 

  LoginImpl 클래스에는 HttpSessionBindingListener를 구현하여 세션에 바인딩 이벤트를 처리하는 이벤트 핸들러를 구현하겠습니다. 세션에 바인딩 시 valueBound()가 호출되어 static 변수인 total_user의 값을 1 증가시킵니다.

LoginImpl

 

서로 다른 종류의 브라우저에서 접속하여 실행 결과를 확인해 보겠습니다. 

첫번째 이미지는 크롬 두번째 이미지는 익스플로러 입니다.

 

github : https://github.com/soulwine-it/Servlet-Scope-URLpattern-Filter-Listener

반응형

'2020 > JSP SERVLET' 카테고리의 다른 글

JSP의 등장  (0) 2019.12.10
HttpSessionListener 로그인 접속자수 표시  (0) 2019.12.10
Servlet Listener API  (0) 2019.12.09
Filter API 사용자 정의 필터 만들기  (0) 2019.12.09
Filter API  (0) 2019.12.09
블로그 이미지

꽃꽂이하는개발자

,
반응형

  자바 GUI에서는 마우스 클릭과 같은 이벤트 발생 시 여러가지 이벤트 핸들러를 이용해 화면의 기능을 구현합니다.

  이처럼 서블릿에서도 서블릿에서 발생하는 이벤트에 대해 적절한 처리를 해주는 여러가지 리스너를 제공합니다.

서블릿 관련 Listener 추상 메서드 기능
ServletContextAttributeListener

attributeAdded()

attributeRemoved()

attributeReplaced()

Context 객체에 속성 추가/제거/수정 이벤트 발생시 처리
HttpSessionListener

sessionCreated()

sessionDestroyed()

세션 객체의 생성/소멸 이벤트 발생 시 처리
ServletRequestListener

requestInitialized()

requestDestroyed()

클라이언트의 요청 이벤트 발생 시 처리
ServletRequestAttributeListener

attributedAdded()

attributedRemoved()

attributeReplaced()

요청 객체에 소성 추가/제거/수정 이벤트 발생 시 처리합니다.
HttpSessionBindingListener

valueBound()

valueUnbound()

세션에 바인딩/언바인딩된 객체를 알려주는 이벤트 발생 시 처리합니다.
HttpSessionAttributeListener

attributedAdded()

attributedRemoved()

attributeReplaced()

세션이 속성 추가/제거/수정 이벤트 발생 시 처리
ServletContextListener

contextInitialized()

contextDestroyed()

컨텍스트 객체의 생성/소멸 이벤트 발생시 처리
HttpSessionActivationListener

sessionDidActivate()

sessionWillPassivate()

세션의 활성화/비활성화 이벤트 발생시 처리합니다.

다음 글에서 Listener을 이용해 코딩을 해보도록 하겠습니다.

반응형
블로그 이미지

꽃꽂이하는개발자

,
반응형

  사용자 정의 필터는 Filter 인터페이스를 구현해야 합니다. 그리고 init(), doFilter(), destroy()의 추상 메서드를 구현해 주어야 합니다.

  사용자 정의 필터를 생성하면 필터를 각각의 요청에 맞게 적용하기 위해 필터 매핑을 해야 하는데, 필터를 매핑하는 방법은 2가지 입니다.

- 애너테이션을 이용하는 방법

- web.xml에 설정하는 방법

일반적으로 애너테이션을 이용하는 방법이 편리하므로 많이 사용합니다.

 

  Filter를 이용한 한글 인코딩을 해보겠습니다. (WebContent/login.html)

login.html

 

아래의 서블릿에서는 setCharacterEncoding() 메서드를 주석 처리하여 한글 처리를 하지 않도록 합니다.

 

로그인을 하니 한글이 깨져서 표시됩니다.

 

  이번에는 필터를 이용해 한글 인코딩 기능을 구현하겠습니다.

  사용자 정의 필터 클래스는 반드시 Filter 인터페이스를 구현해야 합니다. 브라우저 요청 시 doFilter() 메서드의 매개변수로 request와 response가 전달되며, doFilter() 메서드는 FilterChain 타입인 chain을 세번째 매개변수로 가집니다. 전달된 request를 이용해 한글 인코딩 작업을 합니다. chain.doFilter() 메서드를 기준으로 위쪽에 위치한 코드는 요청 필터 기능을 수행합니다.

 

 

톰캣을 재실행하고 로그인창에서 한글을 입력합니다.

요청 필터 기능을 수행할 때마다 doFilter()가 수행되므로 이클립스 콘솔에도 다음과 같은 메시지가 출력 됩니다.

 

깃허브 주소 : https://github.com/soulwine-it/Servlet-Scope-URLpattern-Filter-Listener

반응형

'2020 > JSP SERVLET' 카테고리의 다른 글

HttpSessionBindingListener 로그인 접속자 수 표시  (0) 2019.12.10
Servlet Listener API  (0) 2019.12.09
Filter API  (0) 2019.12.09
서블릿 URL pattern  (0) 2019.12.09
서블릭 속성과 스코프(Scope)  (0) 2019.12.09
블로그 이미지

꽃꽂이하는개발자

,

Filter API

2020/JSP SERVLET 2019. 12. 9. 20:31
반응형

필터란?

  브라우저에서 서블릿에 요청하거나 응답할 때 미리 요청이나 응답과 관련해 여러가지 작업을 처리하는 기능입니다.

  프로그래밍을 하다가 한글 인코딩처럼 각 서블릿에 반복적으로 처리해야 하는 작업이 있을 수 있는데, 이런 경우 서블릿의 공통 작업을 미리 필터에서 처리하면 반복해서 작업할 필요가 없겠죠.

 

필터 기능 수행 과정

 

 

  위의 코드는 지금까지 우리가 해왔던 코드의 일부분입니다.

  이처럼 웹 페이지에서 입력한 한글을 서블릿에 전달 하려면 setCharacterEncoding() 메서드를 이용해 한글 인코딩 설정을 서블릿마다 상단에 추가해야 했습니다. 하지만 모든 서블릿에서 공통으로 처리하는 작업을 먼저 필터에서 처리해 주면 편리하겠죠.

 

필터는 용도에 따라 크에 요청 필터와 응답필터로 나뉘며 다음과 같은 API가 있습니다.

요청필터

  • 사용자 인증 및 권한 검사
  • 요청 시 요청 관련 로그 작업
  • 인코딩 기능

응답필터

  • 응답 결과에 대한 암호화 작업
  • 서비스 시간 측정

 

필터관련 API

  • javax.servlet.Filter
  • javax.servlet.FilterChain
  • javax.servlet.FilterConfig

Filter 인터페이스에 선언된 메서드

메서드 기능
destroy() 필터 소멸 시 컨테이너에 의해 호출되어 종료 작업을 수행
doFilter() 요청/응답 시 컨테이너에 의해 호출되어 기능 수행
init() 필터 생성 시 컨테이너에 의해 호출되어 초기화 작업

FilterConfig의 메서드

 

메서드 기능
getFilterName()  필터 이름을 반환합니다.
getInitParameter(String name)  매개변수 name에 대한 값을 반환합니다. 
getServletContext()  서블릿 컨텍스트 객체를 반환합니다.

 

다음 글에서 사용자 정의필터를 만들어 보고 직접 코딩하여 보겠습니다.

반응형

'2020 > JSP SERVLET' 카테고리의 다른 글

Servlet Listener API  (0) 2019.12.09
Filter API 사용자 정의 필터 만들기  (0) 2019.12.09
서블릿 URL pattern  (0) 2019.12.09
서블릭 속성과 스코프(Scope)  (0) 2019.12.09
세션 로그인 session login  (0) 2019.12.09
블로그 이미지

꽃꽂이하는개발자

,
반응형

URL 패턴이란?

  실제 서블릿 매핑 이름을 말합니다. 즉 서블릿 매핑 사용되는 가상의 이름으로, 클라이언트가 브라우저에서 요청할 때 사용되며 반드시 /(슬래시)로 시작해야 합니다.

  서블릿 매핑 이름으로 사용되는 URL 패턴의 종류는 정확히 이름까지 일치하는지, 디렉터리까지만 일치하는지, 확장자만 일치하는지에 따라 세가지로 나누어집니다.

 

서블릿에 여러 가지 URL 패턴을 적용해보겠습니다.

첫 번째 서블릿은 /first/test로 요청할 때 실행됩니다. 브라우저의 요청 URL에 대해 서블릿의 여러가지 메서드를 이용하여 요청 관련 정보를 가져옵니다.

  이 서블릿은 /first/test로 요청할때 실행 됩니다. 브라우저의 요청URL에 대해 서블릿의 여러 가지 메서드를 이용하여 요청관련 정보를 가져옵니다.

두번째 서블릿은 /first/ 디렉터리 이름으로 시작되는 요청에 대해 실행됩니다.

세번째 서블릿은 매핑 이름에 상관없이 확장자가 .do면 실행됩니다.

각각의 매핑 이름으로 요청해 보겠습니다.

디렉터리 이름만 일치하는 경우에는 각각 다음과 같이 출력됩니다.

다음은 확장자가 일치했을 경우의 출력 결과로, 각각 /base.do와 /second/base.do로 요청했을 때 출력 결과 입니다.

/first/base.do로 요청하면 확장자명이 .do로 끝나지만 앞의 디렉터리 이름이 우선하므로 TestServlet2가 실행됩니다.

반면에 /second/base.do로 요청하면 /second 디렉터리는 존재하지 않으므로 확장자명 .do를 우선하여 TestServlet3이 실행됩니다.

 

github 주소 : https://github.com/soulwine-it/Servlet-Scope-URLpattern-Filter-Listener

반응형

'2020 > JSP SERVLET' 카테고리의 다른 글

Filter API 사용자 정의 필터 만들기  (0) 2019.12.09
Filter API  (0) 2019.12.09
서블릭 속성과 스코프(Scope)  (0) 2019.12.09
세션 로그인 session login  (0) 2019.12.09
세션을 이용한 로그인 정보 바인딩  (0) 2019.12.06
블로그 이미지

꽃꽂이하는개발자

,
반응형

서블릿의 스코프(scope)는 서블릿 API에 바인딩된 속성에 대한 접근 범위를 의미합니다.

ServletContext에 바인딩된 속성은 애플리케이션 전체에서 접근할 수 있으므로 애플리케이션 스코프를 갖습니다.

HttpServlet에 바인딩된 속성은 그 HttpSession에 해당하는 브라우저에만 접근할 수 있으므로 세션 스코프를 갖습니다. HttpServletRequest는 해당 요청/응답에 대해서만 접근하므로 리퀘스트 스코프를 갖습니다.

 

스코프의 기능

  • 로그인 상태 유지
  • 장바구니 기능
  • MVC의 Model과 VIew의 데이터 전달기능

 

스코프의 종류 해당 서블릿 API 속성의 스코프
애플리케이션 스코프 ServletContext 속성은 애플리케이션 전체에 대해 접근
세션 스코프 HttpSession 속성은 브라우저에서만 접근
리퀘스트 스코프 HttpServletRequest

속성은 해당 요청/응답 사이클에서만

접근

 

이제 코드로 작성해 보겠습니다

SetAttribute 클래스에 ServletContext, HttpSession, HttpServletRequest 객체의 setAttribute() 메서드를 이용해 속성을 바인딩 합니다.

두번째 서블릿인 GetAttribute 클래스를 다음과 같이 작성합니다. 각 서블릿 API들의 getAttribute() 메서드를 이용해 속성 이름으로 바인딩한 값을 가져와 브라우저로 출력하겠습니다.

브라우저에서 /set으로 요청해 속성을 바인딩하겠습니다.

Context와 Session 객체에 바인딩된 속성은 같은 브라우저에서 접근할 수 있으므로 값을 출력합니다. 그러나 기존에 바인딩된 request 객체는 /get으로 요청하여 생성된 request객체와 다르므로 null이 출력됩니다.

 

인터넷 익스플로러에서 /get을 요청한다면??

  익스플로러에서 요청했기 때문에 이번에는 크롬 세션 객체에는 접근할 수 없어 null을 출력합니다. 반면에 Context객체에 바인딩된 데이터는 모든 브라우저에 같은 결과를 출력하게 됩니다.

반응형

'2020 > JSP SERVLET' 카테고리의 다른 글

Filter API  (0) 2019.12.09
서블릿 URL pattern  (0) 2019.12.09
세션 로그인 session login  (0) 2019.12.09
세션을 이용한 로그인 정보 바인딩  (0) 2019.12.06
세션 유효 시간 재설정, 세션 삭제  (0) 2019.12.05
블로그 이미지

꽃꽂이하는개발자

,
반응형

login3.html

로그인 창의 요청을 처리하는 LoginServlet입니다.

로그인 창에서 전송된 id와 비밀번호를 가져와 MemberVO객체를 생성한 후 속성에 ID와 비밀번호를 설정합ㄴ디ㅏ. 그런 다음 MemberVO객체를 생성한 후 속성에 ID와 비밀번호를 설정합니다. 그런 다음 MemberDAO의 isExisted() 메서드를 호출하면서 memberVO를 인자로 전달합니다. 조회된 결과가 true이면 isLogOn 속성을 true로 세션에 설정하고, ID와 비밀번호도 세션에 저장합니다.

MemberDao 클래스를 다음과 같이 작성합니다. 오라클에서 제공하는 decode() 함수를 이용해 SQL문으로 회원 정보를 조회합니다. 정보가 존재하면 true를, 존재하지 않으면 false를 반환합니다.

ShowMember 클래스를 작성하겠습니다.

두번째 서블릿은 사용자가 로그인할때 회원 정보를 표시해 줍니다. 먼저 로그인 상태를 확인하기 위해 getSession(false)메서드를 호출하여 세션을 얻은 다음 getAttribute() 메서드에 isLogOn을 인자로 전달해 로그인 상태를 가져옵니다. isLogOn의 값이 true이면 회원 정보를 세션에서 가져와 출력합니다. 만약 세션이 존재하지 않거나 isLogOn이 false면 다시 고그인 창으로 이동합니다.

memberVO화면입니다.

반응형
블로그 이미지

꽃꽂이하는개발자

,