Chapter. JSP 의스크립트기반구현 스크립트기반구현의개요주석문 (Comment) 지시문 (Directive) 표현문, 수행문, 선언문
Chapter.11 : JSP 의스크립트기반구현 1. 스크립트기반구현의개요모든기능을 JSP 안에 Java 소스코드를포함하여구현하는방식으로서프리젠테이션, 컨트롤, 비즈니스로직등이모두 JSP 페이지안에구현된다. 즉, JSP 페이지중심으로어플리케이션을구축하는것으로 JSP 페이지내에스크립트언어를이용해서프리젠테이션영역뿐만아니라비즈니스로직까지포함하여구현한다. 모든어플리케이션로직과어떠한결과를응답할것인지에대한모든결정이 JSP 페이지 자체에서하드코딩되는방식이다. 다음은페이지중심구현이갖는아키텍쳐이다. b r o w s e r request response JSP 페이지 1 JSP 페이지 2 DBMS 만약 DBMS 에연결이필요한 JSP 페이지가여러개존재한다면각 JSP 페이지마다 JDBC 프로그램소스가존재하게된다. 또한동적인데이터는같고보여주기위한 HTML 코드만 다르다하더라도동적인데이터를구하기위한소스코드가동일하게있어야한다. [ 스크립트기반구현의장점 ] 구조적인관점에서보면상당히단순하다. 변경되는부분도적고, 추상화수준도낮은데다가구성계층도적기때문에 HTML 디자인과자바개발에모두익숙한 개인 이나소규모개발팀이빠른시일안에동적인 Web 페이지와 JSP 어플리케이션을만들때적합하다. [ 스크립트기반구현의단점 ] 2/23
페이지중심구현은거의초급수준의개발형태를띄는경우가많으며어느정도의복잡도를지닌어플리케이션을만드는일에대해서는문제개발과유지보수측면에서문제점을가지고있다. 어플리케이션을이루고있는 JSP 페이지들이프리젠테이션과비즈니스로직, 컨트롤코드를모두가지고있기때문에어플리케이션을유지보수하기가힘들다. HTML 과 JSP 코드가섞여있어서 Web 페이지디자이너와자바프로그래머사이의역할구분이희미해지고, 코드의일부분을수정하였을때이와연관된다른부분도수정해야하는일이많이발생될수있다. 그리고각 JSP 파일안에필요한수행코드들이각각의 JSP 안에하드코딩되므로여러 JSP 에동일한행코드들이중복되어정의될수있다. 스크립트기반구현에서 Java 수행코드를포함하는용도로사용될수있는대표적인 JSP 태그는다음과같다. - 수행문 <%... %> - 표현문 <%=... %> - 선언문 <%!... %> 2. 주석문 (Comment) 주석문은 JSP 페이지가어떤기능을하며, 무슨목적으로작성되었는지등의요청처리에관계되지않은일반적인정보를 JSP 페이지내에삽입하기위해사용된다. JSP 페이지에는세가지유형의주석문을사용할수있다. 다음은 JSP 페이지에서사용가능한주석문의종류와구문에대한표이다. 종류 구문 주석으로처리되는시점 JSP 주석 <%-- --%> Servlet 코드로변환될때 HTML 주석 <!-- --> 브라우저에의해응답이파싱될때 자바주석 //, /* */ Servlet 소스가컴파일될때 3/23
주석문의종류에따라서주석처리를하는시점이달라지므로어느부분에주석이보여야 할지를파악한후선택한다. 1) HTML 주석문 HTML 이나 XML 에서사용되는표준주석문형식을사용하며 JSP 응답의일부로서브라우저로보내진다. JSP 컨테이너는 JSP 페이지를작성하기위한문법적인요소가아닌경우일반템플릿데이터로인식하므로 HTML 주석문도예외가아니다. JSP 페이지내에서 HTML 주석문을사용하면브라우저에서응답정보를화면에뿌릴때주석으로인식되어화면에는표현되지않으며브라우저상에서 소스보기 메뉴를통해서만볼수있다. 이주석문은페이지출력을구성하는일부분이기때문에, 원한다면이것도동적컨텐츠화 시킬수있다. 다음예제에서와같이 HTML 주석문에 JSP 태그를사용하여구현할수있고, 이태그의수행결과가포함된주석문의내용이브라우저에응답된다. JSP 예제 (example3.jsp) 1 2 3 4 5 6 7 8 9 10 11 <%@ page contenttype="text/html; charset=euc-kr" %> <HTML> <BODY> <!-- HTML 주석예제 --> <!-- <%= application.getserverinfo() %> 에의해처리된 JSP 의결과입니다.--> <CENTER> <H2> HTML 주석문은보이지않지요? </H2> </CENTER> </BODY> </HTML> 5 행 : HTML 주석문안에 JSP 의표현문태그가사용된것을볼수있다. application 은 JSP 의내장객체변수이다. 내장객체변수에대해서는 13 장에서자세히학습한다. application.getserverinfo() 는 JSP 를수행시키는서버의정보를추출하게되어주석문의내용이되게한다. 다음은 example3.jsp 를브라우저로요청한결과화면이다. HTML 주석문의내용은화면에 4/23
출력되지않는다. 다음은브라우저의소스보기메뉴를선택하여출력한내용이다. HTML 주석문내용이 보여지고있으며 application.getserverinfo() 의수행결과가포함된것을알수있다. 2) JSP 주석문 JSP 주석문은 JSP 컨테이너에의해주석으로인식된다. JSP 컨테이너가 JSP 페이지를구현 Servlet 소스로변환활때 JSP 주석문의내용은빼고나머지부분에대해서만자바소스 코드를생성한다. JSP 페이지를요청한후실행에러가발생하면페이지의일부코드를 제외하고수행하기위해즉, 주로디버깅을하는데사용한다. JSP 예제 (example4.jsp) 1 2 3 4 <%@ page contenttype="text/html; charset=euc-kr" %> <HTML> <BODY> <CENTER> 5/23
5 6 7 8 9 10 <%-- <H3> 요청방식 : <%= request.getmethod() %></H3> --%> <H3> 요청에사용된브라우저 : <%= request.getheader("user-agent") %></H3> </CENTER> </BODY> </HTML> 4 행 : JSP 주선문안에구현된내용은 Servlet 소스로변환되지않으므로수행도되지않고클라이언트로결과가출력되지도않는다. 7 행 : 이행에서사용된 request 는 JSP 의내장객체변수이다. 내장객체변수에대해서는 13 장에서자세히학습한다. request.getheader("user-agent") 는요청을보내온브라우저에대한정보를추출할때사용한다. 다음은 example4.jsp 를브라우저로요청한결과화면이다. JSP 주석문의내용은화면에출력되지않는다. 3) Java 주석문자바주석문은 JSP 페이지내에스크립팅언어로자바를사용하는경우사용할수있는주석문이다. 이주석문은스크립팅언어에따라달라지는부분으로해당스크립트언어에서제공하는주석처리방식을사용할수있는것이다. 그러므로이주석문은자바의스크립트코드가들어갈수있는스크립트릿과표현식, 선언문 (Declaration) 등에서만사용할수있다. 자바에서는 /* 와 */ 그리고 // 을주석문을위한구분자로사용한다. JSP 예제 (example5.jsp) 1 <%@ page contenttype="text/html; charset=euc-kr" %> 6/23
2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 <HTML> <BODY> <CENTER> 오늘은 <% /* java.util.date date = new java.util.date() ; */ // Calendar 객체생성 java.util.calendar cal = java.util.calendar.getinstance(); %> <H3><%=cal.get(java.util.Calendar.MONTH)+1%> 월 <%=cal.get(java.util.calendar.date) %> 일 </H3> 입니다. </CENTER> </BODY> </HTML> 7 행 : JSP 의수행문태그안에 Java 의단일행주석문이사용되었다. 8 행 : JSP 의수행문태그안에 Java 의다중행주석문이사용되었다. 이렇게 Java 주석문은스크립트태그안에사용해야만하며주로 Java 소스코드에대한설명추가한다거나코드를주석처리하고자할때사용한다. 다음은 example3.jsp 를브라우저로요청한결과화면이다. HTML 주석문의내용은화면에 출력되지않는다. 7/23
3. 지시문 (Directive) 1) 지시문의종류지시문은 JSP 페이지가 Servlet 으로변환될때적용될수있는다양한속성을지정하거나 JSP 파일내에다른파일의내용을포함하고자하는경우그리고커스텀태그라이브러리를정의하는기능에사용된다. 지시문은 JSP 1.2 까지는 3 개가제공되었지만 JSP 2.0 부터는 3 개가더추가되어총 6 개가사용될수있다. 종류로는 page 지시문, include 지시문그리고 taglib 지시문, JSP 2.0 에서추가된 attribute 지시문, tag 지시문그리고 variable 지시문이있다. 그러나기초과정에서는다음 2 개의지시문만학습한다. <%@page {attr = value..} %> page 지시문 <%@include {attr = value..} %> include 지시문 지시문은클라이언트로의어떠한출력을처리하는구문이아니며주로 JSP 컨테이너에게 정보를전달하는기능을처리다. 2) page 지시문 JSP 페이지가 Servlet 으로변환될때적용될수있는다양한속성을지정경우활용된다. page 지시문에지정되는속성은 name=value 의형식으로써얼마든지여러개올수있다. 다음과같은속성들이사용될수있으며 import 속성의경우에한해서중복지정이가능하다. <%@ page [ language= java ] [ extends= package.class ] [ import= {package.class package.*},... ] [ session= true false ] [ buffer= none 8kb sizekb ] [ autoflush= true false ] [ isthreadsafe= true false ] [ info= text ] [ errorpage= relativeurl ] [ contenttype= mimetype [ ; charset=characterset ] text/html ; charset=iso-8859-1 ] 8/23
[ iserrorpage= true false ] [ pageencoding= characterset ISO-8859-1 ] [ iselignored= true false ] %> [ page 지시문이사용된예 ] <%@ page import= java.util.*, java.lang.* %> <%@ page session= false iserrorpage= true %> <%@ page errorpage= error.jsp %> [ page 지시문의속성 ] 위에서제시되지않은속성을지정한경우이거나, 잘못된속성지정은 JSP 소스코드를 파싱하여 Servlet 소스코드를만들어내는과정에서오류를발생하게된다. - language 속성페이지에서사용되는스크립트언어를지정할때사용된다. 이항목이생략되면 JSP 컨테이너는기본적으로 Java 언어로간주한다. 대부분의 JSP 컨테이너들은 Java 언어를기본적으로지원하는데 JSP 컨테이너제품에따라서는다른언어를지원할수도있다. - extends 속성 JSP 컨테이너에의해 JSP 페이지가파싱되어생성되는 Servlet 클래스가상속할부모 클래스를지정한다. 그런데이속성은거의사용되지않는다. 일반적으로 JSP 컨테이너가 부모 클래스를 이미 정해져 있는 클래스로 지정하도록 한다. 일반적으로 javax.servlet.jsp.httpjsppage 또는 javax.servlet.jsp.jsppage 를 상속하여 구현한 클래스를상속받게된다. - import 속성 extends 속성과는다르게 JSP 페이지에서자주사용되는속성으로서 JSP 페이지에서사용되는 Java 클래스들에대한패키지들의 import 를지정한다. 사용하는클래스마다패키지명을붙여서표현하는것도가능하지만여러개라면 import 속성을사용하여패키지단위로지정하는것이더간단하다. import 해야하는패키지또는클래스가여러개인경우에는컴마 (,) 연산자로구분하여지정한다. java.lang 패키지, javax.servlet 패키지, javax.servlet.http 패키지그리고 javax.servlet.jsp 패키지는자동적으로 import 된다. 9/23
- session 속성주어진 JSP 페이지의세션 (session) 관리처리여부를지정하고자하는경우사용된다. true 또는 false 값을지정한다. 기본값은 true 이기때문에모든페이지들은자동적으로세션을생성하게된다. 특별히세션처리를하지않으려는경우에는이속성의값을 false 로지정한다. - buffer 속성 JSP 페이지의버퍼출력을조정한다. 버퍼출력를하지않고 HTTP 응답을클라이언트로바로보내려면이속성의값을 none 으로할당해준다. buffer 속성의기본값은 8kb 로서예상되는버퍼크기의최소값으로설정한다. 일정크기의버퍼를미리잡아두는것은클라이언트로부터의요청이들어올때마다 JSP 컨테이너가출력버퍼를생성해야하는부담이없어지고수행성능이높아지게된다. - autoflush 속성이속성도버퍼출력과연관되는속성으로서출력버퍼가 Full 이되었을때의동작을설정한다. 이속성이 true( 기본값 ) 로설정되면출력버퍼가자동적으로비워 (flush) 지며현재의출력버퍼의내용이클라이언트로전송된다. autoflush 속성을 false 로설정하면출력버퍼가 Full 이되어도버퍼를비우지않으며예외를발생시키게된다. - isthreadsafe 속성 JSP 가 Servlet 으로변환될때, SingleThreadModel 의추가상속여부를결정한다. 이 속성의값이 false 이면 SingleThreadModel 을추가상속하게된다. - info 속성 페이지작성자가페이지의역할을설명하는도큐먼트문자열을추가할수있다. 일반적으로 작성자에대한정보와버전, 저작권등에대한정보를정의한다. - errorpage 속성 JSP 수행하는도중오류가발생하였을때대신처리될파일을설정하는속성이다. 대신 처리될파일의상대 URL 을지정한다. - contenttype 속성 JSP 페이지가생성하는응답의 MIME(Multipurpose Internet Mail Extension) 타입을 10/23
지정한다. 클라이언트로응답되는 JSP 파일의출력결과가어떠한형식의문서인지를알려준다. 대부분의 MIME 타입은 text/html, text/xml, text/plain 등이쓰인다. contenttype 속성은 JSP 페이지에서응답될문자집합에대한정보를지정하는용도로도사용된다. MIME 타입뒤에세미콜론 (;) 을추가하고 charset= 을추가한다음문자집합이름을붙여주면된다. - iserrorpage 속성 해당페이지가오류페이지로동작할수있는여부를결정한다. 이속성의값이 true 라는 것은현재페이지에서 exception 내장객체변수를사용할수있는결과가된다. - pageencoding 속성응답되는결과의문자집합에대한정보를지정하는용도로사용된다. 생략했을때의디폴트값은 ISO-8859-1 이므로출력결과에한글이포함되어있는경우에는 EUC-KR 설정한다. 물론 contenttype 속성에 text/html; charset=euc-kr 값을추가하여해결할수도있다. - iselignored 속성 JSP 에서 EL() 표현문의사용여부를결정한다. true 이면 JSP 파일내에구현된 EL 표현문 (${...}) 이컨테이너에의해무시된다. 3) include 지시문 JSP 문장들이번역 (translate) 될때다른코드또는텍스트를포함시키고자하는경우 사용되는지시문이다. 다음과같은구문을사용하는지시문이다. <%@ include file= relativeurl %> include 될파일은 file 이라는속성에상대 URL 을지정하며이파일의내용이 page 지시문위치에대체되는결과가된다. 상대 URL 이란동일한 Web Application 에존재하는파일에대한 URL 을의미하므로프로토콜, 서버주소, 포트번호모두생략하고대상파일의 패스만을지정하는데제일앞에 Wab Application 을알리는패스 ( 컨텍스트패스 ) 를 생략하여야한다. 다음과같은 URL 을지정할수있다. <%@ include file= /test.html %> <%@ include file= /jspsrc/example1.jsp %> <%@ include file= example1.jspf %> 11/23
include 지시문의사용회수에는제한이없으며중첩하여지정하는것도가능하다. 즉, 한 JSP 페이지에서다른 JSP 페이지를포함하고포함된 JSP 페이지가또다른 JSP 페이지를 포함하는처리가가능하다. 다른파일안에 include 되는용도로만사용되는파일은확장자를.jspf 로지정하는것이좋다. jspf 는 JSP Fragment 의약어로다른 JSP 의일부분이다라는의미로해석할수있으며확장자만보더라도완전한 JSP 파일이아니며 include 용도의파일이다는것을알수있기때문이다. include 지시문으로포함되는파일의내용이수정되면 JSP 가요청될때다시변환이발생된다. 즉 A.jsp 에서 B.jsp 를 include 지시문으로처리한경우 A.jsp 를부라우저로요청하면 A.jsp 안에 B.jsp 의내용을포함하여 Servlet 으로의변환이발생되고수행된다. 이후 A.jsp 또는 B.jsp 의내용이수정되면 A.jsp 를브라우저로요청하였을때 A.jsp 안에 B.jsp 의내용이포함되어 Servlet 으로변환하는과정이다시처리된다. (5) 지시문관련예제들 page 지시문의일부속성 (import, errorpage, iserrorpage) 과 include 지시문관련예제들을점검하고수행결과를확인해본다. [ 예제 1 ] page 지시문에서 import 속성을이용하여 java.util 패키지를 import 처리하고있는예제이다. JSP 예제 (example6.jsp) 1 2 3 4 5 6 7 8 9 10 <%@ page import="java.util.*" contenttype="text/html; charset=euc-kr" %> <HTML> <BODY> <% String[] days = new String[] {" 일요일 ", " 월요일 ", " 화요일 ", " 수요일 ", " 목요일 ", " 금요일 ", " 토요일 "}; Calendar calendar = Calendar.getInstance(); Date trialtime = new Date(); calendar.settime(trialtime); 12/23
11 12 13 14 int day = calendar.get(calendar.day_of_week); %> <H3> 오늘의요일 : <%= days[day] %></H3> </BODY> </HTML> 1 행 : page 지시문태그의 import 속성에 java.util.* 를지정했으므로 java.util 패키지의어 떠한 API 도 JSP 안에서사용할수있게된다. 다음은 example6.jsp 를브라우저로요청한결과화면이다. [ 예제 2 ] 브라우저로부터 2 개의숫자값에대한 Query 문자열을전달받아나눗셈을처리한결과를브라우저로응답하는예제이다. JSP 예제 (example7.jsp) 1 2 3 4 5 6 7 8 9 10 11 12 13 <%@ page contenttype="text/html; charset=euc-kr" %> <HTML> <HEAD> <TITLE> 지시문 JSP 예제 </TITLE> </HEAD> <BODY> <H3> 나눗셈연산을처리한결과입니다.</H3> <% int su1 = Integer.parseInt(request.getParameter("num1")); int su2 = Integer.parseInt(request.getParameter("num2")); %> <H4> <%= su1 %> / <%= su2 %> = <%= su1/su2 %> </h4> 13/23
14 </BODY> </HTML> 9-10 행 : request.getparameter( num1 ) 은 Query 문자열을추출하는기능을수행한다. request 는내장객체변수로서 HttpServletRequest 객체를참조하게된다. Integer.parseInt() 메서드의기능은숫자문자열을정수형숫자로변환하는기능을수행한다. Query 문자열로숫자가전달될때에는숫자문자열로전달되므로사용하기전에이렇게숫자로변환하는작업을처리해야한다. 다음은 example7.jsp 가정상적으로수행된결과화면이다. 200 을 20 으로나눈결과가 출력되었다. 다음은 example7.jsp 을브라우저로요청했을때오류가발생한결과화면이다. Query 문자열을전달하지않고요청하면 Integer.parseInt() 메서드호출시 null 을가지고수행하게되므로 NumberFormatException 이발생하게되어다음과같은오류화면이출력된다. 이화면은 WAS 에의해출력되는내용이다. 14/23
[ 예제 3 ] page 지시문에서 errorpage 속성을이용하여실행시오류가발생되면 error.jsp 의 수행결과를대신응답하고있는예제이다. error.jsp 에서는 exception 내장객체변수를 사용하기위하여 iserrorpage 속성을 true 로설정하고있다. JSP 예제 (example8.jsp) 15/23
1 2 3 4 5 6 7 8 9 10 11 12 13 14 <%@ page contenttype= text/html; charset=euc-kr errorpage= error.jsp %> <HTML> <HEAD> <TITLE> 지시문 JSP 예제 </TITLE> </HEAD> <BODY> <H3> 나눗셈연산을처리한결과입니다.</H3> <% int su1 = Integer.parseInt(request.getParameter( num1 )); int su2 = Integer.parseInt(request.getParameter( num2 )); %> <H4> <%= su1 %> / <%= su2 %> = <%= su1/su2 %> </h4> </BODY> </HTML> 1 행 : page 지시문태그의 errorpage 속성에 error.jsp 를지정하여실행도중에실행 오류가발생하면 error.jsp 의수행결과를대신응답하도록하고있다. 이때 errorpage 속성에사용가능한자원의종류로는제한이없다. JSP 예제 (error.jsp) 1 2 3 4 5 6 7 8 9 10 11 12 <%@ page contenttype="text/html; charset=euc-kr" iserrorpage="true" %> <HTML> <HEAD><TITLE> 오류발생 </TITLE></HEAD> <BODY> <H3><%= request.getattribute("javax.servlet.error.request_uri") %> 에서오류가발생하였습니다.</H3> 발생된오류의종류 : <%= exception.getclass().getname() %><BR> 발생원인 : <%= exception.getmessage() %><BR> </BODY> </HTML> 16/23
1 행 : page 지시문태그의 iserrorpage 속성에 true 를지정하여 exception 내장객체변수를사용할수있도록속성을설정하고있다. exception 내장객체변수는실행오류발생시생성되는 Exception 객체를참조하게되는변수이다. 5 행 : request.getattribute("javax.servlet.error.request_uri") 호출은오류가발생된대상에대한 URI 정보를추출하는메서드호출이다. 8 행 : exception.getclass().getname() 은발생된오류의종류를추출하는메서드호출이다. 10 행 : exception.getmessage() 는오류가발생될때초기화된오류메시지를추출하는메서드호출이다. 다음은 example8.jsp 을브라우저로요청했을때오류가발생한결과화면이다. Query 문자열을전달하지않고요청하면 Integer.parseInt() 메서드호출시 null 을가지고수행하게되므로 NumberFormatException 이발생하게되어다음과같은오류화면이출력된다. 이화면은 error.jsp 의수행결과가대신응답된것이다. [ 예제 4 ] include 지시문을처리하고있는예제이다. copyright.jspf 의내용을포함하여 Servlet 으로변환하고처리된결과를클라이언트로응답한다. JSP 예제 (example9.jsp) 1 2 3 4 <%@ page contenttype="text/html; charset=euc-kr" %> <HTML> <BODY> <CENTER> 17/23
5 6 7 8 9 <H2> 이번예제는 include 지시자예제입니다. </H2> <%@ include file="copyright.jspf" %> </CENTER> </BODY> </HTML> 6 행 : include 지시자태그를사용하여이위치에 copyright.jspf 의내용을포함하여수행 하도록구현하고있다. include 용 JSP (copyright.jspf) 1 2 3 <FONT color="blue"> All Contents Copyright(c) 2006 Samsung SDS Co.,LTD. </FONT> 다음은 example9.jsp 가수행된결과화면이다. copyright.jspf 의내용이포함되어 ( 파란색부분 ) 처리된결과가브라우저로출력된것을볼수있다. example8.jsp 가변환된 example8_jsp.java 소스의내용도점검하여 cipyright.jspf 의내용이포함되어변환된것을확인해본다. 18/23
4. 표현문, 수행문, 선언문 1) 표현문 (Expression) 과 EL 표현문 JSP 표현문은 <%=... %> 로구현되는스크립트기반태그로서주어진연산식의연산결과를정의된위치에표현하도록하는 JSP 태그이다. EL 표현문은 JSP 2.0 부터정식으로추가된 JSP 표현언어 (EL) 를사용하는표현문으로서 JSP 에서자주활용되는 API 의처리결과를쉽게표현하고 JavaBeans 컴포넌트에저장된데이터를쉽게접근할수있도록지원하는태그이다. 여기에서는표현문만학습하고 EL 표현문은심화과정에서학습한다. 이미학습한예제들중에서도표현문을활용하고있는예제도있어서그렇게생소하지는 않겠지만먼저표현문의사용형식부터점검해보면다음과같다. <%= expression %> 표현문에서중요한것은표현문안에는반드시식 (expression) 이정의되어야한다는것이다. 하나의완전한수행문장이아니고산술식, 호출식, 조건식등식이와야한다. 이유는표현문안에구현되는내용은 Servlet 으로변환될때 out.print() 메서드의매개변수가되기때문이다. 메서드를호출할때지정가능한매개변수로는변수, 상수, 연산식, 호출식등이올수 있는것과같이표현문안에는반드시매개변수로가능한요소만을지정할수있다. 다음은표현문이사용된예이다. <%= new java.util.date().tostring() %> <%= 100 + 200 %> <%= (hours < 12)? AM : PM %> <%= sum/su %> 2) 수행문 (Scriplet) 수행문태그는 JSP 가요청될때마다수행되는 Java 코드를추가하고자할때사용되는코드의블록이다. <% 와 %> 로구성되며이안에는멤버 ( 변수또는메서드 ) 정의와관련된내용을제외하고어떠한수행코드든 ( 예를들어제어문, 오류처리구문등 ) 올수있다. 수행문영역에정의되어있는코드들은클라이언트로부터요청될때마다수행된다. 다음은 19/23
수행문의구현형식이다. <% code fragment %> JSP 에구현되는 Java 수행코드중에서멤버변수선언이나메서드정의는선언문을 사용하고연산의결과를해당위치에표현하고자하는경우에는표현문을사용한다, 그외의 Java 수행코드들은모두수행문을사용하여처리할수있다. 다음은수행문을사용하여현재시간이오전인지오후인지에따라서 Good Morning 또는 Good Afternoon 을출력하는부분예제이다. <% if (Calendar.getInstance().get(Calendar.AM_PM) == Calendar.AM) { %> Good Morinng <% } else { %> Good Afternoon <% } %> 선언문과표현문은용도와사용될수있는문장의종류가결정되어있는반면 수행문 (scriptlet) 은어떠한종류의코드든구문적으로유효한수행코드를정의할수있는 일반적인용도의스크립트기반의태그이다. 수행문에도변수를선언할수있는데수행문에선언된변수는 _jspservice() 의지역변수가 된다. 3) 선언문 (Declaration) 선언문태그는 JSP 의멤버변수를선언하거나메서드를정의하고자하는경우에사용되는특별한목적의태그로서선언문의내용은 Servlet 의멤버가된다. 다음은수행문의구현형식이다. <%! declaration; [ declaration; ]+... %> 대부분의스크립트기반의태그들에구현된코드들은 _jspservice() 메서드의수행코드가 되지만유일하게선언문의내용은 Servlet 의멤버가되는결과가된다. 다음은이것을 소개하고있는그림이다. 20/23
다음은선언문을사용하여멤버변수와메서드를정의하는예이다. <%! private int su = 100; %> <%! int total = 0; float increment = 3.5; %> <%! public static int counter = 0 %> <%! public long fact(long x) { if (x == 0) return 1; else return x * fact(x-1); } %> JSP 의수행흐름에서최초에한번호출 ( 초기화 ) 되고마지막에한번호출 ( 객체해제 ) 되는 jspinit() 과 jspdestroy() 를구현하고자하는경우에도선언문을사용한다. <%! public void jspinit() { // 초기화코드 } public void jspdestroy() { // 객체해제코드 } %> 다음은표현문, 수행문, 선언문에대하여예제이다. 각각의태그가어떠한역할을구현하고 21/23
있는지점검해본다. JSP 예제 (example10.jsp) <%@ page contenttype="text/html; charset=euc-kr" 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 import="java.util.*"%> <HTML> <%! public String getuser(string user){ try { if ( user == null) return " 손님 "; else return new String(user.getBytes("8859_1"), "KSC5601"); } catch (Exception e) { return user; } } %> <BODY> <% String user = getuser(request.getparameter("name")) ; Calendar calendar = Calendar.getInstance(); Date trialtime = new Date(); calendar.settime(trialtime); %> <H3><%= user %> 님!</H3> <H4> 오늘은 <%= calendar.get(calendar.year) %> 에서 <%= calendar.get(calendar.day_of_year) %> 일되는날입니다.</H4> <% if (Calendar.getInstance().get(Calendar.AM_PM) == Calendar.AM) { %> <h3> 오늘하루활기차게시작하세요!</h3> <% } else { %> <h3> 오늘하루마무리잘하세요!</h3> <% } %> </BODY> 22/23
</HTML> 3-14 행 : 선언문태그를사용하여 getuser() 라는메서드를정의하고있다. getuser() 는 Query 문자열의존재여부에따라적절한 user 정보를설정하는 기능을수행한다. 16-21 행 : 수행문태그를사용하여브라우저로부터전송된 Query 문자열을추출하는 기능, Calender 객체생성과 Date 객체생성등을수행하도록구현하였다. 22-24 행 : 표현문태그를사용하여 user 정보, 년도와날짜정보등을브라우저에출력하는 기능을구현하였다. 25 행 : 요청받은시점을기분으로오전인지오후인지를구분하여응답이달리처리되도록 제어문을사용하여구현하였다. 다음은 Query 문자열로 user= 김정현을지정하여 example10.jsp 를요청한결과화면이다. 다음은 Query 문자열을생략하고 example10.jsp 를요청한결과화면이다. 23/23