레이블이 Java Collection Framework인 게시물을 표시합니다. 모든 게시물 표시
레이블이 Java Collection Framework인 게시물을 표시합니다. 모든 게시물 표시

2013년 8월 8일 목요일

스트럿츠 예제 Constants.java [오라클자바닷넷커뮤니티강좌교육]

package oraclejavanew;

public class Constants {
        /**
        * 로그인한 사용자의 LoginForm이 저장될 세션 범위의 Attriute 이름
        */
        public static final String USER_KEY = "user";
       
        /**
        * 로그인한 사용자의 선택 상품을 보관할  세션 범위의 CART
        */
        public static final String CART_KEY = "cart";
       
        /**
        * 로그인한 사용자의 선택 상품을 보관할  세션 범위의 CART(MAP에서 빠져니온 ArrayList)
        * ArrayList안에는 CartItem이 있다.
        */
        public static final String CART_LIST = "cartlist";
       
        /**
        * 로그인한 사용자의 배송지를 보관할  세션 범위의 BAESONGJI
        */
        public static final String BAESONGJI_KEY = "baesongji";
       
        /**
        * 카드 결재시 승인 후 결과 페이지
        */
        public static final String CARD_RESULT_PAGE = "resultpage";
       
        /**
        * 주문번호 생성시 오류 발생한 경우 이동할 페이지
        */
        public static final String ORDER_NO_ERROR = "ordernoerror";
       
       
        /**
        * 무통장 주문완료 후  결과 페이지, 이곳에서 PayAction을 부름...
        */
        public static final String MU_RESULT_PAGE = "muresultpage";
       
       
        /**
        * 로그인한 사용자의 배송지를 보관할  세션 범위의 BAESONGJI
        * ArrayList안에 BaesongjiItem이 들어가 있다.
        *
        */
        public static final String BAESONGJI_LIST = "baesongjilist";
       
       
                     
        /**
        * ActionForward에서 사용되는 값       
        */
        public static final String LOGINOK      = "loginok";
        public static final String LOGIN        = "login";
        public static final String CARTOK      = "cartok";
        public static final String ORDERPAGE    = "orderpage";
        public static final String ORDERMOD    = "ordermod";
        public static final String ORDERCONFIRM = "orderconfirm";
        public static final String LOGOFFOK    = "logoffok";
        public static final String MAIN        = "main";       
        public static final String SHOPINGEND  = "shopingend"; 
        public static final String BADACTION    = "badaction";
       
        public static final String CART      = "/oraclejava/goods/cart.jsp";
        public static final String ORDER      = "/oraclejava/goods/order.jsp";
                       
}

2013년 8월 6일 화요일

[오라클자바닷넷교육강좌]웹애플리케이션에서의 로깅 , Web Application Logging

웹애플리케이션에서의 로깅 

오라클자바커뮤니티에서 설립한 오엔제이프로그래밍 실무교육센터
(오라클SQL, 튜닝, 힌트,자바프레임워크, 안드로이드, 아이폰, 닷넷 실무전문 강의)  



로그를 남겨 프로그램을 디버깅 하는 일은 대단히 중요한 일입니다. 웹 애플리케이션에서의 로깅은 크게 시스템 로깅과 애플리케이션 로깅으로 나누어 볼 수 있는데 시스템 로깅은 사용자의 데이터 보다 애플리케이션의 내부적인 동작에 대한 기록 입니다. 예를 들면 컨테이너가 시작했을 때의 시스템적인 오류 정보 등을 기록하는 것들이 해당 되며 애플리케이션의 로그는 사용자가 로그인을 하는 경우 인증을 한 정보 등을 기록하는 것이 해당 됩니다.

시스템의 오류는 error로 표현되는 반면에 애플리케이션의 에러는 info로 정의가 가능합니다.

--------------------------------------
서블릿 컨테이너를 이용한 로깅
--------------------------------------

서블릿의 스펙에서 개발자들이 컨테이너의 로그 파일에 이벤트 정보를 로깅 할 수 있도록 지원 합니다. 로그파일의 이름이나 위치는 어떤 컨테이너를 사용 하느냐에 따라 다르지만 기록이 된다는 것은 사실 입니다.

java.servlet.ServletContext는 로그를 남기기 위한 두개의 메소드를 제공 합니다.

ppublic void log(Stirng msg);
public void log(String msg, Throwable throwable);

아래는 이 메소드를 Struts의 Action에서 사용 한 예입니다.

[이전의 DB를 이용한 인증 예제의 LoginAction 입니다.]

//로그를 남기자.
                StringBuffer buf = new StringBuffer("LoginAction : User --> ");
                buf.append(id + " logged in session");
                servlet.log(buf.toString());

위의 소스 코딩에 위해 Tomcat의 Console창에 다음과 같은 기록이 남습니다…

정보: action: LoginAction : User --> jcleelogged in session



------------------------
필터사용
-----------------------

필터는 서블릿2.3에 새로 추가된 기능 입니다. 서블릿의 필터를 이용하면 HTTP요청과 응답객체의 Contents를 검사 할 수 있으며 정적인 Contents뿐 아니라 동적인 Contents에 대해서도 필터기능을 이용하는 것이 가능 합니다.

필터링 기능을 이용하여 아래와 같은 일들이 가능 합니다.

- 클라이언트의 요청이 도달하기 전에 웹 리소스에 대해 접근 가능 합니다.
- 클라이언트의 요청이 리소스에 도달하기 전 요청을 처리 할 수 있습니다.
- 요청헤더나 데이터에 대한 수정이 가능
- 응답헤더나 데이터에 대한 수정 가능
- 어떤 리소스를 수행 한 후 리소스에 대한 메소드 호출을 가로챌 수 있습니다.

이 필터 기능을 로깅만을 위해 쓰기에는 아까운 면도 있지만 시스템에서 사용자의 행위를 추적하기에는 적합한 기술 입니다. 필터를 이용해 암호화, URL 및 기타정보에 대한 캐시, 인증,XML Contents를 변환하기 위한 XSLT 변환 등 다양한 일들을 할 수 있습니다.

필터를 생성 하기 위해서는 세 단계를 거쳐야 합니다.

1.        javax.servlt.Filter 인터페이스를 구현하는 자바 클래스를 만듭니다.
2.        web.xml에 filter 요소를 선언 합니다.
3.        웹애플리케이션의 리소스와 함께 filter class를 packaging 합니다.

Javax.servlet.Filter 인터페이스를 구현하는 클래스에서 반드시 구현해야 하는 세가지 메소드는 다음과 같습니다.

public void init(FilterConfig filterConfig) throws ServletException;
public void doFilter(ServletRequest request, ServletResponse response, FilterChain chain) throws IOException, ServletException;
public void destroy( );

[필터 예]


import java.io.IOException;
import javax.servlet.Filter;
import javax.servlet.FilterChain;
import javax.servlet.FilterConfig;
import javax.servlet.ServletRequest;
import javax.servlet.ServletContext;
import javax.servlet.ServletResponse;
import javax.servlet.ServletException;

public class LoggingFilter implements Filter{
        public final static String LOG_FILE_PARAM = "Login.log";
        private FilterConfig filterConfig = null;
        private ServletContext servletContext = null;

        public void init( FilterConfig config ) throws        ServletException {
                // Initialize any neccessary resources here
                this.filterConfig = config;
                this.servletContext = config.getServletContext( );

                // You can get access to initialization parameters from        web.xml
                // although this example doesn't really use it
                String logFileName = config.getInitParameter( LOG_FILE_PARAM );

                // You can log messages to the servlet log like this
                log( "Logging to file " + logFileName );

                // Maybe initialize a third-party logging framework        like log4j
        }

        public void doFilter( ServletRequest request,ServletResponse response,FilterChain filterChain )       
                              throws IOException, ServletException {
                // Log a message here using the request data
                log( "doFilter called on LoggingFilter" );

                // All request and response headers are available to the filter
                log( "Request received from " +        request.getRemoteHost( ) );

                // Call the next filter in the chain
                filterChain.doFilter( request, response );
        }

        public void destroy( ){
                // Remove any resources to the logging framework here
                log( "LoggingFilter destroyed" );
        }

        protected void log( String message ) {
                getServletContext( ).log("LoggingFilter: " + message );
        }

        protected ServletContext getServletContext( ){
                return this.servletContext;
        }
}


[web.xml]

<filter>
                <filter-name>MyLoggingFilter</filter-name>
                <filter-class>LoggingFilter</filter-class>
                <init-param>
                        <param-name>log_file_name</param-name>
                        <param-value>log.out</param-value>
                </init-param>
        </filter>

        <filter-mapping>
                <filter-name>MyLoggingFilter</filter-name>
                <servlet-name>MyExampleServlet</servlet-name>
        </filter-mapping>

        <filter-mapping>
                <filter-name>MyLoggingFilter</filter-name>
                <url-pattern>/*</url-pattern>
        </filter-mapping>



다음은 필터 기능을 이용하여 스트럿츠에서 한글 문제를 해결 한 경우 입니다.

[SetCharacterEncodingFilter.java]

package filters;


import java.io.IOException;
import javax.servlet.Filter;
import javax.servlet.FilterChain;
import javax.servlet.FilterConfig;
import javax.servlet.ServletException;
import javax.servlet.ServletRequest;
import javax.servlet.ServletResponse;
import javax.servlet.UnavailableException;



public class SetCharacterEncodingFilter implements Filter {

    protected String encoding = null;

    protected FilterConfig filterConfig = null;


    /**
    * Should a character encoding specified by the client be ignored?
    */
    protected boolean ignore = true;


    public void destroy() {

        this.encoding = null;
        this.filterConfig = null;

    }


    public void doFilter(ServletRequest request, ServletResponse response,
                        FilterChain chain)
        throws IOException, ServletException {

        // Conditionally select and set the character encoding to be used
        if (ignore || (request.getCharacterEncoding() == null)) {
            String encoding = selectEncoding(request);
            if (encoding != null)
                request.setCharacterEncoding(encoding);
        }

        // Pass control on to the next filter
        chain.doFilter(request, response);

    }

    public void init(FilterConfig filterConfig) throws ServletException {

        this.filterConfig = filterConfig;
        this.encoding = filterConfig.getInitParameter("encoding");
        String value = filterConfig.getInitParameter("ignore");
        if (value == null)
            this.ignore = true;
        else if (value.equalsIgnoreCase("true"))
            this.ignore = true;
        else if (value.equalsIgnoreCase("yes"))
            this.ignore = true;
        else
            this.ignore = false;

    }


    protected String selectEncoding(ServletRequest request) {

        return (this.encoding);

    }
}


[web.xml]

<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE web-app PUBLIC "-//Sun Microsystems, Inc.//DTD Web Application 2.3//EN" "http://java.sun.com/j2ee/dtds/web-app_2_3.dtd">
<web-app>

<!-- Example filter to set character encoding on each request -->
<filter>
 <filter-name>Set Character Encoding</filter-name>
 <filter-class>filters.SetCharacterEncodingFilter</filter-class>
 <init-param>
  <param-name>encoding</param-name>
  <param-value>EUC-KR</param-value>
 </init-param>
</filter>

<!-- Define filter mappings for the defined filters -->
<filter-mapping>
 <filter-name>Set Character Encoding</filter-name>
 <servlet-name>action</servlet-name>
</filter-mapping>

    <servlet>
        <servlet-name>action</servlet-name>
        <servlet-class>org.apache.struts.action.ActionServlet</servlet-class>
       
        <init-param>
            <param-name>config</param-name>
            <param-value>/WEB-INF/struts-config.xml</param-value>
        </init-param>
        <init-param>
            <param-name>debug</param-name>
            <param-value>3</param-value>
        </init-param>
        <init-param>
            <param-name>detail</param-name>
            <param-value>3</param-value>
        </init-param>
        <load-on-startup>1</load-on-startup>
    </servlet>
   
    <servlet-mapping>
        <servlet-name>action</servlet-name>
        <url-pattern>*.do</url-pattern>
    </servlet-mapping>
 
</web-app> 

2013년 8월 2일 금요일

자바의클래스 초기화에 대해서... (class initialize)

클래스가 어떻게 초기화 되는지 잘 알고 있어야 합니다.


오라클자바커뮤니티에서 설립한 오엔제이프로그래밍 실무교육센터
(오라클SQL, 튜닝, 힌트,자바프레임워크, 안드로이드, 아이폰, 닷넷 실무전문 강의) 



클래스가 메모리로 적재된 후  클래스가 사용 되기 전 한번 초기화 된다.

초기화 순서
-  모든 클래스변수는 Default 초기치(0, ‘\u0000’,false, null)로 초기화 된다.
- 클래스변수 초기화수식(Static initializers)과 클래스 초기화 블럭이 실행된다.
      예) public static int PI=3.14;
          public static int facs[] = new int[10];
          static { facs[0]=1;
          for(int I=1;I<10;I++) { facs[I] = facs[I-1]*I; }


New 연산자에 의한 작업 순서

-  객체를 위한 메모리 공간 할당
-  모든 인스턴스 변수는 Default 초기치(0, ‘\u0000’,false, null)로 초기화 된다.
- 인스턴스 변수 초기화수식(instance initializers)과 초기화 블럭이 실행된다.
- 생성자의 첫문장에서 다른 생성자를 호출하는 경우엔 이를 먼저 처리(서브클래스인 경우 명시적인 상위클래스 생성자에 대한 호출이 없으면 super()를 삽입하고 이를 실행한다.)
- 생성자의 나머지 부분을 실행한다. 

2013년 8월 1일 목요일

자바의 OutputStream (JAVA OutputStream)

OutputStream 클래스는 모든 파일 시스템으로부터 스트림의 한 바이트를 쓴다. 
  public abstract void write(int b): 정수 b를 byte로 변환하여 출력한다.
  public void write(byte b[]): 배열 b의 모든 바이트를 쓴다.
  public void write(byte b[], int off, int len): b의 off 위치로부터 len만큼 쓴다. 
  public void close(): 출력 스트림을 닫는다.
  public void flush(): 버퍼에 남겨진 모든 데이터를 목적지에 보낸다.
  InputStream과 OutputStream은 추상 메소드를 포함하여 바이트들과 바이트 배열들을 읽고 쓰기 위하여 read()와 write()를 사용하는데 실제로 바이트 스트림을 읽고 쓰는 경우가 드물기 때문에 이 메소드는 거이 이용하지 않는다. 왜냐하면 자바에서 문자열은 바이트가 아니라 유니코드로서 일반적으로 숫자, 문자열, 객체형태로 입출력되기 때문이다. 


public class Iotest { //입력 문자열을 그대로 출력 
      public static void main(String []args) throws java.io.IOException {
            int i;
            while ((i=System.in.read())!=-1)
                System.out.write(i); // 정수 i를 문자로 바꾸어 출력한다.
      }
 }

java.util.HashSet 클래스 – 예제

import java.util.*; 
public class SetTest { 
 public static void main (String  args[]) { 
  String  names[] = {"홍명보", "안정환", "차두리","히딩크", "황선홍", "이운재", "설기현", "황선홍"}; 
  Set koreaTeam = new HashSet(); 
  int namesLen = names.length; 
  int index; 
  for (int i=0; i < 100; i++) { 
index =  (int)(Math.random()*namesLen); 
koreaTeam.add (names[index]); 
  } 
  Iterator it = koreaTeam.iterator(); 
  while (it.hasNext()) { 
    System.out.println (it.next()); 
  } 
 } } 

Java Collection Framework (자바 컬렉션 프레임워크)

java2에 새롭게 추가된 자료구조 클래스들의 모임
 Collection, Map, Set, List, StoredMap, StoredSet등의 6개의 인터페이스와 이동을 구성하는 클래스들로 Java Collection FrameWork을 구성한다.
 대량의 Data를 다룰때 일관된 I/F를 제공
 6개의 인터페이스와 10개의 클래스로 구성
  java.util.Collection : 순서/중복에 관계없는 객체들의 단순한 모임
  java.util.Set : 중복되지 않는 수학적인 의미의 객체모임(순서는없다), Collection을 상속
  java.util.List : 순차적 나열에 의한 순서 지정이 가능한 구조. Collection을 상속
  java.util.Map : Key와 Key에 대한 Value로 이루어진 구조
  java.util.SortedSet : 값들이 정렬된 Set, Set을 상속
  java.util.SortedMap : Key가 정열된 Map