JSP 의기초 JSP & Servlet
2/92 Contents 학습목표 JSP 기술에서는웹애플리케이션을 JSP 페이지형태로구현한다. JSP 페이지를작성하는데필요한여러가지기초지식을학습. 내용 JSP 페이지란? JSP의기초문법 JSP 페이지의내장변수 파일입출력 다른 JSP 페이지호출하기
3/92 1. JSP 페이지란? JSP 기술에서웹애플리케이션을구현할때작성하는코드 HTML 문서의사이에 JSP 문법의코드가삽입되는형태로작성 <%@page contenttype= text/html; charset=euc-kr %> <HTML> <HEAD><TITLE>1 부터 100 까지의합 </TITLE></HEAD> <BODY> <% int total = 0; for (int cnt = 1; cnt <= 100; cnt++) total += cnt; %> 1 부터 100 까지더한값은? <%= total %> </BODY> </HTML> [ 그림 3-1] JSP 페이지의형태 HTML 문서의사이사이에 JSP 문법의코드가삽입됩니다 JSP 페이지에있는 HTML 코드는웹브라우저로그대로전송되지만, JSP 문법 의코드는웹컨테이너쪽에서실행되고그결과만웹브라우저로전송된다.
4/92 1. JSP 페이지란? JSP 페이지실행과정 JSP 페이지 변환 서블릿클래스의소스코드 컴파일 서블릿클래스의클래스파일 인스턴스화 서블릿객체 초기화 서블릿 [ 그림 3-2] JSP 페이지가실행되기까지의과정 웹브라우저로부터 JSP 에대한 URL 로요청이왔을때에실행되는것은서블릿 이다.
5/92 1. JSP 페이지란? JSP 페이지실행과정 JSP 페이지의변환및컴파일은언제발생하는가? JSP 페이지가변경되면다시변환과컴파일이실행됨. JSP 페이지가처음요청되었을때에한번발생한다.
6/92 2. JSP 의기초문법 ( 스크립팅요소, 지시자, 주석 ) JSP 의문법요소 (1) JSP 의문법에는세가지형태가있다. <% 로시작해서 %> 로끝나는형태 ${ 로시작해서 } 로끝나는형태 <jsp:forward> 또는 <C:if> 와같은 XML 태그형태 JSP 문법요소 : 6 가지요소 스크립트릿 (Scriptlet) 표현식 (Expression) 스크립팅요소 선언문 (Declaration) 지시자 (Directive) 표현식언어 (Expression Language) 액션 (Action)
7/92 2. JSP 의기초문법 ( 스크립팅요소, 지시자, 주석 ) JSP 의문법요소 (2) 지시자와스크립팅요소 - <% 와 %> 사이에표현되는요소 지시자 (directive) <%@page contenttype= text/html; charset=euc-kr %> <HTML> <HEAD><TITLE>1 부터 100 까지의합 </TITLE></HEAD> <BODY> <% int total = 0; for (int cnt = 1; cnt <= 100; cnt++) total += cnt; %> 1 부터 100 까지더한값은? <%= total %> </BODY> </HTML> 익스프레션 (expression) 스크립틀릿 (scriptlet) [ 그림 3-3] JSP 의문법 지시자와스크립팅요소
8/92 2. JSP 의기초문법 ( 스크립팅요소, 지시자, 주석 ) JSP 의문법요소 (3) 익스프레션언어 (EL: Expression Language) 자바코드를대신할새로운언어 ${ 로시작해서 } 로끝나고, 그안에데이터이름이나간단한식을쓸수있다. 액션 (Action) XML 태그형태로기술 자바의 if 문, for 문, switch 문에해당하는태그들이있다.
9/92 2. JSP 의기초문법 ( 스크립팅요소, 지시자, 주석 ) JSP 의문법요소 (4) 서블릿클래스 public class HundredServlet extends HttpServlet { public void doget(httpservletrequest request, HttpServletResponse response) throws ServletException, IOException { int total = 0; for (int cnt =1; cnt <= 100; cnt++) total += cnt; request.setattribute( result, total); RequestDispatcher rd = request.getrequestdispatcher( Hundred.jsp ); rd.forward(request, response); } } 복잡한데이터처리로직 JSP 페이지 <%@page contenttype= text/html; charset=euc-kr %> <HTML> <HEAD><TITLE>1 부터 100 까지의합 </TITLE></HEAD> <BODY> 1 부터 100 까지의합은? ${result} </BODY> </HTML> 익스프레션언어 (expression language) [ 그림 3-4] JSP 문법 익스프레션언어
10/92 2. JSP 의기초문법 ( 스크립팅요소, 지시자, 주석 ) JSP 의문법요소 (5) 서블릿클래스 public class WinnersServlet extends HttpServlet { public void doget(httpservletrequest request, HttpServletResponse response) throws ServletException, IOException { int arr[] = new int[5]; Random random = new Random(); for (int cnt =0; cnt < arr.length; cnt++) arr[cnt] = random.nextint(10000000); request.setattribute( ARR, arr); RequestDispatcher rd = request.getrequestdispatcher( Winners.jsp ); rd.forward(request, response); } } 복잡한데이터처리로직 JSP 페이지 <%@page contenttype= text/html; charset=euc-kr %> <%@taglib prefix= c uri= http://java.sun.com/jsp/jstl/core %> <HTML> <HEAD><TITLE> 복권당첨번호 </TITLE></HEAD> <BODY> <c:foreach var= num items= ${ARR} > ${num} <BR> </c:foreach> </BODY> </HTML> 액션 (action)
11/92 2. JSP 의기초문법 ( 스크립팅요소, 지시자, 주석 ) 스크립팅요소의문법 스크립팅요소 (Scripting Elements) 스크립틀릿 (Scriptlet) 익스프레션 (Expression) 선언부 (Declaration)
12/92 2. JSP 의기초문법 ( 스크립팅요소, 지시자, 주석 ) 스크립팅요소의문법 스크립틀릿 (Scriptlet) JSP 페이지내에삽입되는자바코드부분 <% 로시작해서 %> 로끝나고, 그사이자바명령문을작성 <% %> int total = 0; for (int cnt = 1; cnt <= 100; cnt++) total += cnt; 자바명령문들 자바명령문은웹브라우저로전송되는것이아니라웹서버쪽에실행된다.
13/92 2. JSP 의기초문법 ( 스크립팅요소, 지시자, 주석 ) 스크립팅요소의문법 표현식 (Expression) <%= 로시작해서 %> 로끝나고그사이에자바표현식이들어갈수있다. 표현식은상수나변수이름하나로구성될수도있고, 연산식을포함할수도있으며, 반환값이있는메서드호출식이될수도있다. <%= total %> <%= total + 101 %> <%= Math.sqrt(num) %> 자바식자바식자바식 표현식은웹서버쪽에서실행되고그결과만웹브라우저로전송된다.
2. JSP 의기초문법 ( 스크립팅요소, 지시자, 주석 ) 스크립팅요소의문법 JSP 페이지의코드 <HTML> <HEAD><TITLE>1 부터 100 까지의합 </TITLE></HEAD> <BODY> <% int total = 0; for (int cnt = 1; cnt <= 100; cnt++) total += cnt; %> 1 부터 100 까지더한값은? <%= total %> </BODY> </HTML> 서블릿클래스의코드 out.println( <HTML> ); out.println( <HEAD><TITLE>1부터 100까지의합 </TITLE></HEAD> ); out.println( <BODY> ); int total = 0; for (int cnt = 1; cnt <= 100; cnt++) total += cnt; out.print( 1부터 100까지더한값은? ); out.println(total); 익스프레션안에있던자바식 out.println( </BODY> ); out.println( </HTML> ); 스크립틀릿안에있던자바명령문 [ 그림 3-6] JSP 페이지의코드가서블릿클래스의코드로변환되는방법 14/92
2. JSP 의기초문법 ( 스크립팅요소, 지시자, 주석 ) 스크립팅요소의문법 [ 그림 3-7] JSP 페이지로부터변환된서블릿클래스의소스코드 15/92
16/92 2. JSP 의기초문법 ( 스크립팅요소, 지시자, 주석 ) 스크립팅요소의문법
17/92 2. JSP 의기초문법 ( 스크립팅요소, 지시자, 주석 ) 스크립팅요소의문법 JSP 페이지의스크립틀릿은모두 _jspservice 메서드안에들어가는명령문이되므로, 한스크립틀릿안에서선언한변수를그뒤에나오는다른스크립틀릿안에사용하는것이가능하다. [ 예제 3-1] 여러개의스크립틀릿이있는 JSP 페이지 <%@page contenttype= text/html; charset=euc-kr %> <HTML> <HEAD><TITLE>1 부터 200 까지의합 </TITLE></HEAD> <BODY> <% int total = 0; for (int cnt = 1; cnt <= 100; cnt++) total += cnt; %> 1 부터 100 까지의합 = <%= total %> <BR> <% for (int cnt = 101; cnt <= 200; cnt++) total += cnt; %> 1 부터 200 까지의합 = <%= total %> <BR> </BODY> </HTML> total 변수를선언한다 total 변수를사용한다
18/92 2. JSP 의기초문법 ( 스크립팅요소, 지시자, 주석 ) 스크립팅요소의문법 JSP 페이지설치방법 1 brain03 라는이름의웹애플리케이션디렉터리를만드세요. 2[ 예제 3-1] 을그디렉터리에저장하세요 [ 그림 3-8] 예제 3-1 의설치방법 JSP 페이지실행결과 [ 그림 3-9] 예제 3-1 의실행결과
19/92 2. JSP 의기초문법 ( 스크립팅요소, 지시자, 주석 ) 스크립팅요소의문법 선언부 (declaration) <%! 로시작해서 %> 로끝나고, 그사이에변수선언문이나메서드선언문을작성 선언된변수또는메서드는 JSP 페이지로부터변환된서블릿클래스의멤버가되므로 final, public, private, protected, static 등의키워드를붙이는것도가능 <%! final static int MAX=10000; %> 변수선언 <%! %> private int add(int num1, int num2) { int sum = num1 + num2; return sum; } 매서드선언 변수를선언시에주의할점 JSP 페이지로부터변환된서블릿클래스는기본적으로멀티 스래드모델로동작 서블릿클래스안에는인스턴스변수를선언하면안된다.
20/92 2. JSP 의기초문법 ( 스크립팅요소, 지시자, 주석 ) 스크립팅요소의문법 선언부의사용예 [ 예제 3-2] 선언부를포함한 JSP 페이지 <%@page contenttype= text/html; charset=euc-kr %> <HTML> <HEAD><TITLE>2 의거듭제곱 </TITLE></HEAD> <BODY> 2 ^ 1 = <%= power(2, 1) %> <BR> 2 ^ 2 = <%= power(2, 2) %> <BR> 2 ^ 3 = <%= power(2, 3) %> <BR> 2 ^ 4 = <%= power(2, 4) %> <BR> 2 ^ 5 = <%= power(2, 5) %> <BR> </BODY> </HTML> <%! private int power(int base, int exponent) { int result= 1; for (int cnt = 0; cnt < exponent; cnt++) result *= base; return result; } %> 선언부
21/92 2. JSP 의기초문법 ( 스크립팅요소, 지시자, 주석 ) 스크립팅요소의문법 선언부가변환된서블릿클래스의소스코드
22/92 2. JSP 의기초문법 ( 스크립팅요소, 지시자, 주석 ) 스크립팅요소의문법 선언부가변환된서블릿클래스의소스코드
23/92 2. JSP 의기초문법 ( 스크립팅요소, 지시자, 주석 ) 지시자의문법 지시자 (directive) 웹컨테이너가 JSP 페이지를서블릿클래스로변환할때필요한정보들을정의 웹브라우저의요청에의해동적으로실행되는부분이아님. 지시자의종류 page 지시자 include 지시자 taglib 지시자
24/92 2. JSP 의기초문법 ( 스크립팅요소, 지시자, 주석 ) 지시자의문법 모든지시자는 <%@ 으로시작하고 %> 로끝나야한다. <%@ 바로다음에는지시자이름을정의하고, 지시자이름다음에는여러가지애트리뷰트 ( 속성 ) 가정의한다. <%@page 애트리뷰트 _ 목록 %> <%@include 애트리뷰트 _ 목록 %> 지시자이름 <%@taglib 애트리뷰트 _ 목록 %> page 지시자는 JSP 페이지전체에적용되는정보를기술하기위해사용
2. JSP 의기초문법 ( 스크립팅요소, 지시자, 주석 ) 지시자의문법 page 지시자의애트리뷰트 애트리뷰트이름 contenttype import buffer autoflush isthreadsafe session errorpage iserrorpage iselignored pageencoding info extends language deferredsyntaxallowedasliteral trimdirectivewhitespaces 기술하는정보 / 애트리뷰트의역할 JSP 페이지가생성하는문서의종류와그문서를웹브라우저로전송할때사용되는인코딩타입 스크립팅요소안에서사용할자바클래스와인터페이스를임포트하기위해사용하는애트리뷰트 출력버퍼의크기 출력버퍼가모두찼을때의동작 JSP 페이지가싱글 - 스레드모드로작동하도록만들기위해필요한애트리뷰트 JSP 페이지의세션참여여부 에러를처리할 JSP 페이지의 URL 에러를처리하는 JSP 페이지인지여부 익스프레션언어의무시 / 처리여부 JSP 페이지의인코딩타입 JSP 페이지에대한설명 JSP 페이지로부터생성되는서블릿클래스의슈퍼클래스 스크립팅요소안에서사용할프로그래밍언어. 현재는 java 라는값만지정할수있음 익스프레션언어의예약문자열인 #{ 를사용했을때의에러발생여부 지시자바로다음에있는공백문자를제거하기위해사용하는애트리뷰트 page 지시자의애트리뷰트 25/92
26/92 2. JSP 의기초문법 ( 스크립팅요소, 지시자, 주석 ) 지시자의문법 page 지시자의애트리뷰트 contenttype 애트리뷰트 JSP 페이지가생성하는문서의종류와그문서를웹브라우저로전송할때사용할인코딩방식을지정 두값은세미콜론 (;) 으로구분 <%@page contenttype= text/html; charset=utf-8 %> 한글이포함된 JSP 페이지일경우 <%@page contenttype= text/html %> ASCII 코드로만구성된 JSP 페이지일경우 text/html 은 contenttype 애트리뷰트의디폴트값이므로이 page 지시자는생략할수있다 JSP 페이지를이용하면 HTML 문서뿐만아니라 XML 문서도생성할수있다. 그럴때 는 contenttype 애트리뷰트에문서의종류를 text/xml 로써야한다.
27/92 2. JSP 의기초문법 ( 스크립팅요소, 지시자, 주석 ) 지시자의문법 page 지시자의애트리뷰트 JSP 페이지가서블릿클래스로변환될때 contenttype 애트리뷰트의값은 setcontenttype 메서드호출문의파라미터가된다. UTF-8
28/92 2. JSP 의기초문법 ( 스크립팅요소, 지시자, 주석 ) 지시자의문법 page 지시자의애트리뷰트 import 애트리뷰트 자바의 import 문과마찬가지로다른패키지에속하는클래스나인터페이스를 import하는역할을한다. <%@page import= java.util.gregoriancalendar %> java.util 패키지의 GregorianCalendar 클래스를임포트한다. <%@page import= java.util.* %> java.util 패키지의모든클래스와인터페이스를임포트한다 <%@page import= java.util.arraylist, java.io.* %> java.util.arraylist 클래스와 java.io 패키지의모든클래스, 인터페이스를임포트한다
29/92 2. JSP 의기초문법 ( 스크립팅요소, 지시자, 주석 ) 지시자의문법 page 지시자의애트리뷰트 import 애트리뷰트의사용예 [ 예제 3-3] page 지시자의 import 애트리뷰트사용예 <%@page contenttype= text/html; charset=euc-kr %> <%@page import= java.util.gregoriancalendar %> <HTML> <HEAD><TITLE> 날짜와시각 </TITLE></HEAD> <BODY> <% GregorianCalendar now = new GregorianCalendar(); String date = String.format( %TF, now); String time = String.format( %TT, now); %> 오늘의날짜 : <%= date %> <BR> 현재의시각 : <%= time %> <BR> </BODY> </HTML>
30/92 2. JSP 의기초문법 ( 스크립팅요소, 지시자, 주석 ) 지시자의문법 page 지시자의애트리뷰트 page 지시자에여러종류의애트리뷰트를함께쓸수도있다. <%@page contenttype= text/html; charset=euc-kr import= java.util.gregoriancalendar %> 여러종류의애트리뷰트를함께쓸수있다
31/92 2. JSP 의기초문법 ( 스크립팅요소, 지시자, 주석 ) 지시자의문법 include 지시자 다른 JSP 페이지또는 HTML 문서를불러다가현재 JSP 페이지의일부로만들기위해 사용한다. 불러올대상은 file 애트리뷰트를이용해서지정할수있으며, 이애트리뷰트의값은 지시자가속하는 JSP 페이지를기준으로한상대적인 URL 로해석된다. <%@include file= Today.jsp %> <%@include file= sub1/today.jsp %> 현재디렉터리에있는 Today.jsp 를 include 한다 sub1 디렉터리에있는 Today.jsp 를 include 한다
32/92 2. JSP 의기초문법 ( 스크립팅요소, 지시자, 주석 ) 지시자의문법 include 지시자의사용예 [ 예제 3-4] include 지시자의사용예 <%@page contenttype= text/html; charset=euc-kr %> <HTML> <HEAD><TITLE> 오늘의메뉴 </TITLE></HEAD> <BODY> <H3> 오늘의메뉴 </H3> - 삼계탕 <BR> - 돈까스 <BR> - 튀김국수 <BR><BR> <%@include file= Today.jsp %> </BODY> </HTML> Today.jsp를 include한다 <%@page contenttype= text/html; charset=euc-kr %> <%@page import= java.util.* %> <% GregorianCalendar now = new GregorianCalendar(); %> <%= String.format( %TY 년 %Tm 월 %Td 일, now, now, now) %>
33/92 2. JSP 의기초문법 ( 스크립팅요소, 지시자, 주석 ) 지시자의문법 taglib 지사자 JSP 문법중하나인액션 (action) 을사용할때필요 액션이속한라이브러리를설치해야만사용할수있다. <%@taglib prefix= c uri= http://java.sun.com/jsp/jstl/core %> 액션이속하는라이브러리를지정하는지시자
34/92 2. JSP 의기초문법 ( 스크립팅요소, 지시자, 주석 ) 주석 (Comment) 작성 JSP 페이지에서주석작성방법은다양하다. JSP 페이지의 HTML 코드부분 : <!--로시작해서 --> 로끝나는 HTML 주석을쓸수있다. <!-- HTML 의주석 --> 시작표시 끝표시 JSP 페이지의스크립팅요소안 : 자바문법을따르는주석을쓸수있다. /* Java 의주석 */ // Java 의주석 시작표시끝표시시작표시 JSP 고유의주석을사용할수있다. <%-- JSP 의주석 --%> 시작표시 끝표시
35/92 2. JSP 의기초문법 ( 스크립팅요소, 지시자, 주석 ) 주석작성 여러가지주석의사용예 [ 예제 3-5] 여러가지주석을포함하는 JSP 페이지 <%@page contenttype= text/html; charset=euc-kr %> <HTML> <HEAD><TITLE>1부터 10까지의곱 </TITLE></HEAD> <!-- 이것은 JSP에의해생성된 HTML 문서입니다. --> <BODY> <%-- 다음은데이터를처리하는스크립틀릿입니다. --%> <% int result = 1; // 곱을저장할변수 /* 1부터 10까지곱하는반복문 */ for (int cnt = 1; cnt <= 10; cnt++) result *= cnt; %> 1부터 10까지곱한값은? <%= result %> </BODY> </HTML> HTML 주석 JAVA 주석
36/92 2. JSP 의기초문법 ( 스크립팅요소, 지시자, 주석 ) JSP 페이지의서블릿클래스로의변환 (1)
37/92 2. JSP 의기초문법 ( 스크립팅요소, 지시자, 주석 ) JSP 페이지의서블릿클래스로의변환 (2)
38/92 2. JSP 의기초문법 ( 스크립팅요소, 지시자, 주석 ) JSP 페이지의서블릿클래스로의변환 (3) JSP 서블릿클래스의주요메소드 jspinit() 서블릿의 init() 메소드에서호출 jspdestroy() 서블릿의 destroy() 메소드에서호출 _jspservice() 서블릿의 service() 메소드에서호출
39/92 2. JSP 의기초문법 ( 스크립팅요소, 지시자, 주석 ) JSP 생명주기 (1)
40/92 2. JSP 의기초문법 ( 스크립팅요소, 지시자, 주석 ) JSP 생명주기 (2)
41/92 2. JSP 의기초문법 ( 스크립팅요소, 지시자, 주석 ) JSP 생명주기 (3)
42/92 2. JSP 의기초문법 ( 스크립팅요소, 지시자, 주석 ) JSP 생명주기 (4) JSP 초기화방법 web.xml 파일엣 JSP 초기화파라미터정의 jspinit() 메소드재정의
43/92 3. JSP 페이지의내장변수 내장변수 (Implicit Variables) JSP 페이지안에선언을하지않고도사용할수있는변수 <%@page contenttype= text/html; charset=euc-kr %> <HTML> <HEAD><TITLE> 정수를순서대로 </TITLE></HEAD> <BODY> <H3> 정수를순서대로 </H3> <% String str = request.getparameter( MAX ); int max = Integer.parseInt(str); for (int cnt = 1; cnt <= max; cnt++) out.println(cnt + <BR> ); %> </BODY> </HTML> 내장변수 내장변수 [ 그림 3-15] JSP 페이지의내장변수의예 request 내장변수는서블릿클래스의 doget, dopost 메서드의첫번째파라미터와동일한역할을한다. out 내장변수는서블릿클래스에서 getwriter 메서드를호출해서얻은 PrintWriter 객체와마찬가지의역할을한다.
44/92 3. JSP 페이지의내장변수 JSP 페이지안에서내장변수를사용할수있는이유는웹컨테이너가 JSP 페이지를서블릿클래스로변환할때자동으로내장변수를선언하기때문 JSP 페이지에서사용할수있는내장변수들 : 변수이름제공하는기능 / 변수의역할변수타입 request response doget, dopost 메서드의첫번째파라미터와동일한역할 doget, dopost 메서드의두번째파라미터와동일한역할 javax.servlet.http.httpservletrequest javax.servlet.http.httpservletresponse out 웹브라우저로 HTML 코드를출력하는기능 javax.servlet.jsp.jspwriter application JSP 페이지가속하는웹애플리케이션에관련된기능 javax.servlet.servletcontext config JSP 페이지의구성정보를가져오는기능 javax.servlet.servletconfig pagecontext JSP 페이지범위내에서사용할수있는데이터저장기능등 javax.servlet.jsp.pagecontext session 세션에관련된기능 javax.servlet.http.httpsession page JSP 페이지로부터생성된서블릿 java.lang.object exception 익셉션객체 java.lang.throwable
45/92 3. JSP 페이지의내장변수 JSP 내장객체
46/92 3. JSP 페이지의내장변수 request 내장변수 서블릿클래스에있는 doget, dopost 메서드의첫번째파라미터와동일 타입도동일하게 javax.serlet.http.httpservletrequest이다. String str = request.getparameter( NAME ); 사용예 : 데이터이름 웹브라우저를통해입력된데이터를가져다가처리하는애플리케이션 [ 그림 3-17] 인사말을출력하는웹애플리케이션의화면설계
47/92 3. JSP 페이지의내장변수 request 내장변수 둘이상의화면으로구성된애플리케이션은먼저 URL 을정한뒤각 URL 에해 당하는코드를작성하는것이좋다. http://localhost:8080/brain03/yourname.html http://localhost:8080/brain03/hi.jsp [ 그림 3-17] 왼쪽화면 URL [ 그림 3-17] 오른쪽화면 URL [ 예제 3-6] 웹브라우저로부터이름을입력받는 HTML 문서 <HTML> <HEAD> <META http-equiv= Content-Type content= text/html;charset=euc-kr > <TITLE> 이름입력 </TITLE> </HEAD> <BODY> 당신의이름을입력하세요. <FORM ACTION=/brain03/Hi.jsp METHOD=GET> 이름 : <INPUT TYPE=TEXT NAME=YOURNAME> <INPUT TYPE=SUBMIT VALUE= 확인 > </FORM> </BODY> </HTML>
48/92 3. JSP 페이지의내장변수 request 내장변수 [ 예제3-7] 입력된이름을가지고인사말을출력하는 JSP 페이지 <%@page contenttype= text/html; charset=euc-kr %> <HTML> <HEAD><TITLE> 인사하기 </TITLE></HEAD> <BODY> 안녕하세요, <%= request.getparameter( YOURNAME ) %> 님 </BODY> </HTML> [ 그림 3-18] 예제 3-6, 예제 3-7 의실행결과
49/92 3. JSP 페이지의내장변수 out 내장변수 JSP 페이지에서는 HTML 코드와표현식만가지고도원하는 HTML 문서를만 들어서출력가능 [ 예제 3-7] 입력된이름을가지고인사말을출력하는 JSP 페이지 [ 그림 3-19] 1 부터 10 까지의정수를순서대로출력하는웹페이지 <%@page contenttype= text/html; charset=euc-kr %> <HTML> <HEAD><TITLE>1부터 10까지순서대로 </TITLE></HEAD> <BODY> <H3>1부터 10까지순서대로 </H3> <% for (int cnt = 1; cnt <= 10; cnt++) { %> <%= cnt %> <BR> <% } %> </BODY> </HTML>
50/92 3. JSP 페이지의내장변수 out 내장변수 서블릿클래스에서 getwriter 메서드를호출해서얻은 PrintWriter 객체와비슷한역할을한다. 표현식으로표현할수없는내용을출력하고자할때에사용 out.print( <FONT SIZE=1> 안녕하세요!</FONT> ); out.println( <BR> ); [ 예제3-8] out 내장변수를사용하는 JSP 페이지 <%@page contenttype= text/html; charset=euc-kr %> <HTML> <HEAD><TITLE>1부터 10까지순서대로 </TITLE></HEAD> <BODY> <H3>1부터 10까지순서대로 </H3> <% for (int cnt = 1; cnt <= 10; cnt++) out.println(cnt + <BR> ); %> </BODY> </HTML>
51/92 3. JSP 페이지의내장변수 out 내장변수 JspWriter 나 PrintWriter처럼스트림형태로데이터를출력하는클래스는송신측과수신측사이에가상의통로를만든다. JSP 페이지에서 PrintWriter 객체를새로만들면기존의 out 내장변수가관리하던통로와더불어두개의통로가공존하게된다. [ 그림 3-20] response,getwriter 메서드를호출하면안되는이유
52/92 3. JSP 페이지의내장변수 out 내장변수 out.print, out.println 메서드를통해출력되는내용뿐만아니라, JSP 페이지안에있는 HTML 코드와표현식내용도모두 out 내장변수를통해웹브라우저로출력된다. page 지시자의 buffer 애트리뷰트를이용하여출력버퍼크기수정가능 buffer 애트리뷰트에는버퍼의크기를킬로바이트단위의정수로써야하며, 뒤에 kb라는단위표시를붙여써야한다. <%@page buffer= 2kb %> 출력버퍼의크기 버퍼의실제크기를알고싶을경우에는 out 내장변수에대해 getbuffersize라는메서드를호출하면된다. int bsize = out.getbuffersize(); 출력버퍼의크기를바이트단위로리턴하는메서드
53/92 3. JSP 페이지의내장변수 out 내장변수 page 지시자의 buffer 애트리뷰트에 none이라는값을지정하면 out 내장변수를통해출력되는내용이출력버퍼를거치지않고웹브라우저로바로전송되도록만들수있다. <%@page buffer= none %> 출력버퍼를사용하지않겠다는표시 [ 예제 3-10] 출력버퍼의크기를바꾸는 JSP 페이지 <%@page contenttype= text/html; charset=euc-kr %> <%@page buffer= 4kb %> <HTML> <HEAD><TITLE> 출력버퍼의크기지정 </TITLE></HEAD> <BODY> 출력버퍼의크기 : <%= out.getbuffersize() %> 바이트 </BODY> </HTML> [ 그림 3-21] 예제 3-10 의실행결과
54/92 3. JSP 페이지의내장변수 response 내장변수 서블릿클래스에있는 doget, dopost 메서드의두번째파라미터와동일 javax.servlet.http.httpservletresponse 타입이기때문에이인터페이스에속하는여러가지메서드들을호출할수있다. response.sendredirect( http://www.hanb.co.kr/ ); 호출할웹자원의 URL sendredirect 메서드를호출할때주의할점 호출하기전과후에웹브라우저로데이터를출력하면안된다. [ 예제 3-11] 다른웹페이지로이동하는 JSP 페이지 <% response.sendredirect( http://www.hanb.co.kr/ ); %>
55/92 3. JSP 페이지의내장변수 response 내장변수 [ 그림 3-22] 예제 3-11 의실행결과
56/92 3. JSP 페이지의내장변수 response 내장변수 sendredirect 메서드는파라미터로지정한 URL 을이용해서다시웹자원을호 출하라는메시지를웹브라우저로보낸다 [ 그림 3-23] sendredirect 메서드의작동원리
57/92 3. JSP 페이지의내장변수 application 내장변수 웹애플리케이션에관련된여러가지정보및기능을제공 getcontextpath 메서드는웹애플리케이션의 URL경로명을반환 String apppath = application.getcontextpath(); 웹애플리케이션의 URL 경로명을리턴하는메서드 getrealpath 메서드는웹애플리케이션내에서의파일경로명을파일시스템전체에대한절대경로명으로전환 String absolutepath = application.getrealpath( /sub1/intro.html ); 웹애플리케이션내에서의파일의경로명
58/92 3. JSP 페이지의내장변수 application 내장변수 [ 예제 3-12] application 내장변수의사용예 <%@page contenttype= text/html; charset=euc-kr %> <HTML> <HEAD><TITLE>application 내장변수의사용예 </TITLE></HEAD> <BODY> <% String apppath = application.getcontextpath(); String filepath = application.getrealpath( /sub1/intro.html ); %> 웹애플리케이션의 URL 경로명 : <%= apppath %> <BR> /sub1/intro.html 의파일경로명 : <%= filepath %> <BR> </BODY> </HTML> [ 그림 3-24] 예제 3-12 의실행결과
59/92 3. JSP 페이지의내장변수 내장변수의생존범위 (Scope)
60/92 3. JSP 페이지의내장변수 page 내장변수 웹컨테이너에서의해생성된서블릿인스턴스객체를참조하는참조변수 JSP 페이지내에서자기자신을참조할때에사용 스크립트언어가자바가아닌경우에유용 현재로는자바만사용하기때문에거의사용하지않음
61/92 3. JSP 페이지의내장변수 pagecontext 내장변수 다른모든내장변수 ( 내장객체 ) 에대한프로그램적인접근방법을제공 내장객체에저장된속성접근방법을제공 HTTP 요청을처리하는제어권을다른페이지로넘기는방법을제공
62/92 3. JSP 페이지의내장변수 pagecontext 내장변수 내장변수 ( 내장객체 ) 참조메서드 getrequest() getresponse() getout() getservletconfig() getservletcontext() getsession() getpage() getexception()
63/92 3. JSP 페이지의내장변수 pagecontext 내장변수 속성데이터설정및읽기 Page 생존범위속성설정 <% Float one = new Float(42.5); %> <% pagecontext.setattribute( foo, one); %> Page 생존범위속성읽기 <%= pagecontext.getattribute( foo ) %> PageContext를이용하여 Session 생존범위속성설정 <% Float two = new Float(22.4); %> <% pagecontext.setattribute( foo, two, PageContext.SESSION_SCOPE); %> PageContext를이용하여 Session 생존범위속성읽기 <% pagecontext.getattribute( foo, PageContext.SESSION_SCOPE) %> PageContext를이용하여 application 생존범위속성읽기 <%= pagecontext.getattribute( mail, PageContext.APPLICATION_SCOPE) %> PageContext를이용하여모르는생존범위속성읽기 <%= pagecontext.findattribute( foo ) %>
64/92 3. JSP 페이지의내장변수 pagecontext 내장변수 페이지전달관련메서드 forward(path) 문자열 path에지정된페이지로포워딩 요청처리제어권을지정된페이지로넘김 현재 JSP는실행종료 include(path) 문자열 path에지정된페이지를포함 요청처리제어권을지정된페이지로넘겨처리한후에되돌려받음
4. 파일입출력 65/92 파일읽기 java.io.filereader 또는 java.io.fileinputstream 클래스를이용 [ 예제 3-13] 텍스트파일을읽는스탠드얼론프로그램 import java.io.*; class FileReadProgram { public static void main(string args[]) { 파일을연다 BufferedReader reader = null; try { reader = new BufferedReader(new FileReader( input.txt )); while (true) { String str = reader.readline(); if (str == null) break; 한행의텍스트데이터를읽는다 System.out.println(str); } } 읽은데이터를모니터로출력한다 catch (FileNotFoundException fnfe) { System.out.println( 파일이존재하지않습니다. ); } catch (IOException ioe) { System.out.println( 파일을읽을수없습니다. ); } finally { try { reader.close(); } 파일을닫는다 catch (Exception e) { } } } }
66/92 4. 파일입출력 파일읽기 파일을읽는웹애플리케이션의구성도 [ 그림 3-25] 텍스트파일을읽어서출력하는웹애플리케이션의구성도 JSP 페이지나서블릿클래스는 standalone 프로그램과달리웹서버의일부가 되어서실행된다.
67/92 4. 파일입출력 파일읽기 웹브라우저에서해당파일의 URL 을통해파일의내용을직접읽을수없도록 만들려면 WEB-INF 디렉터리에저장해야한다. [ 그림 3-26] 지금부터작성할 JSP 페이지가사용할파일을저장하는방법
68/92 4. 파일입출력 파일읽기 JSP 페이지안에서파일을읽기위해서는기본적으로파일의절대경로를사 용하거나톰캣의설치디렉터리로부터상대경로명을사용해야한다. 다른방법으로는 getrealpath 메서드를이용해서웹애플리케이션내에서의 경로명을절대경로명으로바꾸어사용하는방법 String filepath = application.getrealpath( /WEB-INF/input.txt ); 웹애플리케이션디렉터리내에서의파일의경로명
4. 파일입출력 파일읽기 [ 예제 3-14] 텍스트파일의내용을읽어서웹브라우저로출력하는 JSP 페이지 <%@page contenttype= text/html; charset=euc-kr %> <%@page import= java.io.* %> <HTML> <HEAD><TITLE> 파일읽기 </TITLE></HEAD> <BODY> <% BufferedReader reader = null; try { String filepath = application.getrealpath( /WEB-INF/input.txt ); reader = new BufferedReader(new FileReader(filePath)); while (true) { String str = reader.readline(); if (str == null) break; out.println(str + <BR> ); } } catch (FileNotFoundException fnfe) { out.println( 파일이존재하지않습니다. ); } catch (IOException ioe) { out.println( 파일을읽을수없습니다. ); } finally { try { reader.close(); } catch (Exception e) { } } %> </BODY> </HTML> 69/92
70/92 4. 파일입출력 파일쓰기 java.io.filewriter, java.io.printwriter, java.io.fileoutputstream 등의클래스를 이용 [ 그림 3-28] 게시판글쓰기기능을구현하는웹애플리케이션의구성도
71/92 4. 파일입출력 파일쓰기 http://localhost:8080/brain03/bbsinput.html http://localhost:8080/brain03/bbspost.jsp [ 그림 3-29] 위쪽화면 URL [ 그림 3-29] 아래쪽화면 URL [ 예제 3-15] 게시판글쓰기기능의입력화면을구현하는 HTML 문서 <HTML> <HEAD> <META http-equiv= Content-Type content= text/html;charset=euc-kr > <TITLE> 게시판글쓰기 - 입력화면 </TITLE> </HEAD> <BODY> <H2> 글쓰기 </H2> <FORM ACTION=BBSPost.jsp METHOD=POST> 이름 : <INPUT TYPE=TEXT NAME=NAME><BR> 제목 : <INPUT TYPE=TEXT NAME=TITLE><BR> <TEXTAREA COLS=30 ROWS=5 NAME=CONTENT></TEXTAREA><BR> <INPUT TYPE=SUBMIT VALUE= 저장 > </FORM> </BODY> </HTML>
72/92 4. 파일입출력 파일쓰기 HTML 문서를통해게시글을입력받을때마다그내용을담은파일을새로하 나씩만들어야한다. [ 그림 3-29] 게시글파일을저장할디렉터리만들기
73/92 4. 파일입출력 파일쓰기 msec 단위의현재시각을파일이름으로사용하기로한다. 이값은 java.util.date 클래스의객체를만든다음 gettime 메서드를호출해서얻을수있다. Date date = new Date(); long time = date.gettime(); 현재시각을밀리세컨드단위로가져오는메서드 gettime 메서드가반환하는값은 1212414054907 처럼아주긴정수이다.
74/92 4. 파일입출력 파일쓰기 [ 예제 3-16] 게시글을저장하는 JSP 페이지 <%@page contenttype= text/html; charset=euc-kr %> <%@page import= java.io.*, java.util.date %> <HTML> <HEAD><TITLE> 게시판글쓰기 - 결과화면 </TITLE></HEAD> <BODY> <H2> 글쓰기 </H2> <% request.setcharacterencoding( euc-kr ); String name = request.getparameter( NAME ); String title = request.getparameter( TITLE ); String content = request.getparameter( CONTENT ); Date date = new Date(); Long time = date.gettime(); String filename = time +.txt ; PrintWriter writer = null; try { String filepath = application.getrealpath( /WEB-INF/bbs/ + filename); writer = new PrintWriter(filePath); writer.printf( 제목 : %s %n, title); writer.printf( 글쓴이 : %s %n, name); writer.println(content); out.println( 저장되었습니다. ); } catch (IOException ioe) { [ 예제 3-16] 게시글을저장하는 JSP 페이지 out.println( 파일에데이터를쓸수없습니다. ); } finally { try { writer.close(); } catch (Exception e) { } } %> </BODY> </HTML>
75/92 4. 파일입출력 파일쓰기 [ 그림 3-30] 예제 3-15, 3-16 의실행방법 문제점 : 결과화면에서새로고침버튼을누를때마다게시글디렉터리에똑같은내용의게시글파일이하나씩더생긴다. 웹브라우저의새로고침버튼을누를때마다 [ 예제 3-16] 의 JSP 페이지가다시호출되기때문이다.
76/92 4. 파일입출력 파일쓰기
77/92 4. 파일입출력 파일쓰기
78/92 5. 다른 JSP 페이지호출하기 다른 JSP 페이지호출하기 다른페이지로의 forwarding 웹브라우저의요청처리제어권을다른페이지로완전히넘겨다른페이지로전환 현재 JSP 페이지는실행종료 다른페이지의 including 웹브라우저의요청처리제어권을다른페이지로넘겨처리한후에되돌려받음 현재 JSP 페이지은실행을중지하였다가제어권을받은후에실행을재개
79/92 5. 다른 JSP 페이지호출하기 페이지 forwarding 방법 RequestDispatcher 인터페이스객체의 forward() 메소드 pagecontext 내장객체의 forward() 메소드 forward 액션
80/92 5. 다른 JSP 페이지호출하기 RequestDispatcher 인터페이스의 forward() 메서드 JSP 페이지안에서다른 JSP 페이지로실행흐름의제어권을넘길때에호출 가장낮은추상화수준의동작 javax.servlet.requestdispatcher 인터페이스객체를먼저생성한후에 forward() 메소드호출 호출시에 request 내장변수와 response 내장변수를파라미터로넘겨줌 RequestDispatcher dispatcher = request.getrequestdispatcher( Result.jsp ); dispatcher.forward(request, response); 호출할 JSP 페이지의 URL 경로명 request 내장변수 response 내장변수
81/92 5. 다른 JSP 페이지호출하기 RequestDispatcher 인터페이스의 forward() 메서드 forward() 메서드를통해호출하는 JSP 페이지로데이터를넘겨주려면 request 내장변수안에속성으로데이터를저장해놓아야한다. request.setattribute( HEIGHT, new Integer(178)); 데이터이름 데이터값 호출된 JSP 페이지안에서 request 내장변수안의속성데이터를가져오려면 request.getattribute 메서드를호출하면된다. Integer height = (Integer) request.getattribute( HEIGHT ); 캐스트연산자 데이터이름
82/92 5. 다른 JSP 페이지호출하기 RequestDispatcher 인터페이스의 forward() 메서드 [ 그림 3-32] 사칙연산을수행하는웹애플리케이션화면설계 [ 그림 3-32] 의왼쪽화면의 URL http://localhost:8080/brain03/fourrules.html [ 그림 3-32] 의오른쪽화면의 URL http://localhost:8080/brain03/fourrules.jsp 사칙연산을수행하는 JSP 페이지의 URL http://localhost:8080/brain03/fourruelsresult.jsp 사칙연산의결과를출력하는 JSP 페이지의 URL
83/92 5. 다른 JSP 페이지호출하기 RequestDispatcher 인터페이스의 forward() 메서드 [ 예제 3-18] 두개의수를입력받는 HTML 문서 <HTML> <HEAD> <META http-equiv= Content-Type content= text/html;charset=euc-kr > <TITLE> 사칙연산 </TITLE> </HEAD> <BODY> <FORM ACTION=FourRules.jsp> 첫번째수 : <INPUT TYPE=TEXT NAME=NUM1><BR> 두번째수 : <INPUT TYPE=TEXT NAME=NUM2><BR> <INPUT TYPE=SUBMIT VALUE= 입력 > </FORM> </BODY> </HTML>
84/92 5. 다른 JSP 페이지호출하기 RequestDispatcher 인터페이스의 forward() 메서드
85/92 5. 다른 JSP 페이지호출하기 RequestDispatcher 인터페이스의 forward() 메서드 [ 그림 3-33] 예제 3-18, 3-19 의실행결과 forward() 메서드가 request 내장변수를통해전달하는것은속성뿐만이아니 라 request 내장변수안에있는모든데이터가함께전달된다. <BODY> 입력된수 : <%= request.getparameter( NUM1 ) %>, <%= request.getparameter( NUM2 ) %> <BR><BR> 덧셈의결과는? <%= request.getattribute( SUM ) %> <BR> [ 예제 3-19] 의두번째 JSP 페이지에이두행을추가한다
86/92 5. 다른 JSP 페이지호출하기 pagecontext 내장객체의 forward() 메서드 <% %> pagecontext.forward( FourRulesResults.jsp ); forward 액션 <jsp:forward page= FourRulesResults.jsp />
87/92 5. 다른 JSP 페이지호출하기 페이지 including 방법 RequestDispatcher 인터페이스객체의 include() 메소드 pagecontext 내장객체의 include() 메소드 include 액션
88/92 5. 다른 JSP 페이지호출하기 RequestDispatcher 인터페이스의 include() 메서드 forward() 메서드처럼다른 JSP 페이지를호출하지만, 호출된 JSP 페이지가끝나고나면실행흐름의제어가본래의 JSP 페이지로돌아온다. 먼저 RequestDispatcher 객체를생성한후에 include() 메서드호출 호출할때는 request 내장변수와 response 내장변수를파라미터로넘겨줌 RequestDispatcher dispatcher = request.getrequestdispatcher( Today.jsp ); dispatcher.include(request, response); 호출할 JSP 페이지의 URL 경로명 request 내장변수 response 내장변수
89/92 5. 다른 JSP 페이지호출하기 RequestDispatcher 인터페이스의 include() 메서드 include() 메서드를통해호출되는 JSP 페이지로데이터를넘겨주기위해서는 request 내장변수의속성데이터를이용 setattribute() 메서드와 getattribute() 메서드를호출 request.setattribute( WEIGHT, new Double(72.5)); request 내장변수에데이터를저장하는메서드 Double weight = (Double) request.getattribute( WEIGHT ); request 내장변수에저장되어있는데이터를가져오는메서드
90/92 5. 다른 JSP 페이지호출하기 RequestDispatcher 인터페이스의 include() 메서드 include() 메서드의사용예 [ 예제 3-20] include 메서드의사용예 <%@page contenttype= text/html; charset=euc-kr %> <HTML> <HEAD><TITLE> 오늘의메뉴 </TITLE></HEAD> <BODY> <H3> 오늘의메뉴 </H3> - 짜장면 <BR> - 볶음밥 <BR> - 짬뽕 <BR><BR> <% out.flush(); RequestDispatcher dispatcher = request.getrequestdispatcher( Now.jsp ); dispatcher.include(request, response); %> </BODY> </HTML> Now.jsp를 include합니다 <%@page contenttype= text/html; charset=euc-kr %> <%@page import= java.util.* %> <% GregorianCalendar now = new GregorianCalendar(); %> [ 현재의시각 ] <%= String.format( %TF %TT, now, now) %>
91/92 5. 다른 JSP 페이지호출하기 pagecontext 내장객체의 include() 메서드 <% %> out.flush(); pagecontext.include( Now.jsp ); include 액션 <jsp:include page= Now.jsp flush= true />
JSP & Servlet