JSP 요약 정리

2016.09.11 22:56

졸리운_곰 조회 수:1294

경축! 아무것도 안하여 에스천사게임즈가 새로운 모습으로 재오픈 하였습니다.
어린이용이며, 설치가 필요없는 브라우저 게임입니다.
https://s1004games.com

JSP 요약 정리
참고 책:
JSP Bible (출판사:정보문화사)
JSP Prosfessionanl (출판사:가메출판사)
소설같은 JSP
 
 
1장 웹개발의 역사
1.1 정적인 HTML의 한계극복 ⇒ CGI 탄생
1) CGI ⇒ 프로그램 코드안에 HTML코드를 넣는 방식
   - C, C++, Perl등으로 만들어진 별도의 프로그램에 환경변수나 표준 입력등의 방법으로 사용자의 데
이터를 전달하고 프로그램 표준 출력을 그대로 브라우저에 되돌려 주는것
- 라이브러리나 개발툴을 지칭하는 것이 아니고, 웹서버와 별도로 만들어진 프로그램간의 데이터 전달
방식을 일컷는것
- 어떠한 언어로도 구현가능하지만 Perl이 대세이다. 왜냐하면 C, C++ 같은 언어는 컴파일 과정이 필
요하나,Perl은 스크립트 형식으로 작성되어 코딩의 결과를 브러우저를 통해 바로 볼수 있기 때문이
다. (스크립트 형식: HTML에 다른 언어를 집어 넣는 방식)
- 데이터베이스와 연동할려면 해당 DB가 제공하는 해당언어의 라이브러리를 이용하는 방식


2) CGI 문제점
① 작성유지의 한계
• CGI C코드
.........
printf(" <html> <head> <title> CGI문서 </html></head>");
printf(" \n<body>");
printf(" \n" 저의 사이트를 방문해 주셔서 감사합니다. \n");

처럼 CGI는 표준 출력으로 HTML을 만들어야 때문에 작성도 어렵고 다른 사람이 코딩 내용을
봐도 분석하기가 힘들다
② 메커니즘의 한계(과부하)
• OS가 프로그램을 실행하는 단계
프로그램 실행 → 하나의 프로세스
→ PCB는 메모리에 저장, 프로그램 코드중 필요한 부분만 메모리에 적재

※ 프로세스 제어를 위해 OS는 PCB 사용
PCB :프로세스 상태, 프로그램 카운터, CPU 레지스터, 스케줄링 정보, 메모리 정보, I/O 정보
• 즉 1000명이 동시에 카운터 CGI를 요청했다고 하면 1000개의 똑같은 프로세스가 생긴다.
⇒ CPU나 메모리의 많은 자원 소비로 인한 서버 과부하가 생긴다.

1.2 서버측 스크립트 방식 등장

※ HTML 코드 안에 프로그램 코드를 넣는 방식
※ 대표적인 방법 ASP, PHP
 
1) PHP
①장점
• C 코드와 비슷해 보이지만 전혀다른 언어이다. 복잡하지 않고 사용하기가 간편하다.
• 온갖 종류의 데이터 베이스를 제어할수 있는 함수도 제공
• 엔터프라이즈급의 개발에는 적합하지 않지만 빠른 시간에 웹사이트를 뚝딱 만들기에는 적합하다.

②단점
• PHP는 기존언어를 사용하는 것이 아닌 새로운 언어로서 기존의 수많은 라이브러리 소프트웨어와
연공하기가 어렵다. 그래서 모든 해결책은 PHP로 해결해야 한다.
• PHP 구동은 독립적인 애플리케이션의 아닌 웹서버에 모듈로서 포함되어 있어서 PHP의 모든 것은
서버가 소화하느라 서버에 부하가 많다.
• 구동방식: 웹서버에 PHP 문서가 요구되면 PHP 모듈로 제어권이 넘어가고 PHP 문서를 문법적으
로 해석하면서 그결과물을 브라우저로 보낸다. 매번 그 문서가 요구될때마다 해석하면서 그 결과물
을 브라우저로 보낸다.
⇒ 매번 그문서가 요구될때마다 같은 해석 작업을 수행하기 때문에 웹서버 부담 가중
• PHP는 성능 향상을 위해 구문을 최소하느라 객체 지향등의 최신 언어 기법을 구사 할수 없고,
C++나 자바처럼 코드 재사용도 불가능하다.
1.3 자바등장

1) 애플릿
- HTML코드안에 자바의 실행파일인 클래스 파일을 Include 해서 브라우저가 이를 받아서 수행한다.
- 자바소스를 자바 컴파일러로 컴파일하면 바이트 코드가 생성되고 자바 가상 기계(JVM)가 이것을
실행시켜 준다.
- 서버측에서 동적으로 결과를 생성하는 것이 아니라. 브라우저 측에서 자바 바이트 코드가 보내져
브라우저 환경에서 수행된다.
- 애플릿의 성능의 전송속도와 클라이언트의 컴터 성능에 따라 달려있다. 자바 바이트 코드를 클라이언트에 얼마나
빠른 속도로 보내고 이것을 받은 자바 바이트코드를 클라이언트의 JVM에 얼마나 빨리 실행시키는냐에 따라 달려 있다.
 
2) 서블릿과 JSP(자바서버페이지로 서버 스크립트 방식) ⇒ CGI 방식
- CGI 처럼 별도의 프로그램으로서 웹서버가 서블릿 요청을 받으면 이를 자바 가상 기계로 넘기고,
자바기계가 이를 실행하여 HTML 문서태그와 텍스트로 이루어진 결과를 돌려보낸다. 그리고 나서
웹서버로 이를 다시 브라우저로 전송하는 것이다.

① 장점
• CGI 요청에 대해 프로세스를 매번 생성하는 것이 아니라 모든 서블릿을 하나의 자바 가상 기계
내에서 수행하기 때문에 새로운 프로세스 생성 부담이 없다.
• 자바가 제공하는 수많은 API를 제한없이 사용가능
(JDBC 사용해서 데이터 베이스를 쉽게 조작 가능 등등)
• 플랫폼에 제한이 없다. 다만 JVM은 있어야 한다.
• JDBC드라이버만 있다면 똑같은 API로 데이터 베이스 조작가능
※ JSP=서블릿
1.4 HTTP 프로토콜의 특징과 한계

※ 발전 단계: IP 기반 → TCP,UDP → TCP/IP 기반 → HTTP

1) HTTP 특징
- 장점
① 텍스트 문서인 HTTP문서를 전송한다.
• HTTP를 간단하게 표현해서 HTML문서를 전송하는 프로토콜이라 설명할수 있다.
② 문서를 보여주는 것은 브라우저이다.
• HTML 문서의 태그를 브라우저가 해석해서 다양한 디자인을 만든다.
• HTTP에서는 서버가 HTML 문서를 전송만하고 , 그것을 해석하고 보여주는 역할은
브러우저가 담당 한다.
③ 다양한 파일 형식을 지원한다.
• 그림, 영상, 음성과 같은 파일은 링크와 같은 태그로 모든 파일 형식을 지원 가능
④ 사용자의 접속을 유지하지 않는다.
• HTTP/1.0 :브라우저가 웹서버에 파일을 요청하면 웹서버는 접속을 시작하고 파일전송이 끝나면 그접속을 해제한다.
• HTTP/1.1 :한번의 접속으로 여러번의 요청을 처리할수 있도록 하였으나 기본적으로 매 요청이
독립적으로 처리되고, 접속이 오래 지속되지 않는다는점
- 단점
① 사용자와 접속이 유지 되지 않는다.
• 예) 은행에서 송금등의 서버스를 제공하려면 어떤 사람이 그런 서비스를 요청했는지를
알아야한다.
• 사용자 인증과 추적에 어려운 문제가 있다.
② 클라이언트가 서버에 요청시만 접속이 시작된다.
• 예) 주식시세를 보여주는 사이트가 있다고 하자. HTTP로 구성되면 매년 클릭이나 요청시에만 현
주식시세를 알수 있다.
-극복방법
① 첫번째 단점 극복 방법 ⇒ 애플릿
② 두 번째 단점 극복 방법 ⇒ 서버 푸시 , 클라이언트 풀
1.5 JSP특징

1) 성능향상
• 서블릿/JSP는 모든 문서가 하나의 프로세스 내에서 스레드 단위로 수행된다.
아무리 많은 서블릿/JSP가 동시에 실행되어도 오직 하나의 JAVA 프로세스 (JVM)만 실행된다.
2) 객체 지향적 특성
• 객체 지향 개념을 다사용할수 있다.
3) 보여주기와 구현하기의 분리
• HTML 코드 ⇒ 보여주기 개념, 웹디자이너 작업영역
• 자바 코드 ⇒ 구현하기 개념, 프로그래머가 담당
• 빈즈와 태그라이브러리를 통해 JSP도 분리가능
4) 컴포넌트 기반의 개발
• 프로그램을 구성 요소로 세분화한 뒤에 구성요소를 독립적으로 개발한후 최종적으로 요소들을 합치는
는 형식을 말한다.
5) 플랫폼 호환성
• 하드웨어나 OS 종류와 상관없이 자바 가상 기계만 갖추어져 있다면 어디서든지 사용가능
• 서블릿/ JSP 구동하기 위해서는 서블릿/JSP 컨터네이가 필요
• J2EE 환경을 위해서는 웹 애플리케이션 서버 필요
6) 자바의 풍부한 API 사용
 
1.6 웹 환경에서 엔터프라이즈급 개발
 
- 엔터프라이즈급 개발 ? 수많은 데이터와 작업이 동시에 여러 사용자로부터 행해지는 매우
큰 규모의 개발을 일컫는다.
- 규모가 큰 시스템에서는 처리해야 할일이 많아서 많은 하드웨어와 소프트웨어를 사용하게 되는데,
이를 분산시스템이라 부르며, 분산시스템내의 개별 객체를 분산객체라고 일컫는다.
- 자바 진영에서는 엔터프라이즈급 개발에서 자바를 사용할수 있도록 분산객체를 지원하면서
효과적으로 자원 관리할수 있는 환경인 J2EE를 고안 하였다. 서버측 컴포넌트 개념을 적용하여
객체 지향적 설계와 구현을 가능하게 하고있다.
 
 
2장 환경구축
 
① 아파치 서버 구축 : 웹서버 ⇒ 웹서비스 담당
② 자바개발 환경(자바컴파일러와 가상기계)
- 컴파일러 + 바이트 코드 실행 : JDK 제공 ⇒ 자바프로그래밍 담당
③ 톰캣 (서블릿/JSP컨테이너) : 자바 웹 에플리케이션 서버 ⇒ 웹서버스와 자바 프로그래밍 중간 역할
- 웹 애플리케이션의 역할? 웹서버를 통해 브라우저로부터 들어오는 요청을 해당 자바 애플리케이션을
통해 처리하고, 그 결과를 다시 웹서버로 넘겨주는 역할
- 톰캣 역할? JSP문서를 JDK가 제공하는 자바 컴파일러로 컴파일하고 그로 인해 생성된 서블릿 코드를
수행하기 위해 JDK가 제공하는 JVM을 동작하게 하는것
 
※ 자바 웹 애플리케이션의 종류
• 서블릿 / JSP 컨테이너 : 서블릿과 JSP만 구동할 때 사용
• EJB 컨테이너 : 서블릿, JSP , EJB 사용할 때
• J2EE 웹애플리케이션 서버 : J2EE 환경의 모든 스팩을 사용할 때
 
 
※ CLASSPATH와 WEB-INF/classes
• CLASSPATH 변수 지정하는 이유는 JAVA가 컴파일 하는 과정에서 이미 만들어 놓은
클래스 파일을 찾기 위해서 지정한다.
• 톰캣의 CLASSPATH는 JDK의 실행에 쓰일 클래스 찾기위해서 지정한다.
TOMCAT 4.1는 setclasspath.bat 파일에 직업 CLASSPATH를 입력해서 지정하는 방법하고
내컴퓨터 환경변수에서 지정하는 방법이 있다.
• CLASSPATH 와 WEB-INF/classes 차이
서블릿/JSP 컨테이너는 import한 클래스 파일을 찾기위해서 CLASSPATH 나
WEB-INF/classes에서 찾는다.
CLASSPATH는 라이브러리 성격으로 변하지 않는다고 생각한다.
서블릿/JSP를 셧다운 시켜야지만 반영한다.
하지만 WEB-INF/classes의 클래스들이 변경되면 바로 이를 반영한다.
 
※ 웹애플리케이션 (톰캣) 기본 파일 구조
 
3장 JSP의 기초
 
3.1 정적 , 동적 문서
 
- 서버측 동적문서 : 서버 시스템에서 HTML형식의 결과물을 생성하여 브라우저에 전송
서블릿, JSP , CGI ,ASP등
 
- 브라우저측 동적문서: 브라우저측 시스템에서 실행하여 결과물을 보여줌
애플릿, 자바스크립트, 플래스등
 
3.2 JSP의 구동방식
 
① 서블릿이란 ? 자바로 작성된 웹서버측 프로그램이다. 단 이를 실행하는 주체는 톰캣처럼
웹서버에 추가적으로 설치된 소프트웨어이다.
• 웹서버에서 서블릿을 요청하면 이를 제어하는 모듈이 자바 가상머신을 실행하고,
그결과를 다시 브라우저로 보낸다.
 
② 서블릿 구동방식
• 아파치는 서블릿 문서 요청을 받으면 톰캣으로 그 제어권을 넘긴다.
톰캣은 요청을 받는 서블릿을 자바 가상기계로 사용하여 실행한후 그 결과를 텍스트 형태로
브라우저에 전송한다.
• 서블릿과 JSP를 처리하는 모듈이나 소프트웨어를 서블릿/JSP 컨테이너 혹은
서블릿/JSP 엔진이라 부른다.
 
3.3 서블릿과 JSP
 
- JSP 문서는 최초 요청시에 서블릿/JSP 컨테이너에 의해 서블릿 코드로
변환되고 실행방법은 똑같다. 즉 JSP는 서블릿을 서버측 스크립트로 구성한 것에 지나지 않는다.
html 코드안에 자바코드를 써 넣는것
- 서블릿과 JSP는 같은 말이라고 할수 있다. 다지 차이는 JSP는 HTML 구문안에 JAVA 코드를 넣는
것이고 서블릿은 JAVA언어로만 구성되어 있고 JAVA 코드안에 HTML 코드가 들어가 있다.
- 즉 JSP 작성된 문서를 톰캣이라는 컴포먼트 엔진이 서블릿 코드로 바꿔주고 이것을 JAVA(JDK)로
컴파일 한다. 그리고 그 결과값으로 순수 HTML문이 생성되고 이것을 웹(브라우저)로 보낸다.
- 무조건 하나의 프로세스가 처리한다 (자바가상머신) 그래서 서버 부하가 적다.
 
 
 
3.4 기본 문법
 
① 스크립팅 요소
- <% .... %> : 스크립틀릿
• 모든 자바코드가 제한없이 사용 가능
• <% ... %>안에 쓴 내용은 서블릿으로 변환 될때 자바의 out.print()
- <%! .... %> : 선언
• 필드나 메소드 등을 선언하는 부분
- <%= ... %> : 익스프레션
• 계산가능하고 , String 클래스로 형 변환이 가능한 내용이 들어간다.
• 메소드등, 코드의 실행결과를 바로 JSP 페이지 출력 결과에 추가할 때 사용
즉 HTML과 JSP 페이지 출력 결과와 합쳐져서 브라우저에 출력
• <%= ... %> 안에 쓴 내용은 서블릿으로 변환될 때
System.out.print( HTML구문 뺀 나머지 ), ⇒ 브라우저체 출력결과 보냄
System.out.write( HTML구문만 가능 )형식으로 변환된다. ⇒ 브라우저에 HTML문 보냄
-예
 
<%@ page contenType = "text/html" ; charset = EUC-KR" %>
<%!
private int sum;
%>
 
<html>
<head> <title> 선언과 기타 예 </title> </head>
<body>
<%!
private void add(int a){
sum +=a;
}
%>
 
<%
sum =0;
for ( int i=1 ; i<=10; i++){
add(i);
%>
1부터 <%=i%> 까지 합은 <%=sum%> 입니다<br>
<%
}
%>
 
</body>
</html>
 
② 디렉티브
- <%@ page %>
- <%@ page 속성1이름=“속성1값”; 속성2이름=“속성2값” ...... %>
 
• cotentType 속성 : JSP페이지 생성하는 문서의 MIME 타입, 글자 인코딩정보
⇒ <%@ page contentType="text/html" ; charset=EUC-KR" %>
jsp페이자가 html 생성지정 한글지원 인코딩
⇒ 기본값 “text/html; charset=ISO-8859-1"
 
※ 한글인코딩
톰캣: ISO_8859_1 사용
텍스트파일 : KSC5601 사용 (KSC5601 = KUC-KR )
 
• import 속성 : 사용하고자 하는 클래스 명시
 
• extends 속성 : 서블릿 코드를 생성할 때 그 서블릿 코드가 상속하는 상위 클래스 명시
⇒ <%@ page extends="wedox.MyJspPage" %>
 
• Session 속성 : True. false 값을 지정할수 있으며 기본값은 true
 
• buffer 속성 : JSP를 실행한 결과를 버퍼링하는 크기를 명시
기본값을 톰캣의 경우 8kb
⇒ <%@ page buffer ="none" %>
<%@ page buffer ="16kb" %>
⇒ 결과를 모았다가 한꺼번에 보내는 경우 단, JSP문서가 생성하는 결과의 크기보다
버파가 커야지만 의미가 있다.
 
• autoFlush 속성 : true, false 값 지정할수 있다. 기본값은 true
true 지정시 버퍼가 꽉 찼을 경우 자동적으로 버퍼의 내용을 결과로 보낸다.
flase 지정시 버퍼가 꽉 찼을 때 에러 코드보낸다.
 
• isThreadSaf 속성 : false 설정시 , 매순간에 한번의 요청만 실행가능 , 기본값은 true
 
• errorPage 속성 : 예외가 발생했을 때 불려지는 문서를 지정
⇒ <%@ page errorPage ="errorMessage.jsp" %>
⇒ Jsp 문서에서 예외 상황이 발생할 경우 지정 문서가 열림
 
• isErrorPage 속성 : true, false 둘중 하나의 값 가짐, 기본값은 false
⇒ true로 설정한다면 이 jsp문서가 일반적인 문서가 아니라 ,
다른 jsp에서 예외가 발생 했을 때 처리해주는 문서라는 의미를 나타냄
 
• info 속성 : jsp 문서의 설명을 임의의 스트링으로 써넣는 것
이값은 jsp 문서내에서 servlet.getServletinfo() 메소드를 통해 얻을수 있다.
 
• language 속성 :기본값 java, 다른값은 아직 의미 없음
 
③ 주석
<%-- ..... --%> ⇒자바 주속 , //..//와 /*..*/ 도 <% %>안에 쓰면 주석처리 기능해줌
<!-- ..... --!> ⇒html 주속
4. JDBC
 
※ java.sql 클래스의 하위 클래스 사용
 
1) JDBC 드라이버 로딩
 
- Class.forName( JDBC 드라이버 이름 ) ; 썬의 JDK 사용시
- DriverManager.registerDriver( new 드라이버이름() ); MS JDK 사용시
 
2) 데이터베이스에 접속하기 (Java.Sql.DriverManager 클래스 사용)
 
- Connection con = DriverManager.getConnection("DB URL", "ID", "password");
- DB URL (데이터베이스 식별) ⇒ JDBC : subprotocal:subname 형태
ex) JDBC:mysql :/host/dbname
 
3) 쿼리문
 
- Statement 클래스 사용시
Statement stmt = con.createStatement();
stmt.executeUpdate(" 쿼리문 “);
- preparedStatement 클래스 사용시
preparedStatement stmt = con.prepareStatement(" 쿼리문 “);
stmt.executeUpdate(); ⇒리턴값은 삭제,업데이트,입력한 행의갯수
 
4) 결과얻기
 
- ResultSet rs = stmt.executeQuery(" 쿼리문 “ ) ⇒ statement 사용시
- ResultSet rs = stmt.executeQuery( ) ⇒ preparedStatement 사용시
- while( rs.next() ){
string id = rs.getSring("id");
}
 
5) JDBC에 사용하는 클래스들
 
Connection 클래스 : 특정 데이터베이스와 접속 시켜주는 역할
• createStatement( String 쿼리문 ): SQL문을 데이터베이스에 보내기위한
statement 오브젝트를 생성
• prepareStatement( String 쿼리문): 파라미터 첨부 SQL문을 데이터베이스에 보내기 위한
prepareStatement 오브젝트 생성
• setAutoCommit( boolearn) ; commit 설정
• rollback() , commit()
 
② Statement 클래스 :데이터베이스 시스템에 SQL문을 던져 주는 역할
 
• executeQuery(String 쿼리문) : SELECT문과 같이 결과가 있는 SQL문을 던질 때 사용
,리턴값 ResultSet 객체
• executeUpdate(String 쿼리문) : INSERT, UPDATE , DELETE 데이터베이스의 내용에
변화가 생기면서 결과값이 없는 경우에 사용 CREATE와
DROP도 사용할 때 사용,리턴값 ResultSet 객체
 
③ Prepared Statement 클래스
 
• Statement 클래스와는 달리 실행할 SQL문을 빠르게 수행하기 위해서 데이터베이스에 의해서
미리 전처리 된다. 즉 SQL문을 미리 컴파일 해두는 방식이다.
• executeQuery() ,excuteUpdate() : Statement 클래스의 메소드와 역할이 같으나 매개변수에
아무것도 안들어간다. 리턴값 ResultSet 객체
• setString(int x , string ) : 지정된 인덱스가 String로 설정된다.
 
④ ResultSet : 데이터베이스의 결과 ( SQL 쿼리 결과)
 
• next() : 커서를 현재의 위치로부터 1행 이동
• getInt(), getString() ..... : 현재 행에 있는 지정된 열의 값 얻는다.
 
⑤ DriverManager : 일련의 JDBC 드라이버를 관리하기 위한 기본적인 서비스
 
• getConnection( string url ) 지정된 데이터베이스의 URL에 접속시도
• 리턴값 : Connection 객체
 
 
6) JDBC 연결 예
<%@ page import="java.sql.*" contentType="text/html;charset=EUC_KR"%>
<%
String DB_URL = "jdbc:microsoft:sqlserver://201.211.90.111;DatabaseName=master";
String DB_USER = "sa";
String DB_PASSWORD = "mun3333";
 
Connection conn;
Statement stmt;
 
try{
Class.forName("com.microsoft.jdbc.sqlserver.SQLServerDriver");
conn = DriverManager.getConnection(DB_URL, DB_USER, DB_PASSWORD);
stmt = conn.createStatement();
ResultSet rs = stmt.executeQuery(" Select id,password,name,job from member");
while (rs.next()){
String id = rs.getString("id");
String password = rs.getString("password");
String name = rs.getString("name");
String job = rs.getString("job");
out.println(id + "\t" + password + "\t" + name + "\t" + job );
 
}
}
catch (Exception e) {
out.println(e);
}
%>
 
7) Commit과 Rollback
- DB작업중 에러가 났을시 그전 작업으로 내용을 돌리리거나 ,
에러 없을 때 계속 작업을 하게 만드는 트랙잭션 작업을 수행하는 역할
 
① 기본적으로 설정된 commit 기능을 꺼놓는다.
con.setAutoCommit(false);
 
② SQL문을 수행한다.
 
③ 문제가 없다면 commit 하고(결과를 DB에 반영) ,
문제가 있다면 rollback 한다(트랙잭션 시작되기 전 상태로 돌림)
 
try{
con.setAutoCommit(false);
..............
con.commit();
 
} catch(SQLException e){
if(con!= null ) con.rollback();
} finally {
if( rs!= null) rs.close()
..............
con.setAutoCommit(true);
}
 
5. 각종 태그
 
 
 
5.1 액션태그
 
- <jsp : include>
- <jsp : forward>
- <jsp : plugin>
- <jsp : param>
 
① <jsp:include> 액션
<jsp:include page="top.jsp" flush ="true" />
 
• 만약 index.jsp 문서에 위와 같은 코딩을 하게되면 , index.jsp 문서의 결과를 생성하면서
<jsp :include> 액션을 만나면 page속성에서 지정한 jsp문서를 동적으로 실행하고,
그 결과를 index.jsp 결과에 포함시키는 일을 한다.
• flush 속성을 true로 지정시 포함할 페이지의 내용을 t kq입하기 이전에 현재 페이지가
지금까지 버퍼에 저장한것을 출력 스트림에 보내기 때문에 다른 페이지로 포워딩 되거나
쿠키나 HTTP 헤더설정이 불가능하다.
• top.jsp?a=b와 같이 ? 뒤에 GET방식으로 데이터를 전달할수 없다.
<jsp:parm>액션으로는 데이터 전달가능
• page 속성 형식
‣ page속성은 포함시키고자 하는 문서의 위치를 명시한다.
‣ 웹애플리케이션의 루트 디렉토리를 기준으로 절대 경로를 쓰거나, 상대경로를 써도된다.
ex) page = "./path/filename.jsp"
page = "/path/to/filename.jsp"
page = "<%= fineName %>"
• <jsp:include> JSP page의 기본객체의 관계
• <jsp:include>와 <%@ include %>의 차이
‣ <jsp:include>는 page지정 문서의 결과를 <jsp:include>를 쓴 jsp문서 결과에 포함시키지만
<%@ include%>은 file 지정문서를 <%@ include %>을 쓴 jsp문서의 소시에 붙여서
한꺼번에 결과 처리를 한다. (즉 소스삽입과 결과 삽입의 차이이다.)
 
 
‣ 장, 단점 비교
 
<%@ include %>
<jsp:include>
장점
-지역변수 공유방법 제공
-출력 버퍼에 제한이 없다
(페이지 포함이후에도 쿠키나 HTTP 헤더
설정 가능)
-포함되는 페이지에 요청을 다시 전송하기
위한 오버헤드가 필요없다
-컴파일 단계가 아닌 실행시에 동적으로 파일을 포함하기 때문에 , jsp 컨테이너는 자동으로 페이지 내용 변경 가능하다.
 
-서블릿으로 변환되어 포함되기 때문에
크기가 작다.
단점
- jsp수정하게 되면 jsp/서블릿컨테이너는 수정날짜를 보고 다시 컴파일 하게 되는데
<%@ include %> 쓸때는 수정날짜를 고칠려면 애로사항이 많다.즉 포함되는 페이지가 변경되더라도 원래페이지가 변경되지 않으면 자동적으로 페이지 내용이 변경되지 않는다.
 
 
 
② <jsp:forward> 액션 <jsp:forward page="forword1.jsp" %>
• 문서의 요청을 다른 문서로 방향 전환 해주는 일을 한다.
• <jsp:include> 처럼 다른 문서로 데이터 전달을 못한다. 단 <jsp:param> 통해서는 가능
• 포워딩은 jsp 컨테이너에서 내부적으로 이루어지며 클라이언트는 다른 페이지로 제어가
이동되었다는 사실을 알지 못한다.
• 기본객체
• <jsp:forward> 액션태그의 주의점
‣ 액션태그 사용하기 이전에 버퍼의 내용을 출력 스트림으로 보내면 예외발생
‣ 액션태그 수행하기 이전에 사용했던 자원을 시스템에 다시 반환 시켜줘야 한다.
Connection 객체를 사용했다면 close()롤 끈어 줘야 한다.
 
③ <jsp:param>액션
• <jsp:include page="param1.jsp" flush="true">
<jsp: param name ="id" value="sehkone" />
<jsp: param name ="name" vluae= "<%=name %>" />
</jsp:include>
 
※ <jsp:include>, <jsp:forward>액션에서의 파라미터 전달 액션을 통해 다른 문서를 동적으로 포함하거나 다른 문서로
요청이 이동될때에는 원래 문서가 GET이나 POST를 통해 전달 받은 파라미터들도 함께 전달된다.
 
5.2 자바빈 태그
 
- <jsp : userBean>
- <jsp : getProperty>
- <jsp : setProperty>
 
1) 자바빈?
• 자바로 만들어진 소프트웨어 컴포넌트 이며, 자바빈 API 규약을 따르는 컴포넌트
• jsp 개발자는 자바객체로서 자바코드를 이용하여 자바빈을 다를수도 있고,
빈 컨테이너를 통해 빈의 프라퍼티를 접근하는 방법 두가지가 있다.
2) 빈의 프라퍼티 ( 상태=데이터 +행동=메소드 )
• 상태의 정보를 관리하거나 기능들을 수행하는 자바빈의 속성을 말한다.
• 자바빈은 프라퍼티라는 속성을 통하여 빈컨테이너에 의해 사용될수 있다.
• 자바빈을 사용하는 jsp 페이지는 자바빈의 프라퍼티를 통해서 필요한 정보를 얻거나 저장
할수 있다.
• jsp 빈 태그의 경우 모든 프리퍼티의 값이 문자형으로 다루어 지나 , jsp 컨테이너에 의해서
자동으로 형변환 된다.
3) 빈 만드는 법
① 빈 만들 때 주의사항
클래스 내의 멤버필드는 소문자로 시작
멤버필드에 값을 set하거나 get하는 메서드는 public
값을 set하는 메서드의 이름은 set+ 대문자로 시작하는 멤버필드이름
값을 get하는 메서드의 이름은 get + 대문자로 시작하는 멤버필드이름
• 생성자는 매개변수가 없어야 한다.
ex)
 
② 빈을 생성하는 두가지 방법
new를 사용하여 생성하는 방법
 
jsp:useBean액션태그를 이용하는 방법
 
③ useBean 활용
• 액션태그와 스크립트렛을 혼용하여 사용할수 있다. 이렇게 혼합해서 사용할 수 있다는 사실은 스크
립트렛에서 사용되는 객체 생성과 객체 값설정과 값얻기의 기법을 그대로 액션태그로 옮겨 놓았다
는 것을 알수 있습니다.
 
 
※ 스크립트에서 빈 컴포넌트 접근은 가능하다.
하지만 jsp 스크립트로 생성된 빈객체를 빈태그로 접근은 불가능하다.
 
4) 자바빈 초기화
• 스크립트렛에서는 다양한 생성자 메소드의 매개변수를 통하여 빈을 초기화 시킬수 있다.
하지만 자바빈 태그에서는 반드시 매개변수가 없는 생성자만을 사용해야 빈을 생성할수 있으므로
생성자메소드의 매개변수를 통해서 빈을 초기화 하는 것이 불가능한다.
이것을 극복하기 위해서 액션태그에는 useBean태그 안에 빈의 초기화를 위한 코드를 삽입해서
초기화를 할수 있는 방법이 있다. 여기에 삽입된 코드는 생성자 메소드 처럼 빈이 최초에 생성될 때
단 한번만 수행된다.
 
• 초기화 테스를 하기 위한 빈 예 : 두개의 생성자를 만들었다.
 
• 스크렙트렛을 이용한 초기화 예
 
• 자바빈 태그를 이용한 초기화 예
‣ <jsp:useBean id=“cs1” class=“chap5.ConScriptletTest”/>빈은 초기화 코드를 사용하지 않
았으므로 매개변수가 없는 생성자 메서드가 실행된다 . 따라서 id와 str은 각각 jabook과 not
로 초기화됩니다.
‣ jsp:useBean id=“cs2” class=“chap5.ConScriptletTest”>빈은
<jsp:setProperty name=“cs2” property= “*” /> 이라는 초기화 코드 사용해서 클라이언트
로부터 전달된 actionTag와 JSP를 사용하여 id와 str을 초기화하였습니다. 클라이언트의 매개
변수가 없는 생성자메서드의 초기화 코드와 jsp:useBean태그 내에서 사용한 초기화 값이 서
로 상충하게 되는데 이럴 경우에는 생성자메서드 내의 값으로 초기화하지 않고 useBean태그
내에서 사용한 값으로 초기화를 시켜줍니다.
jsp:setProperty의 property에 ‘*’을 사용하면 클라이언트로부터 전송되어온 데이터의 이름을
검사한 후, 자동으로 빈에 있는 set메서드를 사용하여 값을 설정해줍니다. 만일 일치되는 메
서드가 존재하지 않아도 에러를 발생하지 않습니다.
 
※ jsp:useBean액션태그를 사용한 초기화는 반드시 매개변수가 없는 생성자메서드를 사용한다는
점을 명심하시기 바란다. 만일 위의 ConScriptletTest클래스에서 매개변수가 없는 생성자
메서드가 존재하지 않는다면 jsp:useBean액션태그를 사용할 수 조차 없다.
 
5) 자바빈 태그에 대한 설명
① <jsp:useBean>
• 예) <jsp:useBean id="date" class = meber.RegisterData" scrope="page"/>
‣ 항상 전체 경로를 쓰는 것이좋다
‣ scope 속성의 지정한 범위 안에서만 빈이 참조할수 있다.
‣ 속성값은 반드시 “”로 묶어 줘야한다.
 
② <jsp:setProperty>
• 예) <jsp:setP개perty name ="date" property="id" />
‣ data빈에서 폼필드의 id에 대응하는 set()메소드에 id 폼필드의 값전달
‣ param속성이 생략되었다고 가정하고 파라미터의 이름과 같인 request 객체의 속성을 가져온다.
• 다른형식
‣ <jsp:setProperty name="beanInstanceName" property ="*" />
⇒ 폼의 필드값에 대응되는 빈의 setXXX()메소드를 모두 실행시킨다.
‣ <jsp:setProperty name="beanInstanceName" property = "property name"/>
대응하는 set()메소드 지정 폼 필드의 이름
⇒ 폼의 필드이름과 빈의 setXXX() 메소드 이름이 불일칠 할 때 쓰임
‣ <jsp:setProperty name="beanInstanceName" value="값 " />
‣ <jsp:setProperty name="beanInstanceName" value= <%= 값 %> />
⇒ 해당 setXXX()메소드에 값을 직접 넣음
 
③ <jsp:getProperty>
<jsp:getProperty name="beanInstanceName" property="propertyName" />
 
 
④ 자바빈의 Scope 영역
• page
‣ 빈객체의 수명은 한페이지 내에서만 유지된다.
‣ 요청된 페이지 내에서만 유지되며 , 같은 페이지를 다시 요청하면 새로운
빈객체가 생성된다.
‣ 페이지의 실행 종료와 함께 빈객체 소멸
‣ 한 페이지 내에서만 유효하므로 빈객체는 <jsp:inclue> 태그나 <jsp:forward> 태그로
지정된 페이조차에서도 유효 하지 않는다.
즉 <jsp:include>나 <jsp:forward> 페이지에서는 새로운 빈이 생성된다.
‣ pageContext에 저장
• request 영역
‣ 생성된 빈객체를 request 객체에 저장하거나, request 객체로부터 찾아서 참조한다.
즉 request 객체를 빈의 저장 장소로 사용하는 것이다.
‣ 저장된 객체의 수명은 브라우저의 한번의 요청을 완료할 때까지 이다.
‣ <jsp:forward>나 <jsp:include> 사용용이
• session 영역
‣ 세션이 유지되는 동안에는 같은 세션(같은 사용자)에서 호출되는 모든 페이지에서 빈객체는
소명되지 않느다.
‣ 생성된 객체는 서버의 session 객체에 저장된다.
• application 영역
‣ 생성된 빈객체는 jsp 컨테이너에 의해 소멸되지 않는다.
‣ 생성된 빈객체는 서버의 application 객체에 저장 된다.
 
※ 빈컴포넌트 제거
page ⇒ pagecontext.removeAttribute(String name);
request ⇒ request.removeAttribute(String name);
session ⇒ session.removeAttribute(String name);
application ⇒ application.removeAttribute(String name);
 
※ HttpSessionBindListerner 인터페이스
public void valueBound(HttpSessionBindingEvent event);
⇒ 자바빈 객체가 처음 참조될 때 호출
public void valueUnbound(HttpSessionBindingEvent event);
⇒ 자바빈 객체의 참조가 해재될 때 호출
 
6. 데이터베이스 커넥션 유지
 
- 커넥션 풀을 사용하는 이유는?
클라이언트의 요청이 있을 때 마다 데이터베이스에 연결된 Connection을 생성하고 닫는 것은
일반적인 작업을 처리하는데 비해서 상당히 긴 시간을 필요로 하기 때문에 웹애플리케이션의
전체적인 성능 저하 원인과 서부의 부하가 걸린다.
- 커넥션 풀이란: DriverManager.getConnection()이란 DB랑 연결된것을 끈지 않고 계속사용하는 것이다.
 
1) 첫 번째 해결방안
• Connection 객체를 닫지 않고 유지 시킨다.
• jsp 페이지가 DB에 접속하는 것이 적을 경우 사용
• jspinit() , jspDestory()를 구현한다.
jspinit() ⇒ DB connction 객체생성
jspDesotory() ⇒ Connection 객체 끈기
• 문제점
‣ 데이터베이스 커넥션을 필요로하는 jsp 페이지가 많을 경우 커넥션의 개수는 한개가 있다.
‣ 동기화 문제이다. 하나의 jsp페이지를 동시에 여러 사용자가 요청할 경우
Connection 객체를 여러 쓰레드에서 사용하므로써 데이터가 올바르게 처리 안될수 있다.
synchronized(con){} 동기화 블록을 만들어서 해결할수는 있다.
하지만 synchronized() 사용하므로써 이것을 사용하지 않을 때 비해 수행속도가 늦고,
동기화를 위해서 CPU시간을 더소모하기 때문에 꼭 필요한곳에만 쓴다.
 
※ jspinit() 와 jspDestory() 메소드 설명
① jspinit()
• jsp 페이지를 서블릿 클래스로 변환한후 , 그 서블릿 클래스의 인스턴스를 로딩한다.
이 로딩 과정에서 발생하는 이벤트가 초기화 이벤트이며 이 초기화 이벤트의 처리는 jspinit()
메소드를 통해서 처리
• jspinit() 메소드는 맨 처음 jsp 페이지를 요청할 때 한번말 실행된다.
즉 jsp 페이지를 변환한 서블릿 클래스의 인스턴스를 로딩할 때 한번 실행
② jspDestory()
• 이 메소드는 jsp 페이지의 소멸 이벤트가 발생할 때 호출.
• 소멸 이벤트는 jsp 컨터이너를 셧다운 하거나 jsp 컨테이너가 jsp페이지를 변환한 서블릿 클래스의
인스턴스를 언로딩할 때 발생한다.
 
2) 두번째 해결방안
• 커넥션 풀이라는 방법을 쓴다
• 커넥션 풀을 구현하는 여러 가지 방법
① 데이터베이스 접속을 풀로 관리하는 별도의 클래스 파일을 직접 만들기.
‣ Connection 객체를 닫지 않고 유지함(데이터베이스에 접근하는 Jsp 페이지의 수가 적은 경우 사용)
‣ 데이터베이스 커넥션 풀링
Pooling 기법이랑 미리 데이터 베이스 Connection을 여러개 만들어서 특정 공간에 저장해 놓고,
여러 사용자가 필요할때마다 꺼내서 사용하고 ,사용이 끝난후에는 다시 집어 넣는 방식을 말한다.
DBConnectionPool,DBconnectionPoolMgr 클래스 사용
(1) DBConnectionPool클래스 : 실제 데이터베이스 커넥션 풀을 사용하는 JSP 페이지나 서블릿 클래스가 사용하는 클래스이다.
(2) DBconnectionPoolMgr클래스: DBConnectionPool 객체관리하고 사용자들의 요청에 따라 DBConnectionPool부터
데이터베이스 연결된 Connection 객체를구해
주거나 사용된 Connection 객체를
반환하는 역할을 한다.
② 데이터베이스 접속을 풀로 관리하는 javax.sql.* API를 지원하는 JDBC 2.0 Standard Extension 드라이버 사용
③ J2EE 웹 애플리케이션 서버 사용하기(서버가 직접 지원한다)
 
 
7. JSP 애플리케이션의 구조
 
- 뷰 :사용자로부터 입력을 받아서 컨트롤로에 전달하고 어플리케이션의 결과를 사용자에게 보여주는 역할
- 모델 : DB로부터 데이터를 읽어오고 읽어온 데이터를 사용하여 계산이나 처리와 같은 작업을 수행한다.
데이터를 생성, 저장, 처리만 수행
- 컨트롤러 : 어플리케이션의 흐름을 제어, 뷰와 모델의 중계자 역할
 
 
1) 모델 1 구조
• jsp 페이지에서 모델, 뷰, 컨트롤로의 역할을 모두 다 맡는 구조
• 모델 1구조의 한계 : 유지/보수에 문제가 많다. 흐름제어에 문제가 발생한다.
 
2) 모델 2 구조
• jsp: 뷰의 역할을 한다.
서블릿: 컨트롤러와 모델의 역할을 한다.
자바빈: 서블릿과 jsp 사이에 데이터를 사로 주고 받기 위해서 쓴다.
• 서블릿과 jsp페이지에서 request, session, application의 객체의 속성을 통해서
필요한 저보를 주고 받는다.
public void setAttribute();
public void getAttribute();
전달 인자로는 자바빈도 넣으므로써 데이터도 주고 받고 가능
 
8. 기타
 
1) 브라우저의 캐시 기능 동작하지 않도록하기
- URL 재입엽으로 웹서버에 문서 결과를 요청하면 캐시에 저장된 결과를 보여준다.
이것은 웹서버가 응답할 때 캐시로 사용하고 있기 때문이다.
그래서 응답헤더에 캐시를 사용안함으로 설정해줘야한다.
- jsp문서에 아래 소스만 추가하기만 하면 된다. <%@ include file%> 쓰면된다.
 
<%
if(request.getProtocal().compareTo("HTTP/1.0") == 0 ){
response.setHeader("Pargma", "no-cache");
 
 
}else if ( request.getProtocal().compareTo("HTTP/1.1") == 0){
response.setHeader("Cache-Control", "no-cache");
}else{
response.setHeader("Expires", 0);
 
}
%>
 
 
 
본 웹사이트는 광고를 포함하고 있습니다.
광고 클릭에서 발생하는 수익금은 모두 웹사이트 서버의 유지 및 관리, 그리고 기술 콘텐츠 향상을 위해 쓰여집니다.
번호 제목 글쓴이 날짜 조회 수
26 [bootstrap] spring 프로젝트에 bootstrap 적용 file 졸리운_곰 2017.01.29 164
25 eGov 표준프레임워크(전자정부프레임워크) 공통 컴포넌트 사용법 : Common Component file 졸리운_곰 2017.01.29 1030
24 Passing Javascript object and object list to Spring controller 졸리운_곰 2017.01.23 92
23 뷰에 모델(Model) 전달 file 졸리운_곰 2017.01.22 128
22 CentOS에서 Apache Tomcat 설치하기 졸리운_곰 2017.01.18 490
21 Spring MVC Tiles Plugin with Example file 졸리운_곰 2017.01.15 1384
20 Spring MVC Tiles 3 Integration Tutorial file 졸리운_곰 2017.01.15 173
19 Spring 3 MVC: Tiles Plugin Tutorial with Example in Eclipse file 졸리운_곰 2017.01.15 194
18 MyBatis 에서 한 insert 태그로 여러 Insert문 수행 졸리운_곰 2016.12.09 112
17 Web App Architecture - the Spring MVC - AngularJs stack file 졸리운_곰 2016.11.20 208
16 Introduction to Angular 2 with Spring MVC file 졸리운_곰 2016.11.20 676
15 Migrating a Spring Web MVC application from JSP to AngularJS file 졸리운_곰 2016.11.20 114
14 스프링(Spring) MVC 프레임워크(Model View Controller Framework) file 졸리운_곰 2016.11.16 151
13 JSP 정리 졸리운_곰 2016.09.11 332
» JSP 요약 정리 file 졸리운_곰 2016.09.11 1294
11 전자정부 eGov 프레임워크 모바일 실행환경 Upgrade 가이드 file 졸리운_곰 2016.08.02 327
10 전자정부 eGov 프레임워크 개발프레임워크 개발환경 졸리운_곰 2016.08.02 474
9 표준프레임워크 실행환경 3.5 졸리운_곰 2016.08.02 172
8 전자정부 표준프레임워크 3.5 기반 개발 시작하기(Getting Started) file 졸리운_곰 2016.08.02 291
7 스프링(Spring) MVC 프레임워크(Model View Controller Framework) file 졸리운_곰 2016.07.31 103
대표 김성준 주소 : 경기 용인 분당수지 U타워 등록번호 : 142-07-27414
통신판매업 신고 : 제2012-용인수지-0185호 출판업 신고 : 수지구청 제 123호 개인정보보호최고책임자 : 김성준 sjkim70@stechstar.com
대표전화 : 010-4589-2193 [fax] 02-6280-1294 COPYRIGHT(C) stechstar.com ALL RIGHTS RESERVED