//서블릿 속성과 Scope
/속성
-3개의 서블릿 API객체 중 하나에 설정해 놓은 객체, 바인딩한 객체
 (ServletContext, HttpSession, HttpServletRequest)
/사용
-setAttribute(String name, Object value)로 바인딩
-getAttribute(String name)

/속성은 scope를 갖는다
-Application Scope ServletContext     컨테이너와 동일한 scope
-Session Scope     HttpSession        브라우저와 동일한 scope
-Request Scope     HttpServletRequest 요청/응답 싸이클과 동일한 scope

/용도 : 로그인, 장바구니, Model View간 데이터 전달

/Thread-safe & Not Thread-safe
-Not Thread-safe : 공유부분 처리(동기화 이용 Sychronized)
인스턴스 변수 (service변수 밖)
클래스 변수 (static 변수)
Session 속성
Application 속성

-Thread-safe : 로컬변수, Request속성

예제1 ) Servlet속성과 scope
-TestAttributeSet Class
doGet{
  String ctxMesg = "Context변수";
  String sesMesg = "session변수";
  String reqMesg = "Request변수";
  ServletContext ctx = getServletContext();
  HttpSession session = request.getSession();
  ctx.setAttribute("context", ctxMesg);
  session.setAttribute("session", sesMesg);
  request.setAttribute("request", reqMesg); 
}

-TestAttributeGet Class
doGet{
  response.setContentType("text/html; charset=euc-kr");
  PrintWriter out = response.getWriter();
  ServletContext ctx = getServletContext();
  HttpSession sess = request.getSession();
  String ctxMesg = (String)ctx.getAttribute("context");
  String sesMesg = (String)sess.getAttribute("session");
  String reqMesg = (String)request.getAttribute("request");
  String mesg = ctxMesg + sesMesg + reqMesg;
  out.print(mesg);
}

실행 : 동일브라우저에서 http://localhost:8090/webapp/set       ->     /get
결과 : context session null

실행 : 다른브라우저에서 set / get
결과 : context null null


//Filter API
클라이언트 <--- 필터1 --- 필터2 --- 필터3 ---> Servlet

용도 :
-Request 필터
 보안관련 체크, 요청정보를 로그파일로 작성, 인코딩 작업
-Response 필터
 응답결과를 압축, 응답결과에 내용추가/수정, 총 서비스 시간 측정

방법 : javax.servlet.Filter,  javax.servlet.FilterChain,  javax.servlet.FilterConfig

-Filter 인터페이스이므로 구현
Filter() : destroy(), doFilter(), init()
FilterChain() : doFilter()
FilterConfig() :  getFilterName(), getServletContext(), getInitParameter()
     ↑serletConfig와 비슷 Filter마다 생성

-web.xml 에 Filter등록

예제2) Filter request실습
<web-app>
 <filter>
  <filter-name>bbb</filter-name>
  <filter-class>test.web.EncodeFilter</filter-class>
 </filter>
 <filter-mapping>
  <filter-name>bbb</filter-name>
  <url-pattern>/*</url-pattern>             //<--webapp context이용할때 모든요청은 EncodeFilter를 거침
 </filter-mapping>
</web-app>

public class EncodeFilter implements Filter{
 ServletContext context;
 public void init(FilterConfig fc){
   System.out.println("EUC-KR Encoding..");
   context = fc.getServletContext();
 }
 public void doFilter(ServletRequest request, ServletResponse response, FilterChain chain{ 
   request.setChracterencoding("EUC-KR");
   String path = ((HttpServletRequest)request).getContextPath();
   String pathinfo((HttpServletRequest)request).getRequestURI();
   String realPath = request.getRealPath(pathinfo);
   String mesg = path + pathinfo+ realPath;
   context.log(mesg);    <--로그파일 저장
   chain.doFilter(request, response);  <--다음 필터로 넘어감 (다음필터 없을시 서블릿으로)
 }
 public void destroy(){
   System.out.println("destroy");
 }
}

- 서블릿에서 request.setChracterEncoding("EUC-KR"); 주석처리  Filter에서 한글처리함

 

예제3) 응답 시간 구하기

 long begin = System.currentTimeMillis();
     요청필터
 chain.doFilter(request, response);
     응답필터
 long end = System.currentTimeMillis();
 StringBuffer logMessage = new StringBuffer();
 logMessage = (HttpServletRequest)request).getRequestURL();
 logMessage.append(" : ");
 logMessage.append(end-begin);
 logMessage.append("ms");
 context.log(logMessage.toString());

//URL-pattern
정의 : 서블릿 매핑시 사용하는 가상의 이름, 반드시 '/' 로 시작, 클라이언트가 브라우저에게 요청하는이름

타입 :
정확히 이름까지 일치(/hello/test), 디렉토리만 일치(/hello/*), 확장자 까지만 일치(*.do)

//리스너 : 자바 GUI의 Listener와 같은 역할

 인터페이스 메소드  용도 
  javax.servlet.
ServletContextAttributeListener
 attributeAdded(ServletContextAttributeEvent)
attribute(Removed(ServletContextAttributeEvent)
 웹 어플리케이션에 속성을 추가/제거/수정할때
 javax.servlet.http.
HttpSessionListener
 sessionCreated(HttpSessionEvent)
sessionDestroyed(HttpSessionEvent) 
 현재 활성화된 세션정보를 얻을떄 
 javax.servlet.http.
HttpSessionListener
 requestInitialized(ServletRequestEvent)
requestDestroyed(ServletRequestEvent) 
 클라이언트의 요청을 알고 싶을때(로그 작성등) 
  javax.servlet.
ServletRequestAttributeListener
 attributeAdded(ServletRequestattributeEvent) 
attributeRemoved(ServletRequestattributeEvent)
 Request속성의 추가/제거/수정 여부를 알고자 할때 
 javax.servlet.http.
HttpSessionBindingListener
 valueBound(HttpSessionBindingEvent)
valueUnBound(HttpSessionBindingEvent) 
 특정객체가 세션에 저장/제거 여부를 알고자 할때(접속자 수) 
jvax.servlet.http.
HttpSessionAttributeListener
attributeAdded(ServletBindingEvent)
attributeRemoved(ServletBindingEvent)
AttributeReplaced(ServletBindingEvent) 
일반객체가 세션에 저장/제거/수정 여부를 알고자 할때 
 javax.servlet.
ServletContextListener
contextInitialized(ServletContextEvent)
contextDestroyed(ServletContextEvent) 
컨텍스트의 생성/소멸 여부를 알고자 할때 
javax.servlet.http.
HttpSessionActivationListener
sessionDidActivate(HttpSessionEvent)
sessionWIIPassivate(HttpSessionEvent) 
바인딩 된 특정객체가 다른 JVM으로 이동여부를 알고자 할때 


HttpSessionBindingListener를 제외한 나머지 7개는 반드시 web.xml에 Listener를 등록해야함

예제 4) 특정 객체의 세션 사용 여부

public class LoginForm extends HttpServlet{
 public void doGet(HttpServletRequest request, HttpServletResponse response){
  response.setContentType("text/html; charset=euc-kr");
  PrintWriter out = response.getWriter();
  request.setChracterEncoding("EUC-KR");
  String id = request.getParameter("userID");
  String pw = request.getParameter("passwd");
  Login login = new Login(id, pw);
  HttpSession session = request.getSession();
  if(session.isNew()){
   session.setAttribute("login", login);
  }
  out.print("<html><body>");
  out.print(id + pw + " 총접속자수는 " + Login.total);
  out.print("</body></html>"); }
 }
}

public class Login implements HttpSessionBindingListener{
 String id, pw;
 static int total;
 생성자, 게터, 세터
 public void valueBound(HttpSessionBindingEvent event){
  total++;
 }
 public void valueUnbound(HttpSessionBindingEvent event){
  System.out.println("valueUnBound");
 } 
}

예제5) HttpSessionListener활용 - 현재 활성화된 세션정보를 얻을때
-LoginForm 에서 총접속자수는 SessionListener.activeSessions

public class SessionListener implements HttpSessionListener{
 static int activeSessions;
 public void sessionCreated(HttpSessionEvent event){
  sout("session Created");
  activeSessions++;
 }
 public void session Destoryed(HttpSessionEvent event){
  sout("session destroyed")
  activeSessions--;
 }
}


<web-app>
 <listener>
  <listener-class>test.web.SessionListener</listener-class>
 </listener>
    //등록
</web-app>

 

 

 
 

저작자 표시 비영리 동일 조건 변경 허락
신고
Posted by 대절님

댓글을 달아 주세요



티스토리 툴바