레이블이 자바오라클교육인 게시물을 표시합니다. 모든 게시물 표시
레이블이 자바오라클교육인 게시물을 표시합니다. 모든 게시물 표시

2013년 10월 22일 화요일

[JSP강좌]JSP 페이지 지시자 지시자는 JSP가 JSP 콘테이너에게

[JSP강좌]JSP 페이지 지시자 

지시자는 JSP가 JSP 콘테이너에게 어떠한 메시지를 보내기 위한 것
 클래스선언, 구현할 메소드, Content-Type등의 값을 설정
 클라이언트에 어떠한 출력도 내보내지 않는다.
 모든 지시자들은 JSP 파일 전체에 대한 범위를 가진다.
 지시자는 태그 안에서 @로 시작한다.
 page, include, taglib 지시자 등이 있다.

[page 지시자]
language :  <%@ page language=“java” %> 사용언어 지정 기본값은 java

extends :  생성될 클래스가 확장해야하는 슈퍼클래스의 완전한 이름을 지정, 상속할 Class지정, 생략시 콘테이너가 자동으로 HttpJspPage 인터페이스를 구현한 클래스를 지정하므로 보통 사용안함, 톰캣의 경우 변환된 .java File을 확인하면 HttpJspPage 를 구현한HttpJspBAse를 상속함
<%@ page extends=“확장할 클래스명” %>

import : 일반적인 자바클래스의 import, 여러개인 경우 ,로 구분 ,기본적으로 임포트 되는것 : java.lang.*, javax.servlet.*, javax.servlet.http.*, javax.servlet.jsp.*
session : 페이지가 하나의 HTTP 세션에 참여하는지의 여부, session은 서블릿의 javax.servlet.http.HttpSession 객체와 대응되는 것으로 JSP컨테이너에서는 session이라는 별명으로 제공, 세션을 사용할려면 반드시 “true”, 기본값 true

buffer : Client 출력 스트림에 쓰일 버퍼링 방식을 지정 JSP에서의 출력버퍼의 크기를 지정, ‘none’으로 설정되면 JspWriter 객체를 이용한 출력시 버퍼를 이용하지 않고 JSP에서 출력되는 내용은 즉시 Client에 응답한다.
<%@ page buffer=“8kb” %>
autoFlush : “true”인 경우 출력버퍼가 꽉 차면 자동적으로 버퍼가 비워짐, “false”인 경우 overflow발생(예외)
<%@ page autoFlash=“true” %>
Buffer 속성을 “none” 으로 한 경우 autoFlash=“false”로 설정 할 수 없다.
isThreadSafe : “false”인 경우 JSP처리기는 요청들을 도착한 순서대로 Queue에 쌓은후 순서대로 요청들을 하나씩 처리, 이는 서블릿에서 SingleThreadModel을 구현 할 때와 같은 방식이다. 즉 true로 설정되면 _jspService 메소드가 Synchronized를 이용하여 동기화 된다. 즉 HTTP 요청을 처리하기 위한 스레드가 종료 한 후에 다른 스레드가 수행된다.

info : 페이지의 Servlet.getServletInfo() 메소드의 구현으로 얻을수 있는 정보문자열을 정의, 내용이나 길이의 제한은 없으며 제작자 이름, 버전, 저작권 정보등이 포함된다.


isErrorPage : 현재 JSP Page가 다른 JSP Page의 에러페이지인지의 여부를 결정 “true”이면 이 페이지는 에러 Page의 역할을 하며 Exception 개체를 제어 가능 하다. 이 Exception 개체는 java.lang.Throwable 클래스의 인스턴스 이다. 
errorPage : 점검(catch)되지 않은 RunTime 에러가 발생시 호출될 에러 page의 URL을 기술한다. 에러페이지와 에러를 발생시킨 페이지는 같은 서버에 존재해야 한다. 출력 스트림이 버퍼로 설정되어 출력이 Client로 안 갔다면 error page의 호출이 가능하나, 출력이 이미 Client로 전송되었다면 에러페이지의 호출은 불가능하다. 기본적으로 버퍼는 8kb이므로 8kb이하로 출력을 했다면 에러페이지의 호출은 가능. 결국 에러페이지는 클라이언트로 아무것도 넘어가지 않은 경우 Exception이 발생했을때 가능<%@ page errorPage=“../error.jsp %> 

contentType  : JSP Page의 MIME Type을 설정<%@ page contentType= “text/html; charset=euc-kr” %> 

pageEncoding : JSP Page를 위한 문자 인코딩을 지정
<%@ page pageEncoding=“euc-kr” %> 




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


[기타 다른 강좌는 아래 해당 카테고리를 클릭해주세요]


2013년 8월 10일 토요일

[HTML5, AJAX, jQUERY, 웹표준, 웹접근성 실무교육]HTML5, WebWorker

WEBWORKER는 웹클라이언트에 멀티쓰레드를 할 수 있게 해주는 것이다.
 
오라클자바커뮤니티에서 설립한 오엔제이프로그래밍 실무교육센터
(오라클, SQL기초튜닝, 자바, 스프링3.X, 웹표준, HTML5, Ajax, jQuery, 안드로이드, 아이폰, 닷넷 실무강의)  

[장점]
1. 메인 스크립트에서 긴 연산을 수행할 때 브라우저가 어는(freeze) 현상을 방지할 수 있다.
2. 빡센 계산을 할 때 멀티코어를 사용하여 병렬계산을 할 수 있다.
[제약사항]
1. 보안상의 이유로 WebWorker는 DOM 객체에 접근할 수 없다.
2. 뭐 동일한 이유로 alert() 등도 사용할 수 없다.
- 하지만 다음 객체들은 사용가능
navigator, location, XMLHttpRequest, Date, String 등 자바스크립트 기본 객체들
3. 통신에 사용되는 postMessage() 함수의 매개변수로 객체를 넘길 수 있지만 call by value 이므로 역시
DOM 객체에 접근불가
4. 각 브라우저에서 구현한 WebWorker가 프로세스의 형태이든 쓰레드의 형태이든 시동비용과 인스턴
스당 메모리 사용량이 제법 되므로 왕창 생성해서 무지막지하게 돌리는 것은 권장되지 않음
5. 여러 페이지가 공유하는 형태의 WebWorker인 SharedWorker는 아직 구현된 브라우저가 없음  

2013년 8월 1일 목요일

java interface polymorphism(인터페이스를 이용한 다형성)

앞의 예제의 Manager Class는 제외함.
인터페이스를 이용해 메소드를 사용하고 또 더불어 다형성을 제공할 수도 있다. 예를 들어 운전자는 영업팀 직원일 수도 있고 영업팀팀장일 수도 있다. 앞서 클래스의 다형성을 이야기 할 때 설명한 것과 비슷한 내용이지만 결국 운전자는 때에 따라서 여러 형태로 보여질 수 있다는 의미이다. 만약 운전자를 나타내는 인터페이스 SmallDriver 인터페이스가 영업팀직원일 수도 있고 영업팀팀장을 나타낼 수도 있다면 프로그래밍을 하는 사람의 입장에서는 보다 유연한 프로그래밍을 제공받을 수 있을 것이다. 


//인터페이스 선언
interface SmallDriver { 
  void driveSmallCar(); // 메소드 선언 
}

abstract class Employee {
    String name;
    String id;

  //생성자
    public Employee(String name1, String id1) { 
  name = name1;  id = id1; 
    }
    public void gotoOffice() {    System.out.println(name+"님 출근하였습니다...");  }
    public void gotoHome() {      System.out.println(name+"님 퇴근하였습니다...");  }
    public String toString() {    return "직원의 이름은 " + name + "이다.";  }
    abstract public void startJob();
}


//직원클래스를 상속한 영업팀직원 클래스
class SalesEmployee extends Employee implements SmallDriver{
    //영업담당지역, 메소드내에서만 변수에 접근이 가능하다.
    private String chargeArea;   
public String carName="소나타";
    public SalesEmployee(String newName,String newID,String newArea) {
        super(newName, newID);   
this.chargeArea = newArea;
    }
// SmallDrive 인터페이스의 메소드 구현 
    public void driveSmallCar() { 
          System.out.println("영업팀 직원 " + name + "은 " + carName + "를 운전한다.");
    }
    public void startJob() {
        System.out.println(super.name + "님이 " + this.chargeArea + " 지역으로 영업업무를 나갑니다...");
    }
}


//영업팀직원 클래스를 상속한 영업팀장 클래스
class SalesChief extends SalesEmployee implements SmallDriver{
      int salesTarget;  //영업팀 목표 매출액
  public String carName="그랜져";
      public SalesChief(String newName,String newID,String newArea, int newSalesTarget) {
          super(newName, newID, newArea); 
          this.salesTarget = newSalesTarget;
      }
  // SmallDrive 인터페이스의 메소드 구현 
      public void driveSmallCar() { 
          System.out.println("영업팀 팀장 " + name + "은 " + carName + "를 운전한다.");
      }
      //영업팀장의 업무는 더이상 확장이 안된다는 의미, 상속할수가 없다는 의미
      final public void startJob() {
          System.out.println(super.name + "님이 영업팀 직원을 관리한다...");
          System.out.println(super.name + "님이 관리하는 영업팀의 매출목표는 "+ this.salesTarget + "만원 입니다...");
      }
}


//Main Class
class InterfaceSample2 {
    public static void main(String[] args) {
        // 인터페이스가 클래스의 객체를 참조하도록...
        SmallDriver sm1 = new SalesEmployee("홍길동", "11111","서울");
        SmallDriver sm2 = new SalesChief("이순신", "22222", "개발부", 100000000);
        sm1.driveSmallCar();
sm2.driveSmallCar();

SalesEmployee se = new SalesEmployee("차두리","23456","독일");
se.gotoOffice();
se.startJob();
se.carName="티코";
se.driveSmallCar();
    }
}


추상메소드를 가지고 있고 이를 상속받거나 구현하는 클래스는 이 추상 메소드를 재정의하고 구현해야 한다는 점, 그리고 다형성을 구현하는 방법이라는 점, 메소드들이 동적으로 바인딩 된다는 점들은 비슷하다.
차이점
      - 인터페이스는 서로 연관성이 없는 클래스들에 의해 구현될 수 있고 따라서 수평적인 구현이 가능하지만 추상클래스의 경우 단일 상속 개념 하에 수직적인 구조로 상속을 해야만 한다.
    - 인터페이스에서는 메소드를 선언만 할 수 있으며 구현할 수 없다. 그리고 이 구현은 인터페이스를 구현하도록 설정된 클래스에서 가능하다. 하지만 추상클래스의 경우에는 추상 클래스 내부에서 메소드의 선언과 구현이 모두 가능하며 또한 이를 상속 받은 클래스에서도 재정의가 가능하다.

2013년 7월 30일 화요일

[오라클교육,자바교육,오라클자바교육]Column Name & Constraints rename 이름 변경(오라클 컬럼이름, 제약조건 이름 변경)

테이블이나 인덱스의 이름을 변경하는 것은 오라클 9iR2 이전에도 가능했지만 9iR2에서는 테이블의 컬럼 명 또는 제약조건의 이름을 변경하는 것이 가능해 졌습니다.



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



SQL> create table test (
  2  c1 varchar2(4) not null,
  3  c2 number(10)  not null
  4  );

테이블이 생성되었습니다.

프라이머리 키를 추가 합니다. 이때 C1컬럼에 대해 인덱스가 생성 됩니다.

SQL> alter table test add (constraint pk_test
  2                        primary key (c1));

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

SQL> desc test;
 이름                                      ?      유형
 ----------------------------------------- -------- --------------

 C1                                        NOT NULL VARCHAR2(4)
 C2                                        NOT NULL NUMBER(10)

사용자의 제약 조건을 확인 할  수 있는 USER_CONSTRAINTS VIEW를 통해 TEST 테이블에 제약조건의 타입이 P 인것 즉 Primary Key인 제약조건을 검색 합니다. 제약조건에는 NOT NULL, UNIQUE, CHECK, PRIMARY KEY등 테이블의 컬럼에 제약을 가하는 조건을 말합니다.

SQL> select constraint_name
  2  from   user_constraints
  3  where  table_name = 'TEST'
  4  and    constraint_type = 'P';

CONSTRAINT_NAME
------------------------------
PK_TEST

이번에는 TEST 테이블에 생성되어 있는 인덱스를 확인 합니다. 위에서 C1 컬럼을 Primary Key로 설정하여 저절로 이 컬럼에 대한 인덱스가 생성되어 있습니다.

SQL> select index_name,
  2         column_name
  3  from   user_ind_columns
  4  where  table_name = 'TEST';

INDEX_NAME           COLUMN_NAME
------------------------------------

PK_TEST                     C1

우선 테이블의 이름을 바꾸어 봅니다. 이 기능은 오라클의 이전 버전에서도 되는 기능 입니다

SQL> alter table test rename to test1;

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

이번에는 컬럼명을 바꾸어 보죠^^

SQL> alter table test1 rename column c1 to code;

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

Primary Ket 제약 조건의 이름을 변경 합니다.

SQL> alter table test1 rename constraint pk_test to pk_test1;

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

이번에는 Primary Key에 걸린 인덱스의 이름을 바꿉니다.

SQL> alter index pk_test rename to pk_test1;

인덱스가 변경되었습니다.

위에서 변경한 내역에 대해 확인해 보겠습니다

SQL> select constraint_name
  2  from   user_constraints
  3  where  table_name = 'TEST1'
  4  and    constraint_type = 'P';

CONSTRAINT_NAME
------------------------------
PK_TEST1

SQL> select index_name,
  2         column_name
  3  from   user_ind_columns
  4  where  table_name = 'TEST1';

INDEX_NAME             COLUMN_NAME
---------------------------------------------

PK_TEST1                    CODE

[출처]오라클자바커뮤니티



[SQL 팁]CASE를 활용한 SQL문장의 통합(오엔제이프로그래밍,오라클,자바실무교육)

1.       개요
동일한 테이블을 사용하고 WHERE 조건이 비슷한 유형으로 전개되는 SQL 문은 하나로 통합될 음을 유의하고 아래 예를 참고하자.


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



[첫번째 SQL]
SQL> select max(empno) from emp3
  2  where deptno > 10;

MAX(EMPNO)
----------
      7902

[두번째 SQL]
SQL>  select count(empno) from emp3
  2   where deptno > 10
  3  and   sal > 2000;

COUNT(EMPNO)
------------
     2097152


동일한 테이블에서 비슷한 조건이면서 하나는 MAX , 하나는 COUNT 값을 구하는 것이다. 번째 SQL 문의 sal > 2000 제외하고 같은 조건 절을 갖고 있다는 것을 있다.

2) 문제점

하나의 SQL 문으로 통합할 있음에도 2 개로 SQL 나누어 수행하였다.

3) 해결 방안

위의 경우 CASE 사용하면 쓰면 개의 SQL 하나로 만들어 테이블을 액세스 하게 있다다음과 같이 CASE 쓰면 SAL>2000 경우 계속 1 더해 줌으로서 전체에 SAL > 2000 값이 있는지 COUNT 해주는 것과 전체 COUNT 값도 있다.  이와 같이 번에 테이블을 액세스 있는 SQL 문을 쓰면 테이블을 번에 걸쳐 읽을 것을 읽고도 처리할 있으므로 보다 효율적인 프로그램이 되는 것이다.


SQL>  select max(empno), sum(case when sal>2000 then 1 else 0 end)
  2   from emp3
  3  where deptno > 10;

MAX(EMPNO) SUM(CASEWHENSAL>2000THEN1ELSE0END)
---------- ----------------------------------
      7902                            2097152



[출처]오라클자바커뮤니티