이벤트

1.     이벤트의 종류와 용어

○ 종류

(1)   마우스 이벤트

(2)   키보드 이벤트

(3)   HTML 프레임 이벤트

(4)   HTML 입력 양식 이벤트

(5)   유저 인터페이스 이벤트

(6)   구조 변화 이벤트

(7)   터치 이벤트

 

○ 용어 정리

이벤트를 연결한다” : window 객체의 onload 속성에 함수 자료형을 할당하는 것

window 객체의 load 이벤트

<script>

window.onload = function( ){ };

</script>

load : 이벤트 이름 또는 이벤트 타입

onload : 이벤트 속성

□ 이벤트 리스너 / 이벤트 핸들러 : 이벤트 속성에 할당한 함수

window.onload = function () {

// 변수를 선언합니다.

var header = document.getElementById( 'header');

// 이벤트를 연결합니다.

function whenClickO { alert('CLICK'); }

header.onclick = whenClick;

}

 

■ 이벤트 연결 방법

    DOM Level 0

-      인라인 이벤트 모델

-      기본이벤트 모델

    DOM Level 2

-      마이크로소프트 인터넷 익스플로러 이벤트 모델

-      표준이벤트 모델

 

2.     고전 이벤트 모델

getElementByld ( )와 같은 메서드로 문서 객체를 가져오고 이벤트를 연결

○ 문서 객체에 이벤트 속성에 이벤트 핸들러 대입하면 이벤트 연결

header.onclick = null; 이렇게 속성을 null로 하면 이벤트 제거

window.onload = function () {

// 변수를 선언합니다.

var header = document.getElementById('header');

// 이벤트를 연결합니다.

header.onclick = function () { alert('클릭‘); }

// 이벤트를 제거합니다.

header.onclick = null;

}

 

3.     이벤트 발생 객체와 이벤트 객체

○ 이벤트 발생 객체 찾기

■ 이벤트 리스너 안에서 this 키워드를 사용

document.getElementById('header').onclick = function () {

this.style.color = 'orange';

this, style.backgroundcolor = ‘red'

}

document,getElementById('header').onclick = function (e) {

var event = e II window.event;

}

□ 조건문!

e가 존재하면 e를 변수 event에 집어넣고, e undefined이면 window.event 속성을 변수 event에 넣음

 

4.     이벤트 강제 실행

○ 메서드를 호출하는 것처럼 이벤트 속성을 호출

buttonA.onclick( );같이 이벤트 함수 안에 넣어줌 ㅎㅎ

 

5.     인라인 이벤트 모델

HTML 페이지의 가장 기본적인 이벤트 연결 방법

<body> <h1 onclick="“>Click/h1</body>

<h1 onclick= "var aa=10; alertaa>Click</h1>

○ 태그 안 이벤트 속성에 직접 이벤트를 쓰는 것으로 함수를 정의해 넣어도 됨

이벤트를 호출할 때 매개변수를 넣음!

<script>

function whenClick(e) {alert('클릭,);}

</script>

<body>

<h1 onclick=“whenClick(event)“>Click</h1>

</body>

 

6.     디폴트 이벤트 제거

○ 디폴트 이벤트 : 일부 HTML 태그에 이미 정의된 이벤트 리스너

submit 디폴트 이벤트 제거

window.onload = function () {

// 이벤트를 연결합니다.

document.getElementById('my-form').onsubmit = function ( ) {

// 여기 새로운 이벤트 정의해도 됨

// 실행 안되게 하려면

return false;        }        }

○ 인라인 이벤트 모델 - 디폴트 이벤트 제거

function whenSubmitO {

// 유효성 검사

return false;

}

<form onsubmit= "return whenSubmit()">

 

7.     이벤트 전달

○ 이벤트 전달 : 어떠한 이벤트가 먼저 발생해 어떤 순서로 발생하는지의 순서

○ 이벤트 버블링 방식을 따름

이벤트 버블링 : 자식 노드에서 부모 노드 순으로 이벤트 실행

이벤트 캡쳐링 : 부모 노드에서 자식 노드 순으로 이벤트 실행

○ 이벤트 전달을 막아서 원하는 기능만 실행하도록 하는 것!이 중요

■ 인터넷 익스플로러와 그외 브라우저가 이벤트 전달을 막는 방식이 다름

□인터넷 익스플로러 : 이벤트 객체의 cancelBubble 속성을 true로 변경

□그 이외의 브라우저 : 이벤트 객체의 stopPropagation( ) 메서드를 사용

stopPropagation( ) 메서드가 있으면 사용하고 그렇지 않으면 cancelBubble 속성을 true

event.cancelBubble = true;

if (event.stopPropagation) {

event.stopPropagation();        }

 

8.     인터넷 익스플로러 이벤트 모델

○ 매개변수에 이벤트 속성을 씀

○ 객체에 attachEvent( ) 메서드로 이벤트를 연결

attachEvent(eventProperty, eventListener);

window.attachEvent('onload', function () { });

○ 다중 이벤트 연결 가능, 연결한 순서대로 작동

detachEvent () 메서드 : 이벤트를 제거

detachEvent(eventProperty, eventListener);

var header = document,getElementById( 'my-header');

var handler = function () { alert(‘클릭,); };

header.attachEvent('onclick', handler);

header.detachEvent('onclick', handler);

attachEvent () 메서드는 인터넷 익스플로러에만 있으므로 다른 브라우저에서는 에러 발생

 

9.     표준 이벤트 모델

○ 한 번에 여러 가지의 이벤트 리스너를 추가 & 이벤트 캡쳐링 지원

○ 이벤트 이름을 매개변수로 입력

addEventListener(eventName, handler, useCapture);

useCapture는 입력하지 않으면 자동으로 false를 입력

window.onload = function () {

var header = document.getElementById('my-header');

header.addEventListener('click', function () {    this.innerHTML += ‘+’;

})  }

removeEventListener(eventName, handler);

 

'JavaScript & JQuery' 카테고리의 다른 글

[Javascript][이론]문서 객체 모델  (0) 2020.09.10
[Javascript][이론]브라우저 객체  (0) 2020.09.09

01 문서 객체(document) 모델

● 동적으로 문서 객체 만들기

○ 정적으로 문서 객체 생성 : 페이지가 처음 HTML 페이지에 적혀 있는 태그들을 읽으며 생성하는 것

○ 동적으로 문서 객체 생성 : 자바스크립트로 원래 HTML 페이지에는 없던 문서 객체를 생성하는 것

1)    요소 노드 : HTML 태그

2)    텍스트 노드 : 요소 노드 안에 들어 있는 글자

3)    택스트 노드를 갖는 문서 객체 / 갖지 않는 문서 객체로 구분 가능

 

● 문서 객체 생성

1)    텍스트 노드를 갖는 문서 객체 생성

■ 요소 노드와 텍스트 노드를 생성하고 텍스트 노드를 요소 노드에 붙여 줌

document 객체의 노드 생성 메서드

createElement(tagName) : 요소 노드 생성

createTextNode(text) : 텍스트 노드 생성

window.onload = function () { // 변수 선언

var header = document.createElement('h1’);

var textNode = document.createTextNode('Hello DOM');

}

□ 이 노드들을 서로 연결해 줘야 함

 

appendChild(node) 객체에 노드를 연결

<script>

window.onload = function () {

// 변수 선언

var header = document.createElement('h1');

var textNode = document,createTextNode('Hello DOM');

// 노드 연결

header.appendChiId(textNode);

document.body.appendChild(header);

}

</script>

 

2)    텍스트 노드를 갖지 않는 노드 생성

img 태그

window.onload = function () {

// 변수를 선언하고 속성을 지정!

var img = document,createElement('img');

img.src = 'Penguins.jpg';

img.width = 500;

img.height = 350;

// 노드를 연결합니다.

document.body.appendChild(img);

}

 

□ 객체 속성 메서드 사용해서 지정

data-property 속성은 setAttribute 메서드 사용해야만 함

img.setAttribute(‘src‘, 'Penguins.jpg');

img.setAttribute('width', 500);

img.setAttribute('height’, 350);

img.setAttribute('data-property‘, 350);

 

3)    문서 객체의 innerHTML속성 사용하여 문서 객체 만들기

innerHTML 속성 : 태그의 내부를 의미하는 속성(document 객체 내 모든 태그 가능)

■ 문자열을 선언하고 body 문서 객체의 innerHTML 속성에 넣기만 하면 문서 객체를 생성

■ 복합 대입연산자로 문자열 추가하면 됨

window.onload = function () {

// 변수를 선언합니다.

var output = ‘ ‘

output += ’ul>‘;

output += ' li〉〕avaScript</li

output += ' <li>jQuery</li>'

output += ' <liAjax/li

output += '</ul>'

// innerHTML 속성에 문자열을 할당합니다.

document.body.innerHTML = output;

};

 

● 문서 객체 가져오기

1)    getElementById(id) : 태그 속성이 id인 매개변수와 일치하는 문서 객체 가져옴

■ 한 번에 한 가지 문서 객체만 가져올 수 있음

var headerl = document.getElementById('header-1');

<body>

<h1 id="header-1 ''>Header</h1>

</body>

■ 문서 객체 속성 변화 (innerHTML 메서드로 내부에 넣기)

headerl.innerHTML = 'with getElementByld( )’;

 

2)    getementsByName(name), getElementsByTagName(tagName)

■ 한 번에 여러 개의 문서 객체를 가져옴

getementsByName(name) : 태그 속성이 name인 매개변수와 일치하는 문서 객체를 배열로 가져옴

getElementsByTagName(tagName) : tagName 매개변수와 일치하는 문서 객체를 배열로 가져옴

var headers = document,getElementsByTagName('hi');

headers[i] for 반복문 사용해 인덱스로 접근하면서 접근하면 됨.

for in 반복문은 문서 객체 이외의 속성에도 접근하므로 사용하면 안됨

 

3)    queryselector(선택자), querySelectorAII(선택자)

CSS 선택자로 문서 객체를 선택하는 메서드

queryselector(선택자) : 선택자로 가장 처음 선택되는 문서 객체를 가져옴

querySelectorAII(선택자) : 선택자를 통해 선택되는 문서 객체를 배열로 가져옴

var headerl = document.querySelector(' #header-1');

■ 자바스크립트는 특수기호 ‘-‘를 식별자로 사용 X -> 스타일 속성의 를 없애고 카멜 표기로 바꿔서 사용해야 함

 

● 문서 객체 제거

removeChild(child)

■ 문서 객체의 자식 노드를 제거

var willRemove = document,getElementById(‘will-remove’);

// 문서 객체를 제거합니다.

document. body. removeChild(willRemove);

■ 제거 대상인 태그에서 부모 노드로 이동하고, 부모 노드에서 자식 노드를 삭제함

 

'JavaScript & JQuery' 카테고리의 다른 글

[Javascript][이론]이벤트  (0) 2020.09.10
[Javascript][이론]브라우저 객체  (0) 2020.09.09

브라우저 객체

window, location, navigator, history, screen, document 객체

document : HTML 문서와 관련된 객체

history : 기록과 관련된 객체

location : 주소와 관련된 객체

navigator : 웹 브라우저와 관련된 객체

screen : 화면 전체와 관련된 객체

 

1.     window객체

○ 자바스크립트의 브라우저 기반 최상위 객체

○ 새로운 window 객체 생성

open(URL. name, features, replace} 메서드 : 새로운 window 객체 생성

매개변수 생략 가능

<script>

window.open( );

</script>

<script>

window.open('http//hanbit.co.kr', 'child', ’width=600, height=300‘, true);

</script>

 

■ 매개변수들

URL : 열고자 하는 HTML 페이지의 URL

name : 윈도우 간 통신하는 데 사용하는 윈도우 이름

features : 윈도우를 어떠한 모양으로 출력할지 지정하는 옵션

replace에 사용하는 옵션들

child.document.write('<h1>From Parent Window</h1>'); 이런 식으로 name에 설정한 이름을 가지고 document객체의 write 메서드를 통해 화면 출력 가능!

 

      window 객체의 기본 메서드

     OOBy() 형태의 메서드는 현재 윈도우를 기준으로 상대적으로 속성을 변화하는 메서드

OOTo( ) 형태의 메서드는 절대적인 기준으로 속성을 변화하는 메서드

       

2.     screen 객체

○ 운영체제 화면의 속성을 갖는 객체

screen 객체의 속성

 

■ 브라우저 창으로 화면 꽉 채우기

var child = window.open(’’, ", ‘width=300, height=200');

var width = screen.width;

var height = screen.height;

child,moveTo(0z 0);

child.resizeTo(width, height);

 

3.     location 객체

○ 웹 브라우저의 주소 표시줄과 관련된 객체

■ 페이지를 이동할 때 많이 사용

■ 프로토콜의 종류, 호스트 이름, 문서 위치 등의 정보 가지고 있는 객체

location 객체의 속성

 

○ 메서드

replace()로 리로드 하기

location = location;

location.href = location.href;

location.assign(location);

location.replace(location);

location.reloadO;

 

4.     navigator 객체

○ 웹 페이지를 실행하고 있는 브라우저에 대한 정보를 담은 객체

navigator 객체의 속성

 

5.     window 객체의 onload 이벤트 속성

onload 이벤트 속성

<script>

window.onload = function () {

}

</script>

window 객체의 onload 속성 :

○ 이벤트 속성 : 문서 객체의 속성 중 on으로 시작하는 속성

이벤트 속성은 함수를 할당해야 함

 

6.     모바일 장치 구분

○ 스마트폰을 확인하는 방법 : 서버에서 확인하거나 클라이언트에서 확인

■ 둘 다 userAgent 속성 확인

<script>

var userAgent = navigator.userAgent;

alert(userAgent);

</script>

○ 웹 브라우저의 userAgent 속성에는 브라우저를 구분할 수 있는 고유한 문자열이 있음

■ 그 것을 확인하여 스마트폰인지 아닌지, 스마트폰이라면 어떤 기종인지!

<scnpt>

var smartphones = ['iphone', 'ipod', 'android'];

for (var i in smartPhones) {

if (navigator.userAgent.toLowerCase().match(new RegExp=smartPhones[i]))) {

alert('스마트폰 페이지로 이동합니다’);

location = 'http//ni.hanbit.co.kr';

}           }

</script>

 

window.orientation 속성

■ 모바일 장치에만 있는 속성 -> 모바일 장치의 방향을 나타냄

0 180일 때는 세로 방향. 90 -90일 때는 가로 방향

■ 방향 확인

<script>

if (window.orientation == 0 || window.orientation == 180) {

alert(‘세로 방향입니다.’);

} else if (window.orientation == 90 II window.orientation == -90) {

alert(‘가로 방향입니다.‘);

}

</script>

 

 

'JavaScript & JQuery' 카테고리의 다른 글

[Javascript][이론]이벤트  (0) 2020.09.10
[Javascript][이론]문서 객체 모델  (0) 2020.09.10

09 JSTL

● 커스텀 태그 중 빈번히 사용되는 태그들을 모아둔 라이브러리

1.     JSTL 다운로드 및 설치

○ 먼저 라이브러리 파일을 다운로드 받은 후 설치해야 함

○ 메이븐에서 받아도 됨

JSTL API JSTL Implementation 라이브러리 각각 다운로드

javax.servlet.jsp.jstl-api-1.2.1.jar

javax.servlet.jsp.jstl-1.2. l.jar

■ 다운로드 받은 두 개의 파일을 WEB-INF 폴더 내 lib 폴더에 저장

 

○ 출력

taglib 지시자를 사용 -> prefix 속성으로 접두어 지정 + uri 지정 필요

<%@ taglib prefix="c" uri=”http//java.sun.com/jsp/jstl/core" %>

<cout value="HelloJSTL"/>

table border=’1’>

<cforEach var=”I” begin=”1” end=”5”>

<tr><td><cout value="${1}}"/></td></tr>

</cforEach>

</table>

 

2.     JSTL 라이브러리의 종류

URI 식별자 : JSTL 라이브러리를 구분하기 위해 사용

URI 식별자를 tglib 지시자를 통해 지정한 후 접두어와 연결

 

3.     JSTL 코어 태그 라이브러리 사용

1)    출력 처리

<cout value="출력할 내용" escapeXml=”[true I false] " default="출력할 내용"/

■ 속성들

escapeXml 속성을 true로 지정 -> 출력할 파일 내부의 문자들을 태그로 인식하지 않고 데이터로 바로 출력

out 태그의 value 속성에는 표현식과 EL로 지정 가능

<cout value=u<%=reader%>" escapeXml=”true" default="출력값 없음/

 

2)    예외 처리

catch 태그 : 해당 예외 객체를 catch 태그의 var 속성에 지정한 변수에 할당하고. 이후 해당 변수를 사용

<ccatch var=uexceptionName">

예외발생 가능 코드

</ccatch>

$exceptionName -> <cout value=”$reqParameterEx" />이런 식으로 출력

 

3)    변수 처리

EL 변수로 사용 가능한 값을 지정 가능

(1)   set 태그를 이용한 변수 및 프로퍼티 값 설정

     변수 값 설정

-      <cset var="변수명" value=*변수값 ” scope="영역"/

-      var : 값을 지정할 변수명을 지정

-      value : var 속성에 지정한 변수의 값을 지정하며 표현식, EL, 문자열 데이터로 지정이 가능

-      scope : var 속성에 지정한 변수의 사용 범위를 지정하며 page, request, session, application 지정이 가능. 지정하지 않을 경우 기본값은 page

-      set 태그의 변수를 EL로 사용 가능

-      out 태그의 value 속성으로도 사용 가능

     객체의 프로퍼티 값 설정 가능 (객체 멤버에 접근 가능하다는 것)

-      <cset target="대상객체" property="프로퍼티명" value="프로퍼티값"/>

-      target : 프로퍼티를 지정할 객체를 지정. 표현식 및 EL 변수로 지정 가능

-      property : 설정할 프로퍼티명을 지정. target 속성에 명시된 객체가 자바 빈 객체일 경우 setter 메서드가 존재하는 프로퍼티일 경우 사용 가능

-      value : property 속성에 명시한 프로퍼티의 값을 지정

 

(2)   remove 태그를 이용한 변수 제거

set 태그로 지정한 변수를 제거하기 위해 사용

<cremove var="변수명" scope="영역"/>

var : 제거할 변수명을 지정

scope : 제거할 변수가 포함된 영역을 지정하며 page, request, session, application 지정 가능. 지정하지 않을 경우 丫比에 명시된 모든 변수 제거

변수에 지정된 범위에 따라 제거 영역을 지정

 

4)    흐름 제어 처리

(1)   if 태그

□ 여러 조건을 중첩시킨 if ~ else if ~ else 구문과 같은 방식은 사용 불가능

<cif test=“조건” var=”조건의 결과값을 저장할 EL 변수”>

조건이 참인 경우 수행할 내용

</cif>

test 속성 : 조건을 지정하며 표현식 및 EL 사용 가능

var 속성 : 조건의 결과값이 저장될 EL 변수

<cset var="value" value=”10”/>

<h3>value의 값이 10 이상인지 검사</h3>

<cif test=”${value >= 10}" var=”over10">

<h4>- value : <cout value=”${value}”></h4>

<h4>-value의 값은 10 이상? : <cout value="${over10}"/></h4>

</cif>

 

(2)   choose 태그

□ 자바의 if else if else와 같은 다중 분기 기능을 구현할 수 있는 태그

when 태그와 otherwise 태그를 함께 사용

<cchoose>

<cwhen test="조건1”>

조건1을 만족할 경우 수행될 내용

</cwhen>

<cwhen test="조건2”>

조건2를 만족할 경우 수행될 내용

</cwhen>

<cwhen test="조건N">

조건N을 만족할 경우 수행될 내용

</cwhen>

<cotherwise>

상단 when 태그의 조건에 부합하지 않는 경우 수행될 내용

</cotherwise>

</cchoose>

 

(3)   forEach 태그

□ 배열, Map, 컬렉션 객체들과 같이 여러 값을 저장할 수 있는 요소들을 반복 처리할 때 사용

for while 반복문과 같은 역할

step 속성은 필요치 않을 경우 생략해도 무방

<%

HashMap<String, String> hashMap = new HashMap<String. String>( )

hashMap.put (“name", ”okjsp")

hashMap.put (“web", ”http//www.okjsp.net");

%

<cset var="map" value=”<%=hashMap%>"/>

<cforEach var=”inMap" items=”${map}">

${inMap.key} $ {inMap.value} <br/ >

</cforEach>

 

(4)   forTokens 태그

□ 문자열에 특정 문자를 기준으로 원본 문자열을 부분 문자열로 나누어주기 위한 기능을 제공

<cforTokens var="토큰이 대입될 변수" items="토큰을 포함한 원본 문자열" delims="토큰 문자… </cforTokens>

속성

설명

var

토큰 문자로 분리된 각 문자열 저장 변수 지정

items

토큰으로 지정될 문자를 포함한 원본 문자열 지정

delims

구분 문자로 사용할 문자를 지정, 복수 개의 문자 지정 가능

<cforTokens items=l'010-1234-5678" delims="-" var="tokens”>

${tokens}

</cforTokens>

 

5)    URL 처리

(1)   redirect 태그

response 내장객체 sendReclirect( ) 메서드처럼 태그에 지정한 페이지로의 리다이렉트 제공

JSP 페이지 외의 웹 자원, 다른 웹 서버의 자원도 호출이 가능

<credirect url="호출할 URL" context="컨텍스트 경로”>

<cparam name="파라미터명1" value="1"/>

.

<cparam name="파라미터명N" value="N"/>

</credirect>

 

(2)   import 태그

□ 현재 JSP 페이지에 다른 웹 페이지의 결과를 포함시키는 기능을 수행

JSP 페이지가 아닌 다른 종류의 웹 페이지 및 다른 서버의 웹 페이지도 불러올 수 있다!!!

          <jspinclude> 액션 태그와 유사하나 이런 차이점이 있음

var 속성이 지정되지 않을 경우 읽어온 데이터를 바로 출력

<cimport url="포함할 URL" var="URL 데이터를 저장할 EL 변수명" scope="영역" charEncoding= "문자셋">

<cparam name="파라미터명1" value="1"/>

<cparam name="파라미터명N" value="N"/>

</cimport>

 

(3)   url 태그

URL 전용 set 태그

□ 특정 URL 및 전송 파라미터를 설정한 내용을 변수에 저장하는 용도로 사용

□ 파라미터 지정 가능

<curl var="지정된 URL 내용을 저장하기 위한 변수명" value= “대상 URL" scope=”변수 저장 영역

<cparam name="파라미터명 1" value="1"/>

<cparam name="파라미터명N" value="N"/>

</curl>

 

07 EL

● 개요

○ 간단한 방법으로 데이터의 값을 웹 페이지에 출력할 수 있게 해줌

‘$’ 기호와 ‘{ }’ 괄호 안에 출력되길 원하는 식을 포함하는 형태로 구현

EL식에 사용되는 문자열을 출력용으로 사용하는 것 : \ 사용

○ 역할

■ 특정식을 통한 데이터의 값 출력 및 다른 구성요소에 값을 지정

<%=request.getParameter ("data") %>로 출력한다면

${param.data} 이 것도 같은 역할

■ 전송된 파라미터의 이름을 request 내장객체를 이용하지 않고 바로 호줄하여 사용

 

● 문법

○ 특정 식을 통한 데이터의 출력을 수행하기 위해 사용하는 언어라는 것!

1)    EL식의 데이터 이름

■ 출력을 위한 데이터를 지칭하기 위해 데이터의 이름을 사용

page, request, session, application 내장 객체dp 지정된 데이터들을 의미

■ 동일한 데이터의 이름이 여러 내장객체에 존재할 경우 사용범위 작은 곳부터 우선 해석 됨

一 사용범위 작음 사용범위 넓음 一

page - request - session - application

 

2)    EL의 내장 객체

EL에 정의된 내장객체는 다른 JSP 스크립팅 요소에서는 사용할 수 없음

 

 

EL이용한 JSP 내장 객체 데이터 출력

□ 데이터명을 내장 객체 별 중복여부에 관계 없이 선택하여 출력 가능

$pageScope.ATTRIBUTE / $requestScope.ATTRIBUTE / $sessionScope.ATTRIBUTE / $applicationScope.ATTRIBUTE

□ 중복되는 파라미터 명이 mId 일 때${mId}는 파라미터 scope가 작은 것이 출력되지만

${applicationScope.mId}, ${requestScope.mId” 등으로 범위에 맞게 접근 가능

 

■ 요청 파라미터 데이터 출력

request 내장객체를 사용하지 않고도 요청 파라미터값을 출력 가능

paramValues의 경우 선택되지 않은 인덱스는 에러가 발생하는 것이 아니라 단지 출력되지 않는 식으로 동작함

$ {paramValues.language [2]}

${paramValues.language [3]}

o  initParam식을 사용하여 웹 애플리케이션의 초기화 파라미터를 출력할 수 있음

web.xml

<context-param>

<param-name>initParamName</param-name>

<param-value>initParamValue</param-value>

</context-param>

${initParam.initParaniName}

${initParam["initParamName"]}

이렇게 출력

 

■ 쿠키 정보 출력

${ cookie.COOKIE_NAME.property}

${ cookie.COOKIE _NAME ["property"]}

${ cookie[”COOKIE_NAME"].property}

${ cookie[“COOKIE _NAME”] ["property"] }

 

3)    EL 연산자

■ 연산자 사용 가능

■ 산술 연산자는 데이터의 값이 자동으로 숫자로 형변환 되어 연산 수행

■ 비교 연산자는 숫자, 문자열 데이터 모두 사용 가능

■ 논리 연산자도 자바랑 사용법 동일

■ 삼항 연산자도 사용 가능

■ 엠티 연산자 : 명시된 DATA null 혹은 공백 문자열, 비어있는 콜렉션일 경우 true반환되는 연산자

$empty DATA

■ 연산자 우선순위 있음

[ ] > ( ) > -(단항_, !, not, empty > *, /, div, %, mod > +, - > <, >, <=, >= > ==, != > &&, and > ||, or > ?, :

 

EL을 이용한 자바 메서드 사용

○ 자바 인스턴스 메서드 사용

■ 다양한 형태의 메서드를 리턴 타입과 파라미터의 유무 및 개수에 상관없이 EL을 통해 사용할 수 있음

■ 파라미터 속성명을 사용해 InstanceMethod 클래스 객체의 멤버메서드에 접근

<% InstanceMethod instanceMethod = new InstanceMethod();

request.setAttribute(“usingMethod”, instanceMethod)%>

■ 파라미터 이름에 메서드 명 붙여서 사용 괄호 없음

$usingMethod.setData(10)

 

○ 자바 정적 메서드 사용

JSP 2.1 이하 버전에서는 EL을 이용하여 자바의 정적 메서드(static method)만을 사용할 수 있으며 자바의 정적 메서드를 EL 등록하는 작업이 병행되어야 함

■ 정적 메서드를 EL을 통해 사용하기 위해선 TLD 파일 내에 EL 함수를 등록해주는 절차가 필요

TLD 파일 작성 (TLD_Tag Ubrary Descriptor : 태그 라이브러리 정보 설정을 위해 작성)

<taglib> 태그 : xmlns TLD문법의 식별자와 version 속성에 TLD 문법의 버전 작성

<description> 태그 : 사용할 태그 라이브러리에 대한 간략한 설명

<tlib-version : 태그 라이브러리 버전이 지정

□ 〈short-name〉태그 : 현재 태그 라이브러리명을 지정

□ 〈function〉태그 : 현재 태그 라이브러리에서 호출할 수 있는 함수를 제작하기 위한 태그

□ 〈name〉태그 : 사용될 함수의 이름

□ 〈function-class> : 사용할 정적 메서드가 정의되어 있는 자바 클래스의 풀네임

<function-signature> : 태그에 등록한 정적 메서드의 리턴 타입, 메서드명, 메서드의 입력 파라미터의 데이터 타입

<taglib xmlns='1http//java.sun.com/xml/ns/javaee" version=”2.1”>

<description>EL의 자바 정적 메서드 사용〈/description>

<tlib-version>l.O</tlib-version>

<short-name>ELStaticMethod</short-name>

<function>

<name>useStaticMethod</name>

<function-class>MethodTest.StaticMethod</function-class>

<function-signature>int getData(int)/function-signature

</function>

</taglib>

 

web.xml TLD 파일을 등록 -> 웹 컨테이너에 인식

<taglib> 태그 작성 -> TLD 파일의 식별자를 지정하기 위한 <taglib-uri> 태그와 TLD 파일의 경로명을 지정해주기 위한 <taglib-location> 태그를 작성

web.xml

<jsp-config>

<taglib>

<taglib-uri>/WEB-INF/tlds/static-method.tld</taglib-uri>

<taglib-location>/WEB-INF/tIds/static-method. tld</tagliblocation>

</taglib>

</jsp-config>

</web-app>

 

■ 태그 라이브러리 지시자 지정

<%@ taglib prefix태그라이브러리 구분용 접두어" uri=”TLD 파일의 URI” %>

■ 사용

$ 접두어 : TLD 파일의<function>태그 내 <name> 태그로 지정된 함수명 ( 입력 파라미터 )

 

EL 비활성화

1)    page 지시자를 이용한 비활성화

<%@ page isELIgnored=”true" %>

#[ ] 형식의 EL 구문 실행 막기 : cieferredSyntaxAllowrdAsLiteral 속성값을 true로 지정.

<%@ page deferredSyntaxAllowrdAsLiteral =”true" %>

 

2)    web.xml의 〈jsp-property-group〉태그를 이용한 비활성화

EL을 비활성화할 대상 페이지의 URL 패턴을 지정하는 〈url-pattern〉태그와 <el-ignored> 태그 값을 true로 지정

<jsp-config>

<jsp-property-group>

<url-pattern>/notUsingEL.jsp</url-pattern>

<el-ignored>true</el-ignored>

</jsp-property-group>

</jsp-config>

 

06 데이터베이스 프로그래밍

● 웹 애플리케이션과 데이터베이스(Database)

○ 프로그램이 DBMS를 통해 데이터베이스를 사용하기 위해서는 양측을 연결하는 매개체 역할을 해줄 프로그램인 JDBC(java Database Connectivity)가 필요

JDBC 프로그래밍

1)    JDBC 동작 구조

■ 사용하려는 DBMS에 알맞은 JDBC 드라이버만 있으면 어떤 종류의 DBMS를 사용하더라도 독립적인 데이터베이스 프로그래밍이 가smd

2)    JDBC 드라이버 다운로드 및 설치

■ 이클립스를 사용하지 않는 실제 서버와 같은 환경에서는 JDBC 드라이버를 해당 웹 애플리케이션 디렉터리 내 WEB-INF/lib 디렉터리에 복사하면 사용이 가능

oracle : 기본 오라클을 설치하면 JDBC 파일이 저장되어 있음

내 컴터에 저장된 오라클 폴더를 찾아서 JDBC 파일인 ojdbc.jar를 버전에 맞는 걸로 복사해 lib폴더에 붙여 넣고 프로젝트 참조(build path)에서 Add jar 하면 됨

MYSQL : http://dev.mysql.com/downloads/connector/j/에서 다운로드

mysql-connector-java-gpl-5.1.29.msi 파일을 다운로드 받은 후 설치

C\Program Files (x86)\MySQL\MySQL Connector J\ 디렉터리에 설치된 mysql-connector-java-5.1.29-bin.jar 파일을 이클립스 웹 프로젝트의 Web Content\WEB-INF\lib\ 디렉터리에 복사

 

3)    JDBC 프로그래밍의 작성 순서

 

JDBC 프로그래밍 코드

1)    SQL패키지 임포트

■ 자반/애플리케이션이 데이터베이스에 접근하기 위해서는 사용하는 DBMS에 적합한 JDBC 드라이버를 로딩

Class 클래스의 forName( )메서드 이용

MySQL JDBC 로딩 시 “com.mysql.cj.jdbc.Driver”

■ 오라클 JDBC 로딩 시 "oracle.jdbc.driver.OracleDriver"

JDBC URL 작성 : “protocol : subprotocol : subname”

(1)   “ : ”을 통해 3구간으로 분류

(2)   첫 번째 구간 : 프로토콜. DBMS 종류에 상관없이 jdbd로 입력

(3)   두 번째 구간 : subprotocol. DBMS 종류에 따라 달라짐 (MYSQL일 경우 mysql로 지정)

(4)   세 번째 구간 : subname. 데이터베이스를 지정, 사용할 데이터베이스의 주소와 port를 명시한 후 데이터베이스명을 함께 작성

 

2)    데이터베이스 세션을 얻기

Connection 인스턴스 생성

DriverManger 클래스의 getConnection( ) 메서드를 통해 생성

DriverManager 클래스 : JDBC 드라이버의 관리를 위해 사용하며 JDBC URL을 통해 Connection 인스턴스를 생성

getConnection 메서드

(1)   첫 번째 입력 파라미터 : JDBC URL 입력

(2)   두 번째 세 번째 입력 파라미터 : 데이터베이스 접속을 위한 계정정보

           계정 아이디, 비밀번호 지정

Connection conn = DriverManager.getConnection(“url”, “id”, “password”);

 

3)    SQL문 실행

java.sql 패키지의 Statement 인터페이스 사용

SQL문을 데이터베이스에 전달하고 그 실행 결과를 ResultSet 인터페이스로 전달하는 역할

앞서 생성한 Connection 인스턴스의 createStatement( )메서드를 사용하여 획득

Statement stmt = conn.createStatement()

Statement를 통해 SQL문을 데이터베이스에 전달하는 메서드의 입력 파라미터로 사용될 SQL문은 String 타입으로 입력

 

ResultSet : 실행된 SQL문의 질의 결과를 처리하기 위해 사용(select에서 사용)

ResultSet rs = stmt.executeQuery ("SELECT * FROM STUDENT")

□ 데이터베이스를 조회한 결과를 담은 ResultSet 인스턴스 rs에는 위 SQL문의 결과인 STUDENT 테이블의 데이터가 저장되어 있음

next() 메서드를 통해 하나의 로우 단위로 저장된 데이터 사용이 가능

결과 로우가 더 남아있을 경우 true, 더 이상 반환할 로우기 남아있지 않을 경우 false를 리턴

-> 여러 로우로 반환된 결과를 반복하여 사용하고 싶을 경우 반복문과 함께 사용

while ( rs.next( ) ) {

// ResultSet에 담긴 조회 결과 데이터를 로우 단위로 사용

)

ResultSetnext( )메서드를 통해 전달되는 로우의 데이터들은 자바에서 사용되는 데이터 타입으로 변환과정 필요

getString( ) 메서드 : 괄호 안 숫자를 인덱스로 하여 컬럼을 의미

그 컬럼의 데이터를 String타입으로 변환하여 리턴

 

4)    자원 반환

■ 데이터베이스 관련 작업 수행이 끝나면, 반드시 DriverManger를 통해 획득한 Connection 객체를 종료시켜 사용 중인 자원을 반환

■ 인스턴스를 획득한 순서와 반대로 ResultSet, Statement, Connection 순서로 종료

rs.close( )

stmt.close( )

conn.close( )

 

PreparedStatement 사용

SQL문을 미 리 컴파일하여 사용하므로 Statement 사용하는 거 보다 실행 속도가 빠름

Connection 객체의 prepareStatement( ) 메서드에 실행할 SQL문을 지정하는 방식으로 획득

PreparedStatement pstmt = conn.prepareStatement ( SQL )

SQL문 내에는 위치 표시자라 불리는 물음표 “ ? “ 사용 가능

PreparedStatement pstmt = conn.prepareStatement ( "SELECT * FROM STUDENT

WHERE DEPARTMENT_ID =? AND STUDENT_ID LIKE ?")

pstmt.setString (1, “M001")

pstmt.setstring (2, "2014%”')

setString( ) 메서드 : 문자열 타입의 데이터를 SQL문 물음표에 넣어줌

첫 번째 입력 파라미터 숫자는 SQL문의 순서대로의 물음표를 지칭

 

● 커넥션 풀

DB 연결 효율 높이는 방법

JDBC를 사용한 데이터베이스 연동 시 가장 많은 시간을 필요로 하는 Connection객체를 미리 여러 개 생성해두고, 데이터베이스 관련 작업 수행 시 생성해둔 Connection객체를 빌려준 후 사용이 끝나면 반환 받는 방식

■ 순서

① 웹 애플리케이션 내 데이터베이스 관련 작업이 수행되어야 할 경우 커넥션 풀에서 미리 생성되어 있는 커넥션을 빌려온다.

② 커넥션 풀로부터 받아온 커넥션을 통해 데이터베이스 관련 작업을 수행한다.

③ 데이터베이스 관련 작업 수행이 끝나면 커넥션을 반환한다.

 

JNDI를 이용한 커넥션 풀 사용

JNDl : 애플리케이션 구현 시 필요한 클래스와 파일과 같은 데이터를 명명하고 디렉터리 서비스를 사용하기 위한 API

(1)   커넥션 풀 사용을 위한 설정

□ 톰캣의 server.xml, context.xml, web.xml 파일에 추가로 작성

context.xml 파일의 설정 내용 지정 방식을 사용

□ 〈Resource〉태그 사용

auth 속성 “Container”로 지정 : 데이터베이스 접속 인증을 톰캣 컨테이너가 처리하도록 하기 위함

driverClassName 속성 : 사용할 드라이버명과

url 속성 : 데이터베아스 URL

username, password 속성 : 각각 접속할 데이터베이스 계정 정보를 지정

name 속성 : 이후 Java코드에서 데이터 소스를 가리킬 이름 지정

type 속성 : Java 코드에서 사용할 DataSource 명시

maxActive 속성 : 최대 커넥션 수를 지정(동시 접속 허용 커넥션 수)

maxWait 속성 : 커넥션이 남아있지 않을 경우 ms 단위로 대기할 시간을 지정

 

(2)   커넥션 풀 사용을 위한 유틸 클래스 제작

□ 커넥션풀의 Connection 인스턴스를 제공할 유틸 클래스를 제작

db 패키지 내 ConnectionPool 클래스

getConnection( 메서드는 이미 Connection객체가 생성되어 있는 상태일 경우 해당 Connection 객체를 리턴

Connection 객체가 생성되어 있지 않을 경우 DataSource 객체를 얻기 위해 Initialcontext 객체를 사용

lookup( ) 메서드의 입력 파라미터 "java:comp/env/” -> initContext 인스턴스 얻음

-> 입력 파라미터 : context.xml에 지정했던 "jdbc/mysql”

-> DataSource 객체 생성

->  DataSource객체의 getConnection( )메서드 사용하여 Connection 객체 반환

public static Connection getConnectionO {

if (conn != null) {

return conn

}else(

try(

Context initContext= (Context) new InitialContext( );

lookup(“java:comp/env/")

DataSource ds = (DataSource) initContext.lookup(“jdbc/mysql")

conn = ds.getConnectionO

}catch(Exception e) {

e.printStackTrace ()

return conn

)

 

@Resource 어노테이션을 통한 서블릿 페이지 커넥션 풀 사용

■ 서블릿 페이지의 경우 ConnectionPool 클래스와 같은 유틸 클래스 없이 @Resource 어노테이션을 이용한 커넥션 풀 사용이 가능

context.xml 파일에 설정이 선행

name 속성에는 context.xml 파일에 설정한 name="jdbc/mysql"을 지정

javax.annotation.Resource를 임포트

DataSource 객체의 참조 변수명을 ds로 지정

Connection 인스턴스인 conn ds 인스턴스의 getConnection( )메서드 사용하여 생성

@Resource  name="jdbc/mysql") javax.sql.DataSource ds;

를 서블릿 메서드 위에 해줌 (doGet이나 doPost)

 

'JSP > 이론' 카테고리의 다른 글

[JSP][이론]09 JSTL  (0) 2020.09.07
[JSP][이론]07 EL  (0) 2020.09.07
[JSP][이론]05 JSP 액션 태그  (0) 2020.09.07
[JSP][이론]04 JSP 세션 관리_HTTPSession  (0) 2020.09.05
[JSP][이론]04 JSP 세션 관리_쿠키  (0) 2020.09.05

+ Recent posts