레이블이 ROW EFFECTED인 게시물을 표시합니다. 모든 게시물 표시
레이블이 ROW EFFECTED인 게시물을 표시합니다. 모든 게시물 표시

2013년 8월 5일 월요일

[스트럿츠 한글, 자바프레임워크교육,자바교육,오라클자바오엔제이]Struts 에서 한글 사용하기

Struts 에서 한글 사용하기


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




한글의 경우 필요한 시기에 그때그때 인코딩을 해도 되지만 Servlet2.3에서 제공하는 Filter기능을 이용하는 것처럼 스트럿츠에서도 그러한 기능의 구현이 가능 합니다.

--------------------------------------------------
우선 서블릿의  필터 기능을 이용하여 작성한 예입니다.
--------------------------------------------------

[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>


-------------------------------------------------------------
다음은 스트럿츠의 RequestProcessor 클래스를 이용한 예 입니다.
-------------------------------------------------------------

스트러츠의 RequestProcessor클래스의 processPreprocess라는 메소드를 이용하여 다른 작업이 이루어지기 전에 미리 설정할 것들을 이 메소드에서 정의할 수 있는데 …. 이곳에 한글 인코딩 부분을 기술하여 모든 스트럿츠 애플리케이션에서 적용 되도록 합니다.

아래 파일을 MyFilter.java로 저장 합니다. (WEB-INF/classes/filter에 저장)

package filter;

import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;

import org.apache.struts.action.RequestProcessor;

public class MyFilter extends RequestProcessor {

        protected boolean processPreprocess(
                HttpServletRequest request,
                HttpServletResponse response) {
               
                try {
                        request.setCharacterEncoding("euc-kr");
                                               
                        return true;
                } catch (Exception e) {               
                        return false;                       
                }
        }
}


이번에 struts-config.xml 파일에 Controller 매핑을 합니다.

<!-- 한글 문제 처리를 위해 -->
    <controller
            contentType="text/html;charset=euc-kr"
            debug="3"           
            locale="true"
            nocache="true"
            processorClass="filter.MyFilter"/>

이상과 같이 설정하면 폼액션을 통해 넘어 오는 데이터에 대해 한글 변환을 일일이 하지 않아도 됩니다.

2013년 8월 4일 일요일

oracle pga(Oracle Program Global Area)

PGA(프로그램 글로벌영역,프로세스 글로벌영역) 
- 단일 프로세스(서버,백그라운드)에 대한 데이터와 제저정보를 저장하는 메모리 영역 
- 사용자 프로세스가 접속되고 세션이 형성되면 Oracle이 PGA를 할당한다. 
- 각 서버프로세스에 하나의 PGA가 할당되며,PGA는 서버프로세스에 대해 배타적이며 
항상 프로세스에 대해 실행되는 Oracle Code만을 읽거나 쓸수있슴 
- PGA의 크기는 운영체제마다 정적이며, OPEN_LINKS,DB_FILES,LOG_FILES등의  
  Parameter는 PGA의 크기에 영향을 준다. 사용자가 일단 접속되면 사용자는 PGA영 
  역을 초과하여 실행할수 없슴. 

1. 스택영역 
- PGA는 세션변수,배열 및 다른 정보를 저장하기위해 할당된 메모리인 스택 영역을 포 
함 

2. 세션정보 
- 다중스레드 서버없이 실행되는 인스턴스의 PGA는 전용SQL영역이나 다른 정보와 같 
은 사용자 세션에 대한 추가 메모리가 필요하고 인스턴스가 다중스레드 서버를 실행하 
는 경우 이추가 메모리는 PGA에 있지 않고 SGA내에 할당된다. 

3. 공유SQL영역 
- 다중스레드 서버와 함께 수행되는지의 여부에 관계없이 공유 SQL영역은 항상 PGA가 
아닌 SGA의 공유 메모리에 존재합니다.

[출처]오라클자바커뮤니티, 오엔제이프로그래밍
www.onjprogramming.co.kr

2013년 8월 2일 금요일

java inheritence and composition(자바 상속 컴포지션)

상속과 컴포지션은 동전의 양면과 같이 유사하게 서로에게 관련이 있다. 
 - 상속은 마치 양파가 여러 껍질로 이루어진 것과 같이 계층화된 객체
 - 컴포지션은 여러 재료(객체)가 한데 뭉쳐서 만들어진 죽
 - 컴포지션은 개체들간의 'has a' 관계, 상속은 ‘is a’관계
 - 상속과 컴포지션은 상호 배타적이지 않으며 개발자는 이 둘을 같이 사용한다.

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



Composition Exam

class Soap {
  private String s;
  Soap() {
    System.out.println("Soap()");
    s = new String("Constructed");
  }
  public String toString() { return s; }
}

public class Bath {
  private String 
    // Initializing at point of definition:
    s1 = new String("Happy"), 
    s2 = "Happy", 
    s3, s4;
  Soap castille;
  int i;
  float toy;
  Bath() {
    System.out.println("Inside Bath()");
    s3 = new String("Joy");
    i = 47;
    toy = 3.14f;
    castille = new Soap();
  }
  void print() {
    // Delayed initialization:
    if(s4 == null)
      s4 = new String("Joy");
    System.out.println("s1 = " + s1);
    System.out.println("s2 = " + s2);
    System.out.println("s3 = " + s3);
    System.out.println("s4 = " + s4);
    System.out.println("i = " + i);
    System.out.println("toy = " + toy);
    System.out.println("castille = " + castille);
  }

  public static void main(String[] args) {
    Bath b = new Bath();
    b.print();
  }
}

[Oracle Hint]조인 방법 변경(DRIVING_SITE), 오라클 힌트

조인 방법 변경(DRIVING_SITE)

구로디지털 오엔제이프로그래밍실무교육센터
www.onjprogramming.co.kr


분산환경(DB Link를 이용하는 경우)에서 쿼리를 사용하는 경우 일반적으로 SQL 실행의 주체는 해당 Query를 실행시킨 로컬데이터 베이스가 됩니다. 즉 원격지의 DEPT 테이블의 데이터를 로컬로 가져와서 조인을 하는 것은 로컬에서 하게 되구요… 참고로 이 힌트의 경우 Cost-Based Optimizer 또는 Rule-Based Optimizer환경 모두에서 사용 가능 합니다.

[형식]
/*+ DRIVING_SITE ( table ) */


SQL>select e.empno, e.ename, e.sal, d.dname, d.loc
      from emp e, dept@remote_db d   요기 DB Link 사용했습니다.
      where e.deptno = d.deptno;

Execution plan
-------------------------------------------------------------------
SELECT STATEMENT Optimizer=CHOOSE
NESTED LOOPS
  REMOTE          remote_db
  TABLE ACCESS (BY INDEX ROWID) of ‘EMP’
    INDEX (RANGE SCAN) OF ‘idx_emp_deptno’ (NON-UNIQUE)
 
SERIAL_FROM_REMOTE SELECT “DEPTNO”, “DNAME”, “LOC” FROM “DEPT” “D……

DRIVING_SITE 힌트를 사용하면 인자로 취한 테이블이 위치한 원격지에서 조인이 일어나게 할 수 있는데 즉 아래의 실행 계획을 보면 위에서와는 달리 SELECT STATEMENT 부분에 REMOTE라는 것이 보일 겁니다. 즉 다음의 쿼리는 원격지에서 주도해서 그곳에서 조인이 일어났음을 알 수 있습니다.


SQL>select /*+ driving_site(d) */ e.empno, e.ename, e.sal, d.dname, d.loc
      From emp e, dept@remote_db d
      Where e.deptno = d.deptno;

Execution plan
-------------------------------------------------------------------
SELECT STATEMENT(REMOTE) Optimizer=CHOOSE
MERGE JOIN
  SORT (JOIN)
      TABLE ACCESS (FULL) of ‘DEPT’
    SORT (JOIN)
      REMOTE*
 
SERIAL_FROM_REMOTE SELECT “EMPNO”, “ENAME”, “SAL” FROM ……

분산 환경의 쿼리를 실행하는 경우 그쪽의 DB사양이나 시스템 사양이 좋다면 DRIVING_SITE 힌트를 이용하여 그곳에서 드라이빙이 일어나게 할 수 있습니다.

[예]
SELECT /*+DRIVING_SITE(departments)*/ *
FROM employees, departments@rsite
WHERE employees.department_id = departments.department_id; 

2013년 8월 1일 목요일

oracle 11g : 오라클11g : 읽기전용 테이블 , readonly table

Oracle 11g : 읽기 전용 테이블

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


이전 버전의 오라클에서는 테이블은 다른 사용자에게 SELECT 오브젝트 권한을 주는 경우에만 읽기전용이 가능했고 해당 Owner는 테이블에 Read/Write 둘 다 가능했으며 읽기전용으로 만드는 것은 불가능 했다.

오라클 11g에서부터 alter table 테이블명 read only 명령으로 읽기전용으로 변경이 가능하다,

[형식]
ALTER TABLE table_name READ ONLY;
ALTER TABLE table_name READ WRITE;


SQL>reate table readtest
as
select rownum id, '홍길동'||rownum name from dual;

SQL>select * from readtest;

SQL> alter table readtest read only;

테이블이 변경되었습니다.

SQL> insert into readtest values (2, '김길동');
insert into readtest values (2, '김길동')
            *
1행에 오류:
ORA-12081: "SCOTT"."READTEST" 테이블에 작업을 갱신하는 것이 허용되지 않습니다


SQL> delete from readtest;
delete from readtest
            *
1행에 오류:
ORA-12081: "SCOTT"."READTEST" 테이블에 작업을 갱신하는 것이 허용되지 않습니다


SQL> truncate table readtest;
truncate table readtest
               *
1행에 오류:
ORA-12081: "SCOTT"."READTEST" 테이블에 작업을 갱신하는 것이 허용되지 않습니다


SQL> alter table readtest read write;

테이블이 변경되었습니다.

SQL> truncate table readtest;

테이블이 잘렸습니다.

자바 InputStream (JAVA InputStream)

InputStream 클래스는 모든 파일 시스템으로부터 스트림의 한 바이트를 읽는다  

  int available(): 스레드가 대기하고 있는 상태에서 사용할 수 있는 바이트 반환, 실행을 중단하지 않고 입력 스트림에서 읽을 수  있는 바이트의 수를 리턴합니다. InputStream의 available 메소드는 0을 리턴합니다. 이 메소드는 서브클래스로 대체(override)되어야 합니다. 
  void close(): 입력 스트림을 닫는다.
  synchronized void mark(int i): 입력 스트림 상의 위치를 표시한다.
  public abstract int read(): 한 문자를 읽고 반환. 이때 스트림 끝은 -1
  int read(byte b[]): 바이트 배열을 읽는다.
  int read(byte b[], int off, int len): 배열 b의 off 위치에서 len 바이트 읽는다.
  sychronized void reset(): 마지막 표시를 반환하고, 계속 read()로 바이트를  읽을 수 있다.(mark 위치로 돌아감)
  void long skip(long i): 입력 스트림에서 n 바이트를 건너뛴다.
  public boolean markSupported() : 입력 스트림이 mark 및 reset 메소드를 지원하는지 여부를 테스트합니다
  System.in.read()는 표준 입출력 스트림으로부터 요구된 자료가 주어질 때까지 실행을 대기하고 있다가 리턴키가 전송될 때 비로소 진행한다. 읽는 단위는 ASCII의 8비트 문자단위이다.


// 읽은 문자를 정수(int)로 취급하는 경우
import java.io.*;
public class TestFile{
  public static void main (String args[]) throws IOException {
    StringBuffer buf=new StringBuffer();   
    int i; 
    while ((i=System.in.read())!=-1)// -1은 eof에 해당하는 코드
        buf.append((char)i); // ctrl+z은 -1에 해당한다.
    System.out.println();
    System.out.print(buf.toString());//StringBuffer를 string으로 변환
  }
}




//system.in.read()를 char로 형변환
import java.io.*;
public class TestFile1{
  public static void main (String args[]) throws IOException {
    StringBuffer buf=new StringBuffer(); 
    char c;
    while ((c=(char)System.in.read())!='\n')
        buf.append(c);
    // 여기서는 ctrl+z이 필요없다. 왜냐면 문자로 읽기 때문이다.
    System.out.print(buf.toString()); //StringBuffer를 string으로 변환
  }
}


------------------------------
BufferedInputStream –  예제
------------------------------
import java.io.*;
public class BufferedStatement {
public static void main(String[] args) throws Exception {
FileInputStream fis = new FileInputStream(args[0]);
BufferedInputStream bis = new BufferedInputStream(fis);
System.out.println("Stream 되돌리기 기능......"+bis.markSupported());
bis.mark(1024); //마킹을 해둔곳으로부터 1024 Byte 읽기전까지는 마킹이 유효
for(int i=0;i<10;i++) {
System.out.write(bis.read());
}
bis.reset();
System.out.println("\n reset() 호출");
for(int i=0; i< 20; i++) {
System.out.write(bis.read());
}
}
}


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()); 
  } 
 } } 

2013년 7월 29일 월요일

(ORACLE SQL Returning 사용하기 ) INSERT, UPDATE or DELETE statement에 의해 영향을 받는 로우를 검색 할 수 있게 해주는 구

INSERT, UPDATE or DELETE statement에 의해 영향을 받는 로우를 검색 할 수 있게 해주는 구...
참고하시고, 열공하세요. 

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


www.onjprogramming.co.kr


SQL> variable v_ename varchar2(10);
SQL> variable v_sal number;
SQL> insert into emp (empno, ename, sal)
  2  values (5555, 'jclee', 7000)
  3  returning ename, sal into :v_ename, :v_sal;

1 개의 행이 만들어졌습니다.

SQL> print v_ename;

V_ENAME
--------------------------------
jclee

SQL> print v_sal;

    V_SAL
----------
      7000

SQL> update emp set ename='tatata',
  2                sal = 9000
  3  where ename = 'jclee'
  4  returning ename, sal into :v_ename, v_sal;
returning ename, sal into :v_ename, v_sal
                                    *
4행에 오류:
ORA-00905: 누락된 키워드


SQL> update emp set ename='tatata',
  2                sal = 9000
  3  where ename = 'jclee'
  4  returning ename, sal into :v_ename, :v_sal;

1 행이 갱신되었습니다.

SQL> print v_ename;

V_ENAME
--------------------------------
tatata

SQL> print v_sal;

    V_SAL
----------
      9000

SQL> commit;

커밋이 완료되었습니다.