2011/01/13 21:35


1. DTD(Document Type Definition)
문서 구조 정의
-XML 문서의 구성요소들을 어떻게 사용하는 지를 정의
- 구성요소들 사이의 관계, 데이터 타입,출현 빈도 등의 규칙들을 정의
(XML 문서 안에서 사용하려는 태그를 정의하고, 태그들의 순서와 속성 및 data type에 대한 XML문서구조를 명시적으로 선언)

2. DTD 사용에 따른 이점
- 문서의 가독성 향상
- 문서 교환 시 이식성 향상
- XML문서 제작의 효율성 향상
- 애플리케이션에서 XML 문서 처리 시 해당 문서마다 동일한 규칙 적용

3. DTD의 물리적 구조
- 내부 DTD 서브셋, 외부 DTD 서브셋
- 일반적으로 DTD 문서라면 외부 DTD 서브셋이 정의되어 있는 문서를 의미
1) 내부 DTD 서브셋
- XML 문서 내부에서 작성되는 DTD
- 일반적으로 사용하지 않음(다른 XML 문서에 적용하기에 좋지 않은 방법)
- 주로 외부 DTD 서브셋의 일부 내용을 재정의 해서 XML문서에 적용할 목적으로 이용
- DTD의 정의는 한 문서에서 한 번만 정의
2) 외부 DTD 서브셋
- 마크업 언어에 대한 정의가 별도의 파일로 작성(여러 XML 문서에 공통적으로 적용하기에 적합한 방법)
- 새로운 마크업 언어의 개발(새로운 외부 DTD 서브셋의 작성)

3) 문서 유형 선언
- XML 문서 작성자가 XML 문서를 해석하는 측에게 전달하는 마크업 언어에 대한 정보
- 문서 내에 표시되는 마크업 언어에 대한 정보
(XML문서 작성자가 어떤 종류의 마크업 언어를 사용해서 XML 문서를 작성했는지를 알려주기 위해 사용)

(1) 외부 DTD 서브셋에 대한 선언
<?xml version=“1.0” encoding=“euc-kr”?>
<!-- 문서 유형 선언 -->
<!DOCTYPE 루트엘리먼트 SYSTEM “SYSTEM 식별자”>
- SYSTEM : 특정 단체나 업체 내부에서 사용되는 외부 DTD 서브셋 문서를 지정
- SYSTEM 식별자 : DTD 문서를 실제 다운로드 할 수 있는 URL 기술
<?xml version=“1.0” encoding=“euc-kr”?>

특정 웹서버 상에 있는 경우
version 1.0 encoding euc kr ?>
<!-- 문서 유형 선언 -->
<!DOCTYPE 루트엘리먼트 SYSTEM “http://웹서버주소/경로/~.dtd”>

XML 문서와 동일한 로컬 디렉토리에 있는 경우
<?xml version=“1.0” encoding=“euc-kr”?>
<!-- 문서 유형 선언 -->
<!DOCTYPE 루트엘리먼트 SYSTEM “~.dtd”>

- 외부 DTD 서브셋 문서 지정의 경우
- 주로 공개적인 사용을 목적으로 업체 및 단체에서 작성된 DTD

PUBLIC 키워드를 사용하는 경우
<?xml version=“1.0” encoding=“euc-kr”?>
<!-- 문서 유형 선언 -->
<!DOCTYPE 루트엘리먼트 PUBLIC “PUBLIC 식별자”“SYSTEM 식별자”>
- SYSTEM 식별자에는 PUBLIC 식별자를 알지 못하는 응용프로그램을 위해서 DTD 문서를 실제로 다운로드할 수 있는 URL 경로 기술

(2) 내부 DTD 서브셋에 대한 선언
<?xml version=“1.0” encoding=“euc-kr”?>
<!-- 문서 유형 선언 -->
<!DOCTYPE booklist [
<!ELEMENT booklist (book+)>
<!ELEMENT book (#PCDATA)>
]>
<booklist>
<book>예제 중심의 XML<book>
</booklist>
- 일반적으로 새로운 마크업 언어는 외부 DTD 서브셋으로 작성

(3) 내부 DTD 서브셋에서 외부 DTD 서브셋 내용의 재정의
비공개적인 사용목적을 가진 경우
<!DOCTYPE 루트엘리먼트 SYSTEM “SYSTEM 식별자” [
<!-- 재정의 DTD 내용 -->
]>

공개적인 사용목적을 가진 경우
<!DOCTYPE 루트엘리먼트 PUBLIC “PUBLIC 식별자”
“SYSTEM 식별자”
<!-- 재정의 DTD 내용 -->
]>

4. DTD 구성요소
- 텍스트 선언 : <?xml encoding=“euc-kr”?>
- 주석 : <!-- 주석 -->
- 엘리먼트 선언 : <!ELEMENT name (#PCDATA)>
- 속성 선언 : <!ATTLIST 학생 학년 (1|2|3|4) #REQUIRED>
- 엔티티 선언 : <!ENTITY 학교 “내용”>
- 노테이션 선언 : <!NOTATION gif SYSTEM “gifviewer.exe”>
- 컨디셔널 섹션 : <![%교수;[<!ELEMENT 전화 (집, 연구실)>]]>

1) 텍스트 선언
- 문서의 첫 줄에 기술되는 내용
- 외부 DTD 서브셋, 외부 파라미터 엔티티, 외부 파스드 엔티티
- XML 문법 버전과 인코딩 방식 지정(XML 선언부와 유사, version 속성 → 생략 가능, encoding 속성 → 생략 불가)
<?xml version=“1.0” encoding=“euc-kr”?>
<!ELEMENT booklist (book+)>
<!ELEMENT book (#PCDATA)>

2) 주석
- XML 문서의 주석 사용 방법과 동일
<?xml version=“1.0” encoding=“euc-kr”?>
<!-- 루트 엘리먼트 선언 -->
<!ELEMENT booklist (book+)>
<!-- 자식 엘리먼트 선언 -->
<!ELEMENT book (#PCDATA)>

3) 엘리먼트 선언
- 문서의 기본이 되는 논리적 단위
- 특정 사물이나 추상적인 개념을 구성하는 명사적인 특징
<!ELEMENT 엘리먼트명 컨텐트유형>
(이름 작성 규칙을 따라야 함)

컨텐트 유형에 따른 엘리먼트 종류
- #PCDATA 문자 : 데이터만 내용을 갖는 엘리먼트
- 자식 엘리먼트_리스트 : 자식 엘리먼트만 갖는 엘리먼트
- EMPTY : 아무것도 갖지 않는 빈 엘리먼트
- 혼합형 : 문자 데이터나 자식 엘리먼트를 혼합해서 가지는 엘리먼트
- ANY : 문자 데이터나 모든 엘리먼트를 가짐

자식 엘리먼트 순서, 출현횟수 지정
다양한 문서 구조의 정의가 가능

리스트 연산자 (,)
- 자식 엘리먼트의 작성 순서 결정
- 반드시 열거 순서대로 작성

선택 연산자 (|)
- 연산자에 의해 분리된 엘리먼트 중에 하나만 선택해서 작성하는 연산자

? 연산자
- 0 또는 1회 사용

+ 연산자
- 1회 이상 사용

* 연산자
- 0회 이상 사용

4) 속성 선언
- 엘리먼트에 추가적인 정보를 제공
<!ATTLIST 엘리먼트명
속성명1 속성유형 디폴트선언
속성명2 속성유형 디폴트선언
…>

- 속성으로 만들 수 있는 것은 자식 엘리먼트로도 가능 → 개발자가 결정
- 문서의 크기를 줄일 수 있다.
- 속성 자체가 엘리먼트에 종속적이기 때문에 확장성이 떨어짐
- 속성명은 XML 권고안의 이름 작성 규칙을 적용

디폴트 선언의 종류
- 엘리먼트 작성시 속성을 생략할 수 있는지, 아니면 반드시 기술해야 되는 것인지를 지정
- #IMPLIED : 속성이 선택적으로 사용 (생략 가능)
- #REQUIRED : 속성을 반드시 명시적으로 기술
- #FIXED : 속성이 선택적으로 사용, 속성값으로 지정된 문자열 이외의 값 지정 불가
- 디폴트 값 : 생략 시 기본 속성값으로 사용될 값을 기술

속성 유형의 종류
- CDATA : 문자 데이터
- ENUMERATION (…|…|…|…): 반드시 DTD에 나열된 값 중에서 하나 사용
- ID : 엘리먼트 인스턴스를 구별하기 위한 식별자로 사용, XML 문서 내에서 유일한 값을 지정
- IDREF/IDREFS : XML 문서 내에서 ID 속성값으로 지정된 값만 사용 가능, ID 속성값을 참조하는 레퍼런스값으로 사용
- NMTOKEN/NMTOKENS : 속성값으로서 이름 작성 규칙을 준수하는 데이터만 사용 가능
- NOTATION : DTD에 명시적으로 선언된 NOTATION명만 사용 가능
- ENTITY/ENTITIES : DTD에 명시적으로 선언된 엔티티명만 가능

(1) CDATA 속성 유형
- 속성값으로 임의의 문자 데이터 가능(<, >, &, ’, ” 사용 불가 -> 빌트인 엔티티 참조)

(2) ENUMERATION 속성 유형
- 몇 개의 속성값을 미리 DTD에 나열해놓고, 그 중에서 하나를 선택해서 사용
<!ATTLIST 엘리먼트명
속성명 (속성값1 | 속성값2 |…| 속성값N )
디폴트선언 >

(3) ID 속성 유형
- XML 문서에서 엘리먼트를 식별할 수 있도록 ID를 지정해 줌으로써 유일한 값을 가지게 함
- 속성값은 숫자로 시작할 수 없으며, 중간에 공백이 와서도 안됨
- 한 개의 엘리먼트는 ID 유형의 속성을 한 개만 가질 수 있음
- XML 문서 전체에서 ID 유형의 속성은 여러 개 올 수 있지만 동일한 값을 가질 수는 없음

(4) IDREF / IDREFS 속성 유형
- ID 속성 유형으로 선언된 속성값을 가짐
- 문서내에서 정의된 id 속성 중에 일치하는 속성이 존재해야 한다.
- ID 속성유형을 사용해서 먼저 ID 속성을 정의해야 함
- Default 선언으로 #IMPLIED, #REQUIRED만 사용
- IDREF 속성 유형 : 하나의 속성값만 사용
- IDREFS 속성 유형 : 공백으로 구분되는 복수개의 속성값을 가짐

(5) NMTOKEN / NMTOKENS 속성 유형
- CDATA 속성 유형과 동일하게 임의의 문자 데이터를 속성값으로 가짐
- 해당 문자 데이터는 XML 권고안에 언급된 이름작성 규칙을 따라야 함
- 첫 문자는 글자, 숫자, _, - 등이 자유롭게 사용(첫 문자가 꼭 문자일 필요는 없다.)
- 문자 데이터 사이에는 공백이 오면 안됨
- Default 선언에는 #IMPLIED, #REQUIRED만 가능
- NMTOKEN 속성 : 하나의 속성값을 가짐
- NMTOKES 속성 : 공백으로 구분되는 복수개의 속성값을 가짐


5) 엔티티 선언
- XML 문서를 구성하는 물리적인 저장 단위

종류
- 도큐먼트 엔티티
- 외부 DTD 서브셋 엔티티
- 빌트인 엔티티
- 내부 일반 파스드 엔티티/ 외부 일반 파스드 엔티티
- 외부 일반 언파스드 엔티티
- 내부 파라미터 엔티티/ 외부 파라미터 엔티티

엔티티 용도
- 재 사용성 향상: 매크로와 비슷한 개념

엔티티 선언
물리적 저장 단위
- 내부 (internal) : DTD 내에 존재
- 외부 (external) : 독립적인 파일 형태로 존재

참조되는 곳
- 일반 (general) : XML 문서에서 참조하여 사용
- 파라미터(parameter) : DTD 내에서 참조하여 사용

참조되는 곳
- 파스드(parsed) : XML 파서가 해석할 수 있는 문자 데이터로 구성
- 언파스드(unparsed) : XML 파서가 해석할 수 없는 비문자 데이터(그림, 음악, 동영상 등)로 구성

빌트인 엔티티
- 미리 정의되어 있어, 별도의 엔티티 선언 없이 XML 문서에서 사용 가능
- &lt;   < less-than
- &gt;  > greater-than
- &amp;  & ampersand
- &quot; ″quotation
- &apos; ′apostrophe

(1) 내부 일반 파스드 엔티티
- DTD 문서 내에서 특정 문자 데이터 값으로 선언되기 때문에 물리적 저장 단위인 파일 형태를 가지지 않음
- 한 개의 XML 문서에서 자주 사용되는 긴 문자 데이터를 DTD 문서에서 선언해 두고, XML 문서에서 속성값과 컨텐츠 부분에 해당 엔티티명으로 참조
- 선언 위치: DTD 어디든지 무방
- 일반적으로 텍스트 선언 바로 밑에 선언한다.

(2) 외부 일반 파스드 엔티티
- XML 문서에서 자주 사용되는 엘리먼트들을 XML 문서와 다른 물리적인 저장단위로 저장(ex: file로 저장)
- 여러 XML 문서에서 공통적으로 사용되는 특정 엘리먼트 부분을 선언해 두고, XML 문서에서 엔티티명으로 참조

(3) 내부 파라미터 엔티티
- DTD 내용의 일부가 DTD 문서 내에서 문자열 형태의 값으로 선언
- 한 개의 DTD 문서 내에서 자주 사용되는 부분을 선언해 두고, DTD 문서 내에서는 반복적인 코딩을 하는 대신 해당 엔티티명으로 참조
- 선언위치는 반드시 참조되기 전에 와야한다.
(일반적으로 텍스트 선언 바로 밑에 선언)

(4) 외부 파라미터 엔티티
- DTD 내용의 일부를 DTD 문서와 다른 물리적인 저장 단위로 저장
- 여러 개의 DTD 문서 내에서 공통적으로 사용되는 부분을 선언해 두고, DTD 문서 내에서 엔티티명으로 참조해서 사용


6) 노테이션 선언
- 그림, 동영상, 음악 파일의 포맷을 식별하기 위해서 사용되는 특별한 엘리먼트
- XML 파서가 해석할 수 없는 비문자 데이터의 포맷과 데이터를 처리할 헬퍼 프로그램을 응용 프로그램에게 알려주기 위한 것

NOTATION 속성 유형으로 사용
- 노테이션명을 속성값으로 가지기 위한 선언
- 노테이션명은 미리 선언되어 있다.
<!ATTLIST 엘리먼트명
속성명
NOTATION (노테이션명1|노테이션명2|…)
디폴트선언>

- 외부 일반 언파스드 엔티티의 포맷을 지정할 경우 사용
- 외부 일반 언파스드 엔티티가 어떤 포맷으로 되어 있는 지 DTD 내에 선언하고 이를 속성값으로 사용하고자 할 때 노테이션을 선언한다.
<!ENTITY 엔티티_이름 SYSTEM “URI 경로”
NDATA 노테이션명 >

저작자 표시 비영리 변경 금지
Posted by Cocooning
2011/01/13 12:10


select 문을 이용한 데이터베이스의 자료 조회 및 출력


1. 처리빈에 출력을 위한 메소드를 작성한다
(아래는 LogonDBBean.java 라는 처리빈 파일의 일부 내용)

// 배열에 테이블 저장하는 메소드 showTable()
 public List showTable() throws Exception{
  Connection conn = null;
  PreparedStatement pstmt = null;
  ResultSet rs = null;
  List memberList = null; // 각각의 레코드를 저장할 배열 선언

  try{
    conn=getConnection();
    pstmt = conn.prepareStatement("select * from member2");
    rs=pstmt.executeQuery();

  // if(rs.next()){
    memberList = new ArrayList();

  // 위에서 if문을 사용하게 될 경우 rs.next()로 이미 하나의 레코드를 읽어 온 상태이므로
  // if문 다음에 오는 while문 조건을 rs.next()를 주면 두번째 레코드를 읽어온 다음 조건문이 수행됨
  // 따라서 두번째 레코드부터 배열에 저장하게 되므로 if문 사용 여부에 따라 while문 또는 do while문을 선택하여 사용한다
    
     while(rs.next()){
     //데이터빈 타입 객체변수 member
    LogonDataBean member = new LogonDataBean(); 
     // 한 레코드의 각각의 필드 값을 자바빈 객체에 저장
     member.setMid(rs.getString("mid"));
     member.setName(rs.getString("name"));
     member.setAddr(rs.getString("addr"));
     member.setAge(rs.getInt("age"));
     member.setPhone(rs.getString("phone"));
     // list 객체에 위에서 저장한 자바빈 객체를 저장
     memberList.add(member);
    }
  // }
  }catch(SQLException ex){
    ex.getMessage();
    System.err.println(ex);
    ex.printStackTrace();
  }finally{
   if(pstmt!=null) try{pstmt.close();}catch(SQLException sqle){}
   if(conn!=null) try{conn.close();}catch(SQLException sqle){}
   if(rs!=null) try{rs.close();}catch(SQLException sqle){}
  }
  return memberList;
 }


2. 파일 출력

<%@ page contentType="text/html; charset=euc-kr" %>
<%@ page import = "ch07.LogonDataBean" %>
<%@ page import = "ch07.LogonDBBean" %>
<%@ page import = "java.util.*" %>
<% request.setCharacterEncoding("euc-kr");%>

<html>
<head><title>결과 화면</title></head>
<body>
<center><h2>*** L i s t ***</h2>
<table width=800 border=1>
 <tr>
  <td width=100>사 번</td>
  <td width=100>이 름</td>
  <td width=300>주 소</td>
  <td width=100>나 이</td>
  <td width=200>전화번호</td>
 </tr>
<%
 LogonDBBean output = LogonDBBean.getInstance(); // 처리빈 객체 생성
 List memberList = null;
 memberList = output.showTable(); // 테이블 배열로 받아오기
 for(int i=0; i<memberList.size();i++){ // 배열 크기만큼 for문 실행
 LogonDataBean mem = (LogonDataBean)memberList.get(i);
%>
 <tr>
  <td width=100><%=mem.getMid()%></td>
  <td width=100><%=mem.getName()%></td>
  <td width=300><%=mem.getAddr()%></td>
  <td width=100><%=mem.getAge()%></td>
  <td width=200><%=mem.getPhone()%></td>
 </tr>
<% }%>
</table><br>
<a href="inputForm.jsp">입력</a>
</center>
</body>
</html>

저작자 표시 비영리 변경 금지
Posted by Cocooning
2011/01/12 21:27


XML문서의 구성 요소

1) 엘리먼트
- 모든 xml문서는 단 하나의 루트 엘리먼트를 갖는다
- 엘리먼트는 시작 태그와 끝 태그로 구성되며 태그명은 동일해야 한다
- 엘리먼트는 부가적인 정보를 나타내는 속성(Attribute)를 가질 수 있다
- 시작 태그와 끝 태그 사이에는 엘리먼트의 실질적인 내용이 오는데, 문자데이터 및 자식 엘리먼트가 올 수 있다

2) 이름 작성 규칙
- 첫 글자는 문자(한글 포함)나 ‘_’로 시작
(중간에는 문자, 숫자, 특수문자(‘-’, ‘_’, ‘.’)가능)
- 태그명에는 공백을 포함할 수 없음
- 태그명은 대소문자를 구분
- 태그명은 xml로 시작할 수 없음
- ‘:’ 문자는 쓸 수 있지만 네임스페이스에 관련된 기호이므로 사용하지 않음

1. 엘리먼트의 종류
1) 내용을 가지는 엘리먼트
- 문자데이터나 자식 엘리먼트를 내용으로 갖는 엘리먼트
2)내용이 없는 빈 엘리먼트

속성
- 엘리먼트 내에 정보나 데이터를 표현하기 위한 방법
<시작태그명 {속성명=“속성값”}*>
내용
</끝태그명>

속성 선언시 주의 사항
- 반드시 속성값이 존재(빈 문자열도 가능)
- 속성값은 큰 따옴표(“)나 작은 따옴표(‘)를 사용해서 표현
- 속성명 작성 규칙은 태그명 작성 규칙과 동일한 엘리먼트 내에 같은 이름의 속성이 두 개 이상 올 수 없음
- 여러 개의 속성을 표현할 때에는 콤마(,)가 아닌 빈칸으로 구분

2. 엘리먼트 내용
- 문자 데이터 (Character Data)
- 자식 엘리먼트 (Child Element)
- 엔티티 참조 (Entity Reference)
- 문자 참조 (Character Reference)
- CDATA 섹션 (Character Data Section)
- 프로세싱 지시자 (Processing Instruction)
- 주석 (Comment)
- 공백 문자열 (White Space)

1) 문자 데이터
- XML 선언 : <?xml version=“1.0” encoding=“euc-kr”?>
- 문서 유형 선언 : <!DOCTYPE booklist SYSTEM “bml.dtd”>
- 프로세싱 지시자 : <?xml-stylesheet type=“text/xsl” href=“bml.xsl”?>
- 주석 : <!-- 주석내용 -->
- 시작 태그 및 끝 태그 : <book></book>
- 빈 엘리먼트 태그 : <book/>
- 엔티티 참조 : DTD에 정의되어 있는 엔티티 참조 (예: &pub1;)
- 문자 참조 : &#10진수; &#x16진수;
- CDATA 섹션 : <![CDATA[ 문자데이터 ]]>
- 최상위공백문자열 : XM문서 구성 요소 중 루트 엘리먼트 외부에 있는 공백 문자열

2) 엔티티 참조
- 문자 데이터 내에는 ‘&’ 문자와‘<‘ 문자를 사용할 수 없음
(& :엔티티 참조의 시작, < : 엘리먼트 태그)
- 빌트인 엔티티 참조 또는 문자 참조로 사용 가능
- 자주 쓰이는 내용을 엔티티로 정의하고, XML 문서에서 엔티티로 정의된 내용과 동일한 내용이 작성되어야 할부분에 엔티티 참조를 사용

- & : &amp;
- < : &lt;
- > : &gt;
-“ : &quot;
-‘ : &apos;

3) CDATA 섹션
- XML 프로세서가 해석하지 않고 바로 응용 프로그램에게 전달
- CDATA 섹션 내의 문자나 기호는 태그 형식이나 코드로 인식하지 않고 그대로 문자 형식으로 취급
- 특수 문자가 많은 경우에 유용
<![CDATA[여기에 내용을 적으세요]]>

사용 시 주의 사항
- ‘<![CDATA[’ 사이나 ‘]]>’ 사이에 공백을 쓸 수 없음
- CDATA 섹션 안에 CDATA 섹션을 포함하지 않음
- 키워드 CDATA는 반드시 대문자를 사용
- CDATA 섹션은 엘리먼트 내용 내의 문자 데이터 어디에나 삽입 가능(단, 태그 내에서는 사용 불가)

4) 프로세싱 지시자
- XML 문서를 처리하는 응용 프로그램에게 XML 문서의 처리 방법을 지시하는 내용을 담고 있다
- XML 문서의 어디든지 삽입 가능
<?타켓이름 지시자?>
<?xml-stylesheet type=“text/css” href=“xml_style.css”?>
<?xml-stylesheet type=“text/xsl” href=“xml_style.xsl”?>

5) 주석
<!-- 문서 시작 -->
<?xml version=‘1.0’ encoding=“euc-kr”?>
<!-- 루트 -- 엘리먼트 -->
<booklist>
<book <! 책 정보 >>
<!-- 주석 내용 -->
<!-- -->>
<title><!-- 할 수 있다 --> XML 정복
</title>
<author>홍길동</author>
<!--
<publisher>컴북 출판사</publisher>
-->
</book>
</booklist>

6) 공백 문자열
- 하나 이상의 공백 문자들로 구성
- 스페이스, 탭, 캐리지 리턴, 라인 피드
- 하나의 공백 문자로 취급


저작자 표시 비영리 변경 금지
Posted by Cocooning
2011/01/12 20:11


1) Pooling 기법
- 데이터베이스에 연결하기위한 Connection은 객체
- 객체는 새롭게 만들어질 때 많은 시스템자원과 시간이 요구된다
- 데이터베이스에 한 번 연결하기 위한 작업이 매번 새로운 데이터베이스 연결에 대한 요청이 들어올 때 마다 수행해야 한다면 많은 부담이 있다
- 많은 비용이 드는 데이터베이스 연결 객체를 매번 사용해제하지 않고 처음 만들어 둔 여러개의 데이터베이스 객체를 계속 사용하자는 개념

2) 자카르타 DBCP API
- 톰캣에서 제공하는 프로그램
(1) 순서
① 자카르타 DBCP API 관련 JAR파일 설치
② DBCP 관한 정보 설정 -server.xml
③ JNDI 리소스 사용설정 - web.xml(root폴더 안에 있음)
④ jsp 페이지에서 커넥션 풀 사용

(2) 설치
① http://archive.apache.org/dist/commons/에서
collections
dbcp
pool
위 세가지를 선택하여 다음과 같은 파일3개를 다운로드 후 압축을 푼다
collections-current.zip
commons-dbcp-current.zip
commons-pool-current.zip

② 압축 푼 폴더에 있는 다음 파일 3개를 복사하여 study\WEB-INF\lib폴더와 톰캣홈\lib 폴더에 복사
commons-collections-3.2.1.jar
commons-dbcp-1.2.2.jar
commons-pool-1.4.jar

③ DBCP에 관한 정보 설정(conf\server.xml)
* 굵게 표시된 부분은 개인 사용자 환경에 맞도록 수정하여 저장한다
<GlobalNamingResources>
             <Resource name="jdbc/myoracle" auth="Container"
              type="javax.sql.DataSource" driverClassName="oracle.jdbc.OracleDriver"
             url="jdbc:oracle:thin:@127.0.0.1:1521:orcl"
              username="kara" password="hara"
              maxActive="20"
       <!-- 동시에 풀로 할당될 수 있는 컨넥션 수-->
              maxIdle="10"
       <!-- 휴식기간에 남겨 두는 컨넥션 수 -->
              maxWait="-1"
       <!-- 풀에 이용할 수 있는 컨넥션이 없을 때 연결될 컨넥션을 기다리는 시간 -->
              removeAbandoned="true"
       <!-- 버려진 컨넥션을 제거가 가능하게 함-->
              removeAbandonedTimeout="60"
       <!-- 버려진 것으로 간주되어 제거되는 시간 (기본값 300초)-->
              logAbandoned="true"/>
       <!-- 로그에 기록이 되도록-->
            
          </GlobalNamingResources>

    하단 부분에 추가
      <Context path="/study" docBase="D:\apache-tomcat-6.0.29\webapps\study"  crossContext="true">
         <Resource name="jdbc/myoracle" auth="Container"
              type="javax.sql.DataSource" driverClassName="oracle.jdbc.OracleDriver"
              url="jdbc:oracle:thin:@127.0.0.1:1521:orcl"
              username="kara" password="hara" maxActive="20" maxIdle="10"
              maxWait="-1"
              removeAbandoned="true"
              removeAbandonedTimeout="60"
              logAbandoned="true"/>
      </Context>

④ ROOT 폴더 내의 web.xml파일을 복사하여 study\WEB-INF에 붙여넣기
⑤ study\WEB-INF폴더에 있는 web.xml파일을 열고 <web-app></web-app>사이에 추가
 <resource-ref>
 <description>Oracle Datasource example</description>
 <res-ref-name>jdbc/myoracle</res-ref-name>
 <res-type>javax.sql.DataSource</res-type>
 <res-auth>Container</res-auth>
</resource-ref>

3) 컨넥션 풀 테스트 프로그램(usePool.jsp)
<%@ page contentType="text/html; charset=euc-kr" %>
<%@ page import = "java.sql.*, javax.sql.*, javax.naming.*" %>

<html>
<head><title>DBCP를 사용한 테이블의 레코드를 화면에 표시하는 예제</title></head>
<body>
<h3>DBCP를 사용한 member1 테이블의 레코드를 화면에 표시하는 예제</h3>
<table widht=550 border=1>
 <tr>
  <td width=100>아이디</td>
  <td width=100>패스워드</td>
  <td width=100>이름</td>
  <td width=250>가입일자</td>
 </tr>
<%
 Connection conn=null;
 PreparedStatement pstmt=null;
 ResultSet rs=null;

 try{
 Context initCtx = new InitialContext();
 Context envCtx = (Context) initCtx.lookup("java:comp/env");
 DataSource ds = (DataSource)envCtx.lookup("jdbc/myoracle");
 conn = ds.getConnection();

 String sql="select * from member1";
 pstmt= conn.prepareStatement(sql);
 rs = pstmt.executeQuery();

 while(rs.next()){
 String id=rs.getString("id");
 String passwd= rs.getString("passwd");
 String name = rs.getString("name");
 Timestamp register= rs.getTimestamp("reg_date");

 %>
 <tr>
  <td width=100><%=id%></td>
  <td width=100><%=passwd%></td>
  <td width=100><%=name%></td>
  <td width=250><%=register.toString()%></td>
 </tr>
 <%
 }
 }catch(Exception e){
 e.printStackTrace();
 }finally{
 if(rs!=null) try{rs.close();}catch(SQLException sqle){}
 if(pstmt!=null) try{pstmt.close();}catch(SQLException sqle){}
 if(conn!=null) try{conn.close();}catch(SQLException sqle){}
 }
%>
</table>
</body>
</html>

4) 커넥션 풀과 자바빈을 사용한 회원관리 예제
① 테이블 작성
create table member(
id varchar2(12),
passwd varchar2(12),
name varchar2(20),
jumin1 varchar2(6),
jumin2 varchar2(7),
email varchar2(30),
blog varchar(50),
reg_date timestamp
);

② 자바빈 작성(LogonDataBean.java)
package ch06;
import java.sql.Timestamp;

public class LogonDataBean{
 private String id;
 private String passwd;
 private String name;
 private String jumin1;
 private String jumin2;
 private String email;
 private String blog;
 private Timestamp reg_date;

 public void setId(String id){
  this.id=id;
 }
 public void setPasswd(String passwd){
  this.passwd=passwd;
 }
 public void setName(String name){
  this.name=name;
 }
 public void setJumin1(String jumin1){
  this.jumin1=jumin1;
 }
 public void setJumin2(String jumin2){
  this.jumin2=jumin2;
 }
 public void setEmail(String email){
  this.email=email;
 }
 public void setBlog(String blog){
  this.blog=blog;
 }
 public void setReg_date(Timestamp reg_date){
  this.reg_date=reg_date;
 }

 public String getId(){
  return id;
 }
 public String getPasswd(){
  return passwd;
 }
 public String getName(){
  return name;
 }
 public String getJumin1(){
  return jumin1;
 }
 public String getJumin2(){
  return jumin2;
 }
 public String getEmail(){
  return email;
 }
 public String getBlog(){
  return blog;
 }
 public Timestamp getReg_date(){
  return reg_date;
 }
}

③ DB처리빈(LogonDBBean.java)
package ch06;

import java.sql.*;
import javax.sql.*;
import javax.naming.*;

public class LogonDBBean{
 private static LogonDBBean instance = new LogonDBBean();
// instance 객체변수는 접근제어자가 private으로 클래스내에서만 사용하며 static으로 한번만 만듬

 public static LogonDBBean getInstance(){
  return instance;
 }//위에서 만든 객체를 이용하기 위한 리턴타입 LogonDBBean인 static(정적) 메소드

 private LogonDBBean(){
 }//private으로 빈생성자를 선언하여 이를 이용한 객체 생성을 하지 못하게 한다

 private Connection getConnection() throws Exception{
  Context initCtx = new InitialContext();
  Context envCtx = (Context) initCtx.lookup("java:comp/env");
  DataSource ds = (DataSource) envCtx.lookup("jdbc/myoracle");
  return ds.getConnection();
 }

 public void insertMember(LogonDataBean member) throws Exception{
//DB에 데이터 삽입하는 메소드 insertMember()
  Connection conn = null;
  PreparedStatement pstmt = null;
  try{
   conn = getConnection();
   pstmt = conn.prepareStatement("insert into member values(?,?,?,?,?,?,?,?)");
   pstmt.setString(1,member.getId());
   pstmt.setString(2,member.getPasswd());
   pstmt.setString(3,member.getName());
   pstmt.setString(4,member.getJumin1());
   pstmt.setString(5,member.getJumin2());
   pstmt.setString(6,member.getEmail());
   pstmt.setString(7,member.getBlog());
   pstmt.setTimestamp(8,member.getReg_date());
   pstmt.executeUpdate();
  }catch(SQLException ex){
   ex.printStackTrace();
  }finally{
   if(pstmt!=null) try{pstmt.close();}catch(SQLException sqle){}
   if(conn!=null) try{conn.close();}catch(SQLException sqle){}
  }
 }
}

④ 사용자 정보 입력(insertForm.jsp)
<%@ page contentType="text/html; charset=euc-kr" %>
<html>
<head><title>회원가입</title></head>
<body>
<h2>회원가입</h2>
<form method=post action=insertPro.jsp>
아이디 : <input type="text" name="id" maxlength=12><p>
패스워드 : <input type="password" name="passwd" maxlength=12><p>
이름 : <input type="text" name="name" maxlength=10><p>
주민번호 : <input type="text" name="jumin1" maxlength=6>-
     <input type="text" name="jumin2" maxlength=7><p>
E-Mail : <input type="text" name="email" maxlength=30><p>
Blog : <input type="text" name="blog" maxlength=50><p>
<input type="submit" value="보내기">
</form>
</body>
</html>

⑤ 사용자의 정보처리
<%@ page contentType="text/html; charset=euc-kr" %>
<%@ page import = "ch06.LogonDBBean" %>
<%@ page import ="java.sql.Timestamp" %>

<% request.setCharacterEncoding("euc-kr");%>

<jsp:useBean id="member" class="ch06.LogonDataBean">
 <jsp:setProperty name="member" property="*"/>
</jsp:useBean>

<%
 member.setReg_date(new Timestamp(System.currentTimeMillis()));
 LogonDBBean manager = LogonDBBean.getInstance();
 manager.insertMember(member);
%>
<jsp:getProperty name="member" property="name"/>님 회원 가입을 축하드립니다.

5) 트랜잭션 처리
1) commit과 rollback
(1) commit
- 데이터 변경작업(insert,update,delete)을 한 뒤 commit을 실행하면 변경된 데이터들이 데이터 파일에 반영
(2) rollback
- 변경된 데이터들을 변경 전 상태로 되돌리는 역할
2) 예
try{
....
conn.setAutoCommit(false);

pstmt.executeUpdate("update...");
pstmt.executeUpdate("insert...");
pstmt.executeUpdate("delete...");
...
conn.commit();
}catch(SQLException sqle){

 if(conn!=null) try{conn.rollback();} catch(SQLException sqle){}
}
conn.setAutoCommit(true);

저작자 표시 비영리 변경 금지
Posted by Cocooning
2011/01/11 21:23


1. 의미
1)xml의 어원적 뜻
xml(eXtensible Markup Language)은 확장 가능한 마크업 언어이다

2) 마크업 언어
- 문서의 내용을 구체적으로 전달하기 위한 추가적인 정보 표시 언어이다
(예:html의 각종 태그)
- 대표적인 마크업언어 : HTML, XML, SGML

2. HTML과 XML 구성
- html은 어떤 것이 어떤 뜻을 의미하는지 구분하기 어렵다

사용용도
- 데이터 전달용 문서
EDI, 전자상거래
- 프로그램상의 환경설정

3. 용어

1) DTD(Document Type Definition)와 XML Schema
- 문서의 구조를 정의
- 데이터의 공유를 용이하게 하기 위하여 사용
2) XSL(eXtensible Stylesheet Language)
- 문서를 구조화하는 XML문서를 HTML과 같이 익숙한 형태로 표현하게 해주는 기술
3) XSLT(XSL Transformation)
- XML기반의 문서를 HTML이나 WML 또는 XML타입을 가진 영역으로 변환하는 기술
4) XLL(eXtensible Linking Language)
- HTML의 하이퍼링크와 유사한 연결능력을 제시하며 XLink와 XPointer로 구성
5) DOM(Document Object Model)
- XML 문서를 객체 형태로 모델링함으로서 애플리케이션에서 XML문서의 특정 부분의 값을 추출하거나 수정, 삭제, 추가하는 등의 작업이 가능
- 문서 전체를 메모리에 읽어서 처리
6) SAX(Simple API for XML)
- DOM과 마찬가지로 XML을 조작하는 프로그램을 작성할 때 사용
- 문서를 차례로 읽어 가면서 이벤트 방식으로 처리

4. 환경설정
1) Eclipse IDE for Java EE Developers(Windows 32-bit 다운로드)

2) help> install new Software >add버튼 클릭>
name에 임의의 이름 작성>
Location에 다음 주소 입력(http://www.oxygenxml.com/InstData/Editor/Eclipse/site.xml)
>ok버튼 클릭> 리스트에 oXygen XML Editor for Eclipse 3.3/3.4/3.5/3.6 뜨는지 확인하고 체크박스 표시
>next버튼 클릭>license 동의 후 finish> eclipse 재실행

3) open perspective 아이콘 클릭>other 선택>oxygen XML선택후 OK버튼 클릭


5. XML문서의 종류
1) 잘 짜여진(Well-formed XML Document) 문서
- XML 1.0 권고안에 언급되어 있는 문법(Spec)을 잘 지켜서 작성된 문서를 말한다
2) 유효한(Validate) 문서
- 유효한 문서란 잘 짜인 문서이면서, XML로 개발된 특정 마크업 언어에 맞게 작성된 문서를 의미한다
- 즉, DTD나 Schema에서 작성한 규정을 따르는 문서

6. EBNF 표기법
1) EBNF 문법 형태
- XML 1.0 권고안의 공식 문법은 EBNF(Extended Backus-Naur Form) 표기법
2) 패턴 결합
- 표현식은 다음과 같은 패턴과 결합하여 좀더 복잡한 형태를 가질 수 있다.
3) 패턴 설명
- A? : A표현이 올 수도 안 올 수도 있다(옵션).
- A, B : A표현이 먼저 오고 B표현이 나중에 온다(순차).
- A|B : A와 B 표현 중 하나만 와야 한다(선택).
- A-B : A표현이 와야 되지만 B표현과는 일치되지 않아야 한다.
- A+ : A표현이 최소한 한 개 이상이 와야 한다.
- A* : A표현이 안 올 수 있고, 한 개 이상이 와도 된다.

7. XML 문서 구조
<?xml version=“1.0” encoding=“euc-kr” ?>
<!-- 문서 유형 선언-->
<!DOCTYPE booklist SYSTEM “bml.dtd”>
<!-- 프로세싱 지시자-->
<?xml-stylesheet type=“text/xsl” href=“bm.xsl”?>
<booklist>
<book id=“b1” kind=“k2”>
<title>XML 기초서</title>
<author>신민철</author>
<publisher>프리렉</publisher>
</book>
</booklist>

저작자 표시 비영리 변경 금지
Posted by Cocooning
2011/01/11 20:10


1. 드라이버 설정
1) jdbc 드라이버(oracle\db_1\jdbc\lib\ojdbc14.jar)를 톰캣홈\lib 폴더와 톰캣홈\webapps\study\WEB-INF\lib 폴더에 복사

2. 데이터베이스 연결 테스트
1) 예제
<%@ page contentType="text/html; charset=euc-kr"%>
<%@ page import="java.sql.*"%>

<%
 Connection con=null;

 try{
  Class.forName("oracle.jdbc.driver.OracleDriver");
  con=DriverManager.getConnection("jdbc:oracle:thin:@localhost:1521:orcl", "사용자명", "비밀번호");
  out.println("제대로 연결되었습니다.");
 }catch(Exception e){
  e.printStackTrace();
 }
%>

2) 테이블 만들기
create table member1{
id varchar2(12),
passwd varchar2(12),
name varchar2(20),
reg_date date
};

3) 예제: 테이블에 레코드 삽입
(1) 폼(insertTestForm.jsp)

insertTestForm.jsp

(2) 레코드 삽입(insertTest.jsp)

insertTest.jsp

(3) 레코드 출력(selectTest.jsp)

selectTest.jsp

(4) 수정폼(updateTestForm.jsp)

updateTestForm.jsp

(5) 업데이트(updateTest.jsp)

updateTest.jsp

(6) 삭제 폼(deleteTestForm.jsp)

deleteTestForm.jsp

(7) 삭제(deleteTest.jsp)

deleteTest.jsp

저작자 표시 비영리 변경 금지
Posted by Cocooning
2011/01/10 19:32

- 자바의 클래스
- 자바빈의 클래스 선언은 접근제어자 public
  filed(멤버변수)변수는 접근제어자 private로 선언
- 자바빈에서는 멤버변수를 property라고 부른다.
- property는 JSP내용을 DB에 저장하거나 DB에 저장된 내용을 JSP페이지에 나타낼 때 중간 데이터 저장소 역할을 한다.


* EditPlus 컴파일 설정
도구> 사용자도구구성> 추가버튼으로 package compile 만들기> 명령 (javac.exe선택) > 인수부분에 -d . $(FileName) > 디렉토리부분 $(FileDir) > 출력내용캡쳐(체크) > 적용 후 단축버튼 사용 가능

1) 자바빈 클래스 작성
① SimpleBean.java(study\WEB-INF\classes)
package ch04.simpleBean;

public class SimpleBean{
  private Strign message;

  public String getMessage(){
return message;
  }
  public void setMessage(String message){
            this.message=message;
  }
}
② 컴파일
- classes\ch04\simpleBean 디렉토리가 생성되고 class파일이 위치한다

2) jsp:useBean 액션태그
- 자바빈 객체를 생성
<jsp:useBean id="빈 이름" class="클래스 파일이름" scope="범위"/>
① id
- 생성될 자바빈의 객체이름을 기술

② class
- 패키지명을 포함한 자바 클래스의 풀네임을 기술

③ scope
- 자바빈 객체의 유효범위(공유범위)
- page(기본값), request, session, application

예)
<jsp:useBean id="simpleBean" class="ch04.simpleBean.SimpleBean" scope="page"/>

3) <jsp:setProperty> 액션 태그
- 자바빈 객체의 property 값을 저장하기 위해 사용
<jsp:setProperty name="빈 이름" property="프로퍼티이름" value="프로퍼티에 저장할 값"/>

예1) 하나의 property 셋팅
<jsp:useBean id="simpleBean" class="ch04.simpleBean.SimpleBean" scope="page">
       <jsp:setProperty name="simpleBean" property="message"/>
</jsp:useBean>
예2) 모든 property 셋팅
<jsp:useBean id="simpleBean" class="ch04.simpleBean.SimpleBean" scope="page">
       <jsp:setProperty name="simpleBean" property="*"/>
</jsp:useBean>
예3) 사용자 입력폼과 같은 경우
입력폼 : <input type="text" name="id">
자바빈 : <jsp:setProperty name="inDB" property="id"/>
예4) 사용자 입력폼과 다른 경우
입력폼 : <input type="text" name="userid">
자바빈 : <jsp:setProperty name="inDB" property="id" param="userid"/>

4) <jsp:getProperty>
- 저장된 프로퍼티를 가져온다
<jsp:getProperty name="빈 이름" property="프로퍼티 이름"/>
name : 자바빈 객체이름
property : 프로퍼티명 기술

5) 예제
id, password, 이름, 나이 입력받고 유효성 검사하기
(id는 6~12자 까지 입력받기, password 일치 여부 확인하고 나이는 20~39세까지 입력받기)
자바빈 이용하여 결과 출력하기
① Ex.html
<html>
<head>
<script>
function check(frm){
 id = frm.id.value
 passwd1 = frm.passwd1.value
 passwd2 = frm.passwd2.value
 name = frm.name.value
 age = frm.age.value
 if(!isNaN(id)){
  alert("아이디를 입력해 주세요")
  frm.id.value=""
 }else if(id.length<6 || id.length>12){
  alert("아이디는 6~12자리로 입력하세요")
  frm.id.value=""
 }else if(passwd1==""){
  alert("비밀번호를 입력해 주세요")
 }else if(passwd2==""){
  alert("비밀번호를 한번 더 입력해 주세요")
 }else if(passwd2!=passwd1){
  alert("비밀번호가 일치하지 않습니다")
  frm.passwd2.value=""
 }else if(!isNaN(name)){
  alert("이름을 입력해 주세요")
  frm.name.value=""
 }else if(isNaN(age) || age==""){
  alert("나이를 입력해 주세요")
  frm.age.value=""
 }else if(age<20 || age>39){
  alert("20~39세까지 입력 가능합니다")
  frm.age.value=""
 }else{
  frm.submit()
 }
}
</script>
</head>
<body>
<form name="frm" method="post" action="ExBeanOut.jsp">
아 이 디 : <input type="text" name="id"><br>
패스워드 : <input type="password" name="passwd1"><br>
패스워드 : <input type="password" name="passwd2"><br>
이 름 : <input type="text" name="name"><br>
나 이 : <input type="text" name="age"><br>
<input type="button" value="전송" onclick="check(this.form)">&nbsp;&nbsp;&nbsp;
<input type="reset" value="취소"><br>
</form>
</body>
</html>

② ExBean.java
package ch05;
public class ExBean {
 private String id;
 private String passwd1;
 private String name;
 private int age;
 public ExBean(){
 }
 public void setId(String id){
  this.id = id;
 }
 public void setPasswd1(String passwd1){
  this.passwd1 = passwd1;
 }
 public void setName(String name){
  this.name = name;
 }
 public void setAge(int age){
  this.age = age;
 }
 public String getId(){
  return id;
 }
 public String getPasswd1(){
  return passwd1;
 }
 public String getName(){
  return name;
 }
 public int getAge(){
  return age;
 }
};

③ ExBeanOut.jsp
<%@ page contentType="text/html;charset=euc-kr"%>
<% request.setCharacterEncoding("euc-kr"); %>
<jsp:useBean id="Exbean" class="ch05.ExBean" scope="page"/>
<jsp:setProperty name="Exbean" property="*"/>
<html>
<body>
<h1>결 과</h1><p>
id : <jsp:getProperty name="Exbean" property="id"/><p>
passwd : <jsp:getProperty name="Exbean" property="passwd1"/><p>
name : <jsp:getProperty name="Exbean" property="name"/><p>
age : <jsp:getProperty name="Exbean" property="age"/>
</body>
</html>

실습예제

더보기

저작자 표시 비영리 변경 금지
Posted by Cocooning
2011/01/07 13:55


1. HTML

<meta http-equiv="refresh" content="5;url=main.jsp?id=<%=변수명%>">  : meta 태그이용
http-equiv 는  "refresh"로 하고, content는  "5(정수값-5초후);url=페이지 경로(위의 예제처럼 jsp나 asp 변수를 인자로 사용가능)"

회원 로그인또는 게시물 삭제 같은거 할시 강제로 페이지를 되돌릴 때 사용.

<script>window.alert('비밀번호가 맞지 않습니다');</script>

<meta http-equiv='refresh' content='0;url=test.php>

페이지를 되돌리는데는 주로 메타 태그를 쓴다.
보이는데로 refresh로 사용하시되 content=0에서 0은 시간을 나타낸다.
0이면 바로이동이다.

그리고 URL은 원하는 페이지 경로이다. 위와 같이 작성하면 비밀번호가 맞지 않습니다~ 라는 경고창이 뜬뒤 확인하면 바로 페이지가 이동한다.


2. javascript 를 이용하는 방법 

<body onload="javascript:window_onload()">
<!-- body에 onload를 이용, 페이지 load 후 스크립트 함수를 호출-->

<script language="javascript">
<!--
function window_onload(){
     setTimeout('go_url()',5000)  // 5초후 go_url() 함수를 호출한다.
}

function go_url(){
         location.href="main.jsp?id=<%=id%>"  // 페이지 이동...
}
-->
</script> 

포인트 : setTimeout() 과 setInterval() 의 차이점
- setTimeout(a,b)은 b초후에 a함수를 실행한다. 1회만 실행한다.
- setInterval(a,b)는 b초마다 a함수를 실행한다. 무한루프가 된다.

javascript 로 페이지를 이동시키는 방법은 여러가지가 있다.
그중에 가장 일반적인 방법은 아마도 location.href = "{페이지URL}" 이 아닌가 싶다.
이 방법 말고도 location.replace("{페이지URL}") 도 가능하다.
그럼 이 두녀석의 차이점은 무엇일까.

replace 하게되면 history에서 사라진다(removed). 브라우져의 뒤로, 앞으로 버튼을 눌러도 그 페이지로는 가지 않는다. history 에서 그 페이지의 정보는 사라지기 때문이다.


location.href="main.jsp?id=<%=id%>"  // 페이지 이동...

<input type="button" onclick="javascript:history.back()" value="뒤로">

<input type="button" onclick="javascript:history.forward()" value="앞으로">
<input type="button" onclick="javascript:history.go(-3)" value="3단계 뒤로">

location.replace("{페이지URL}") // history에서 정보가 사라진다.

-----------------------------------------------------------------------------------

<input type="button" onclick="javascript:history.back()" value="뒤로">

<input type="button" onclick="javascript:history.forward()" value="앞으로">

<input type="button" onclick="javascript:history.go(-3)" value="3단계 뒤로">

<input type="button" onclick="javascript:history.go(0)" value="현제 페이지">

<input type="button" onclick="javascript:history.go(3)" value="3단계 앞으로">

window.location.reload(); 또는,

<a href="javascript:location.reload()">새로고침</a>

저작자 표시 비영리 변경 금지
Posted by Cocooning
2011/01/07 01:24


1. pageModuleMain.jsp
<%@ page language="java" pageEncoding="euc-kr" %>
<H2>템플릿 페이지를 사용한 페이지이 모듈화 예제</H2>
<form method=post action="pageModuleControl.jsp">
제품선택<p>
<input type="radio" name="product" value="a">디지털 카메라<br>
<input type="radio" name="product" value="b">PMP<br>
<input type="submit" value="확인">
</form>

2. pageModuleControl.jsp
<%@ page language="java" pageEncoding="euc-kr" %>
<h2>페이지 흐름제어: pageModuleControl.jsp</h2>
<%
 request.setCharacterEncoding("euc-kr");

 String product=request.getParameter("product");
 String CONTROL=null;
 String CONTENTPAGE=null;
 String PAGETITLE=null;
 if(product.equals("a")){
  CONTROL="dc";
  CONTENTPAGE="dc.jsp";
  PAGETITLE="디지털 카메라";
 }else{
  CONTROL="pmp";
  CONTENTPAGE="pmp.jsp";
  PAGETITLE="PMP";
 }
%>
<jsp:forward page="template.jsp">
 <jsp:param name="CONTROL" value="<%=CONTROL%>"/>
 <jsp:param name="CONTENTPAGE" value="<%=CONTENTPAGE%>"/>
 <jsp:param name="PAGETITLE" value="<%=PAGETITLE%>"/>
</jsp:forward>

3. template.jsp
<%@ page language="java" pageEncoding="euc-kr" %>
<%
 String control=request.getParameter("CONTROL");
 String pageTitle=request.getParameter("PAGETITLE");
 String content=request.getParameter("CONTENTPAGE");
 String left = control+"Left.jsp";
%>
<html>
<head>
<title><%=pageTitle%></title>
</head>
<body>
<table width=500 border=1 cellpadding=2 cellspacing=0>
<tr>
 <td colspan=2>
  <jsp:include page="top2.jsp" flush="false"/>
 </td>
</tr>
<tr>
 <td width=150 valing=top>
  <jsp:include page="<%=left%>" flush="false"/>
 </td>
 <td width=350 valing=top>
  <jsp:include page="<%=content%>" flush="false"/>
 </td>
</tr>
<tr>
 <td colspan=2>
  <jsp:include page="bottom2.jsp" flush="false"/>
 </td>
</tr>
</table>
</body>
</html>

4. dcLeft.jsp
<%@ page language="java" pageEncoding="euc-kr" %>
좌측메뉴:<br>
<a href="">브랜드별</a><br>
<a href="">화소별</a><br>
<a href="">가격대별</a><br>

5. dc.jsp
<%@ page language="java" pageEncoding="euc-kr" %>
디지털카메라에 대한 페이지 입니다.

6. pmpLeft.jsp
<%@ page language="java" pageEncoding="euc-kr" %>
좌측메뉴:<br>
<a href="">브랜드별</a><br>
<a href="">용량별</a><br>
<a href="">가격대별</a><br>

7. pmp.jsp
<%@ page language="java" pageEncoding="euc-kr" %>
PMP에 대한 페이지입니다

8. top2.jsp
<%@ page language="java" pageEncoding="euc-kr" %>
상단 메뉴: 디지털 카메라 | PMP | MP3

9. bottom2.jsp
<%@ page language="java" pageEncoding="euc-kr" %>
하단메뉴: 찾아오시는 길 | 개인보호 정책 | 도움말 | 약관<br>
<font sizse=2>본 웹 사이트는 이메일주소가 무단으로 수집되는 것을 거부합니다.</font>

저작자 표시 비영리 변경 금지
Posted by Cocooning
2011/01/06 01:03


액션 태그

1) 종류
include, forward, plug-inm useBean, setProperty, getProperty

2) 단독 태그의 경우도 반드시 종료태그를 포함한다

사용법 예제
<jsp:include page="a.jsp" flush="false">
 <jsp:param name="paramName" value="value1"/>
</jsp:include>

1. include 액션 태그
- 다른 페이지를 현재 페이지에 포함할 수 있음
- include 디렉티브 : 단순히 소스의 내용이 포함(<%@ include file="top.jsp"%>)
 ->코드를 포함한 다음 컴파일 된다
  include 액션태그 : 제어가 옮겨져 처리결과를 포함

1) 사용법
<jsp:include page="포함될 페이지" flush="false">

String content = request.getParameter("filename");
<jsp:include page="<%=content%>" flush="false"/>
-> page에서 지정된 문서로 넘어가서 처리한 후 얻은 출력결과를 포함시켜 처리

- flush 속성은 포함될 페이지로 이동할 때 현재 페이지가 지금까지 출력 버퍼에 저장할 결과를 어떻게 처리할 것인가를 결정 -일반적으로 false지정

예제1
<%@ page contentType="text/html;charset=euc-kr"%>
<form method=post action="includeEx2.jsp">
이름 : <input type="text" name="name"><br>
나이 : <input type="text" name="age"><br>
<input type="submit" value="보내기">
</form>

예제1-1
<%@ page contentType="text/html;charset=euc-kr"%>
<%
 request.setCharacterEncoding("euc-kr");
 String name = request.getParameter("name");
%>
이름은 <%=name%>이고
<!-- <%@ include file="includeEx3.jsp"%> -->
<jsp:include page="includeEx3.jsp" flush="false"/>

예제1-2
<%@ page contentType="text/html;charset=euc-kr"%>
<%
 request.setCharacterEncoding("euc-kr");
 String age = request.getParameter("age");
%>
나이는 <%=age%>입니다

2) <jsp:include> 액션태그에서 포함되는 페이지에 값 전달하기
- 다음과 같은 형태로 사용
<jsp:include page="포함되는 페이지" flush="false">
 <jsp:param name="paramName1" value="var1"/>
 <jsp:param name="paramName2" value="<%=var2%>"/>
</jsp:include>

3) jsp 페이지의 중복 영역 처리(모듈화)
예제1

main.jsp

예제1-1

templateTest.jsp

예제1-2

top1.jsp

예제1-3

left1.jsp

예제1-4

content.jsp

예제1-5

bottom1.jsp

2. forward 액션태그
- 다른 페이지로 프로그램의 제어를 이동할 때 사용
- 출력버퍼에 저장되어있던 내용을 제거하고 지정된 페이지로 이동

1) 사용법
<jsp:forward page="이동할 페이지명"/>
<jsp:forward page="이동할 페이지명"></jsp:forward>
<jsp:forward page='<%=expression + ".jsp"%>' />

예제1
forwardTag1Form.jsp
<%@ page contentType="text/html;charset=euc-kr"%>
<h1>Forward 사용법 예제</h1>
<form method=post action="forwardTagForm1.jsp">
아이디 : <input type="text" name="id"><p>
패스워드 : <input type="password" name="password"><p>
<input type="submit" value="보내기">
</form>

예제1-1
forwardTagForm1.jsp
<%@ page contentType="text/html;charset=euc-kr"%>
<h2>포워딩하는 페이지: forwardTagForm1.jsp</h2>
<%
 request.setCharacterEncoding("euc-kr");
%>
<html>
<body>
forwardTagForm1.jsp의 내용 입니다<br>
화면이 바로 다음 문서로 이동합니다.
<jsp:forward page="forwardTagTo1.jsp"/>
</body>
</html>

예제1-3
forwardTagTo1.jsp
<%@ page contentType="text/html;charset=euc-kr"%>
<h2>포워딩되는 페이지: forwardTagTo1.jsp</h2>
<%
 String id=request.getParameter("id");
 String password = request.getParameter("password");
%>
<b><%=id%></b>님의<p>
패스워드는 <b><%=password%></b>입니다.

2) <jsp:forward> 값 전달하기
<jsp:forward page="이동할 페이지명" flush="false">
 <jsp:param name="paramName1" value="var1"/>
 <jsp:param name="paramName2" value="<%=var2%>"/>
</jsp:forward>

예제1
forwardTag2Form2.jsp
<%@ page contentType="text/html;charset=euc-kr"%>
<h1>포워딩될 페이지에 파라미터값 전달하기 예제</h1>
<form method=post action="forwardTagForm2.jsp">
혈액형별로 성격 테스트<p>
당신의 혈액형은?<p>
<input type="radio" name="bloodType" value="a">A형<br>
<input type="radio" name="bloodType" value="b">B형<br>
<input type="radio" name="bloodType" value="o">O형<br>
<input type="radio" name="bloodType" value="ab">AB형<br>
<input type="submit" value="보내기">
</form>

예제1-1
forwardTagForm2.jsp
<%@ page contentType="text/html;charset=euc-kr"%>
<h2>포워딩하는 페이지: forwardTagForm2.jsp</h2>
<%
 request.setCharacterEncoding("euc-kr");
 String name = "홍길동";
 String bloodType = request.getParameter("bloodType")+".jsp";
%>
<jsp:forward page="<%=bloodType%>">
 <jsp:param name="name" value="<%=name%>"/>
</jsp:forward>

예제1-2
a.jsp
<%@ page contentType="text/html;charset=euc-kr"%>
<h2>포워딩되는 페이지</h2>
<%
 String name = request.getParameter("name");
 String bloodType = request.getParameter("bloodType");
%>
<b><%=name%></b>님의 혈액형은
<b><%=bloodType%></b>형이고 성실하고 신중하며 완벽주의자입니다.

예제1-3
b.jsp
<%@ page contentType="text/html;charset=euc-kr"%>
<h2>포워딩되는 페이지</h2>
<%
 String name = request.getParameter("name");
 String bloodType = request.getParameter("bloodType");
%>
<b><%=name%></b>님의 혈액형은
<b><%=bloodType%></b>형이고 규격을 싫어하는 자유인입니다.

예제1-4
ab.jsp
<%@ page contentType="text/html;charset=euc-kr"%>
<h2>포워딩되는 페이지</h2>
<%
 String name = request.getParameter("name");
 String bloodType = request.getParameter("bloodType");
%>
<b><%=name%></b>님의 혈액형은
<b><%=bloodType%></b>형이고 정확한 판단력을 가진 합리주의자입니다.

예제1-5
o.jsp
<%@ page contentType="text/html;charset=euc-kr"%>
<h2>포워딩되는 페이지</h2>
<%
 String name = request.getParameter("name");
 String bloodType = request.getParameter("bloodType");
%>
<b><%=name%></b>님의 혈액형은
<b><%=bloodType%></b>형이고 강한 의지의 소유자입니다.

저작자 표시 비영리 변경 금지
Posted by Cocooning

티스토리 툴바