표현언어 표현언어와커스텀태그 524730-1 2019 년봄학기 5/20/2019 박경신 표현언어 (Expression Language) JSP에서사용가능한새로운스크립트언어 JSP의 PAGE, REQUEST, SESSION, APPLICATION 영역에저장된속성에사용 수치연산, 관계연산, 논리연산자제공 자바클래스메서드호출기능제공 쿠키, 내장객체의속성등 JSP를위한표현언어의내장객체제공 람다식을이용한함수정의와실행 (EL3.0) 스트림 API를통한컬랙션처리 (EL3.0) 정적메소드실행 (EL3.0) 간단한구문때문에표현식 <%= %> 대신사용 <%-- 표현식 --%> <%= member.getaddress().getzipcode() %> <%-- 표현언어 --%> ${member.address.zipcode} 표현언어구문 표현언어는 JSP 스크립트요소 ( 스크립트릿, 표현식, 선언부 ) 를제외한나머지부분에서사용 기본문법 ${expr} 은표현식이실행되는시점에바로값계산 <jsp:include page="/module/${skin.id}/header.jsp" flush= true /> <b>${sessionscope.member.id}</b> 님환영합니다. #{expr} 은값이실제로필요한시점에값계산 JSP 템플릿텍스트에서는사용불가 EL 사용예시 <jsp:setproperty> 태그에 EL 사용 <jsp:setproperty name= box property= perimeter value="${2*box.width + 2*box.height}"/> <jsp:text> 태그에 EL 사용 <jsp:text> Box 둘레 : ${2*box.width + 2*box.height} </jsp:text>
EL 자료형 Boolean 타입 true 와 false 정수타입 0~9 로이루어진정수값 실수타입 0~9로이루어져있으며, 소수점 ('.') 을사용할수있고, 3.24e3과같이지수형으로표현가능 문자열타입 따옴표 ( ' 또는 " ) 로둘러싼문자열. 작은따옴표사용시, 값에포함된작은따옴표는 \' 로입력 \ 기호자체는 \\ 로표시 널타입 null EL 연산자 수치연산자 +, -, *, / ( 또는 div), % ( 또는 mod) 비교연산자 == ( 또는 eq),!= ( 또는 ne), < ( 또는 lt), <= ( 또는 le), > ( 또는 gt), >= ( 또는 ge) 논리연산자 && ( 또는 and), ( 또는 or),! ( 또는 not) empty 연산자 empty < 값 > 값이 null 이면, true 값이빈문자열 ("") 이면, true 값의길이가 0 인배열이나콜렉션이면 true 이외의경우에는 false 비교선택연산자 < 수식 >? < 값 1> : < 값 2> EL 내장객체 EL 내장객체설명 EL 내장객체 pagecontext JSP의 page 기본객체와동일. servletcontext, session, request, response 등의여러객체를참조가능 pagescope pagecontext 기본객체에저장된속성의 < 속성, 값 > 을저장한 Map 객체. ${pagescope. 속성 } 으로값을참조 requestscope request 기본객체에저장된속성의 < 속성, 값 > 을저장한 Map 객체. ${pagescope. 속성 } 으로값을참조 sessionscope session 기본객체에저장된속성의 < 속성, 값 > 을저장한 Map 객체. ${sessionscope. 속성 } 으로값을참조 applicationscope application 기본객체에저장된속성의 < 속성, 값 > 을저장한 Map 객체. ${applicationscope. 속성 } 으로값을참조 param 요청 파라미터의 < 파라미터이름, 값 > 을 저장한 Map 객체. ${param.name} 은 request.getparameter(name) 을대체 paramvalues 요청파라미터의 < 파라미터이름, 값배열 > 을저장한 Map 객체. request.getparametervalues() 처리와동일 header 요청정보의 < 헤더이름, 값 > 을저장한 Map 객체. ${header[ name ]} 은 request.getheader( 헤더이름 ) 와같음 headervalues 요청정보의 < 헤더이름, 값배열 > 을저장한 Map 객체. request.getheaders() 의처리와동일 cookie < 쿠키이름, Cookie> 을저장한 Map 객체. request.getcookies() 의 Cookie 배열의이름과값으로 Map을생성 initparam 초기화파라미터의 < 이름, 값 > 을저장한Map 객체. ${initparam.name} 은 application.getinitparameter(name) 대체 EL 에서객체에접근 ${< 표현1>.< 표현2>} 또는 ${< 표현1>[< 표현2>]} 형식사용 처리과정 1. < 표현1> 을 < 값1> 로변환 2. < 값1> 이 null이면 null을반환 3. < 값1> 이 null이아닐경우 < 표현2> 를 < 값2> 로변환 1. < 값2> 가 null이면 null을반환 4. < 값1> 이 Map, List, 배열인경우 1. < 값1> 이 Map이면 1. < 값1>.containsKey(< 값2>) 가 false이면 null을반환 2. 그렇지않으면 < 값1>.get(< 값2>) 를반환 2. < 값1> 이 List나배열이면 1. < 값2> 가정수값인지검사 ( 정수값이아닐경우에러발생 ) 2. < 값1>.get(< 값2>) 또는 Array.get(< 값1>, < 값2>) 를반환 3. 위코드가예외를발생하면에러를발생 5. < 값1> 이다른객체이면 1. < 값2> 를문자열로변환 2. < 값1> 이이름이 < 값2> 이고읽기가능한프로퍼티를포함하고있다면 프로퍼티의값을반환 3. 그렇지않을경우에러를발생
EL 에서클래스메서드호출하기 클래스에정의한메소드를표현언어로호출하려면 ${ prefixname:functioname() } 먼저접두어 prefixname 으로태그를선언 EL 에서함수를이용하려면다음 3 가지작업을수행 1. 클래스작성 2. EL 함수를정의한 TLD(Tag Library Descriptor) 파일작성 & web.xml 파일에 TLD 파일지정 3. JSP 코드에서 TLD 에정의한함수실행 EL 에서클래스메서드호출하기 클래스의 static 메서드를 EL 에서호출가능 public class ELDateUtil { public static String format(date date) { SimpleDateFormat formatter = new SimpleDateFormat("yyyy- MM-dd"); return formatter.format(date); } } 작업 파일이저장되는폴더 파일이름 클래스작성 [Java Resources: src]/[ 패키지 ] ELDateUtil.java TLD 파일작성 [WebContent]/[WEB-INF]/[tld] ELfunction.tld JSP 파일작성 [WebContent] function.jsp EL 함수를정의한 TLD 파일 <?xml version="1.0" encoding="euc-kr"?> <!-- XML선언문 --> <taglib version="2.1"> <!-- tag 정보 --> <description>el에서함수실행 </description> <tlib-version>1.0</tlib-version> <short-name>elfunction</short-name> <function> <description>date 객체포맷팅 </description> TLD 파일 TLD (Tag Library Descriptor) 사용자정의태그에대한설명을담고있는파일 TLD 구성 XML 선언문 DTD 지정 태그정보 - 사용자정의태그기본정보기술 사용자정의태그 - JSP에서사용할사용자정의태그항목기술 <name>dateformat</name> <!-- EL에서사용될함수명 --> <function-class>el.eldateutil</function-class> <function-signature> java.lang.string format(java.util.date) </function-signature> </function> </taglib>
TLD 파일 태그정보 사용자정의태그기본정보기술 태그 설명 <tlib-version> 태그라이브러리버전으로개발자에의해설정되는부분 <jsp-version> 적용되는 JSP 버전 <short-name> 현재태그라이브러리의간단한이름 <uri> taglib을고유한것으로만들어주는 URI 정보 <display-name> 출력에사용되는 taglib 이름 <tag> 사용자정의태그가위치하는부분 TLD 파일 사용자정의태그 JSP 에서사용할사용자정의태그항목기술 태그 <name> <tag-class> <body-content> 설명태그이름으로사용자정의태그핸들러와연결사용자정의태그핸들러클래스 태그내에다른태그를가질것인지, JSP 문장이올수있는지지정. empty : body 가없는태그로 <xxx /> 형태로사용. JSP : body 내용에 JSP 코드가올수있음. <xxx> JSP 코드 </xxx> tag-dependent : 태그핸들러에의해처리. 또다른사용자정의태그올수있음. <description> 태그라이브러리에대한설명이들어가는부분 web.xml 파일에 TLD 파일지정 JSP 에서 EL 함수호출 <web-app... version="2.5"> <jsp-config> <taglib> <taglib-uri> /WEB-INF/tlds/ELfunction.tld </taglib-uri> <taglib-location> /WEB-INF/tlds/ELfunction.tld </taglib-location> </taglib> </jsp-config> </web-app> JSP 에서사용될 URI TLD 파일경로 <%@ taglib prefix="elfunc" uri="/web-inf/tlds/elfunction.tld" %> <% java.util.date today = new java.util.date(); request.setattribute("today", today); %> <html> <head><title>el 함수호출 </title></head> <body> 오늘은 <b>${elfunc:dateformat(today)}</b> 입니다. prefix:tld 에정의된함수명 ()
EL 비활성화 web.xml 파일에비활성화옵션설정 <jsp-config> <jsp-property-group> <url-pattern>/oldversion/*</url-pattern> <el-ignored>true</el-ignored> </jsp-property-group> </jsp-config> * <deferred-syntax-allowed-as-literal> 를이용한 #{expr} 을문자열로처리 page 디렉티브에서설정 iselignored 속성을 true 로하면 EL 무시 deferredsyntaxallowedasliteral 속성을 true로하면 #{expr} 을문자열로처리 web.xml 파일버전에따라자동비활성화 서블릿 2.3 버전 : EL 지원하지않음 서블릿 2.4 버전 : ${expr} 형식의 EL 지원 EL 용법 Request 나 session 속성으로전달한값을출력 액션태그나커스텀태그의속성값 <jsp:include page= /lo/${layout.module}.jsp flush= true 함수의호출 코드의간결함및가독성향상 커스텀태그 (Custom Tag) <% while(iter.hasnext()) { HashMap data = (HashMap)iter.next(); %> <form name=<%=data.get("gb_id") %> action=guestbook_edit_form.jsp method=post> <input type=hidden name="gb_id" value="<%=data.get("gb_id") %>" <table cellpadding=5 cellspacing=0 border="1" width=400> <tr> <td bgcolor="#99ccff" height="23" > 작성자 </td> <td><%= data.get("gb_name") %></td> <td bgcolor="#99ccff" height="23" > 작성일 </td> <td><%= data.get("gb_date") %></td> </tr> <tr> <td bgcolor="#99ccff" height="23">email</td> <td colspan=3><%= data.get("gb_email") %></td> </tr> <tr> <td colspan=4><%= data.get("gb_contents") %></td> </tr> <tr> <td colspan=4> 비밀번호 <input type=password name=gb_passwd size=6> <input type=submit value=" 수정 / 취소 " ></td> </tr> </table> </form> <P> <% } // end while % 사용자정의태그사용전 사용자정의태그사용후 /WEB-INF/tags/getList.tag <%taglib prefix= tf tagdir= /WEB-INF/tags %> <html> <body> <tf:getlist /> </body> </html> 커스텀태그 (Custom Tag) JSP 액션태그와같은태그를추가할수있는기능 JSTL도커스텀태그라이브러리의한종류 커스텀태그의장점 재사용성향상 한번작성한커스텀태그는 JSP 컨테이너에서사용가능 쉽고단순한 JSP 제작 커스텀태그를사용하여쉽게 JSP 작성 코드가독성향상 스크립트코드를줄일수있기때문 커스텀태그의종류 JSP 1.2 스타일커스텀태그 JSP 2.0 이상의 SimpleTag를사용한커스텀태그 JSP 2.0 이상의태그파일을사용한커스텀태그 ( 구현이쉬움 )
태그파일 (tag file) JSP 문법을사용해서커스텀태그로동작할수있도록만들어진소스코드 서블릿보다 JSP가작성하기쉽듯이, 클래식태그나 SimpleTag보다태그파일이작성하기쉬움 JSP와동일한방식으로태그파일작성 JSP 소스코드를서블릿클래스로변환하듯이, 태그파일을커스텀태그클래스로변환 커스텀태그의표준인터페이스를구현하거나클래스를상속받아서구현 소스코드상태그대로설치해야하므로소드코드가공개 taglib 지시어를사용해서태그파일에서다른커스텀태그를사용할수있음 태그파일의위치및참조 위치및확장자 WEB-INF/tags 디렉터리및하위디렉터리에위치 확장자.tag 또는.tagx를갖는파일만태그파일로인식 태그파일의이름은커스텀태그의이름이됨 uri 속성대신 tagdir 속성을사용. 태그파일이위치한디렉터리의경로를입력하고해당디렉터리에있는태그파일의이름은각각하나의커스텀태그이름이됨 JSP에서태그파일참조 <%@ taglib prefix="tf" tagdir="/web-inf/tags/util" %>... <tf:removehtml...>...</tf:removehtml> /WEB-INF/tags/util 디렉터리의 removehtml.tag 파일을 <tf:removehtml> 태그의구현코드로사용 태그파일에서사용할수있는지시어 tag 디렉티브의주요속성 디렉티브 tag taglib include attribute variable 설명 JSP 페이지의 page 지시어와동일. tag 지시어는태그파일의정보를명시 JSP 페이지와마찬가지로태그파일에서사용할태그라이브러리를명시할때사용 JSP 페이지와마찬가지로태그파일에특정한파일을포함시킬때사용. 태그파일에포함되는파일은태그파일에알맞은문법으로작성되어야함 태그파일이커스텀태그로사용될때입력받을속성을명시 EL 변수로사용될변수에대한정보를지정 속성 display-name body-content dynamic-attributes 설명태그파일을도구에서보여줄때사용될이름지정몸체내용의종류를지정. empty, tagdependent, scriptless 중한가지사용. 기본값은 scriptless 동적속성을사용할때, 속성의 < 이름, 값 > 이저장될 Map 객체를 page 범위의속성에저장할때사용할이름을명시. EL에서변수이름으로사용가능 import page 지시어의 import 속성과동일 ( 선택 ) pageencoding page 지시어의 pageencoding 속성과동일 ( 선택 ) iselignored page 지시어의 iselignored 속성과동일 ( 선택 ) deferredsyntaxallowedasli teral(2.1) trimdirectivewhitespaces (2.1) page 지시어의 deferredsyntaxallowedasliteral 속성과동일 ( 선택 ) #{ 문자가문자열값으로사용되는것을허용여부를지정 page 지시어의 trimdirectivewhitespaces 속성과동일 ( 선택 ) 출력결과에서템플릿텍스트의공백문자를제거할지의여부를지정
태그파일의내장객체 jspcontext pagecontext가제공하는 setattribute(), getattribute() 메서드를그대로제공하며, 각속성과관련된작업을처리 request JSP 페이지의 request 기본객체와동일 response JSP 페이지의 response 기본객체와동일 session JSP 페이지의 session 기본객체와동일 application JSP 페이지의 application 기본객체와동일 out JSP 페이지의 out 기본객체와동일 attribute 지시어의기본사용법 attribute 지시어의기본사용법 name : 속성이름. 태그파일에서변수명으로사용가능 required : 속성의필수여부를지정 ( 기본값은 false) type : 속성값의타입을지정 ( 기본값은 java.lang.string) <%-- header.tag --%> <%@ tag... %> <%@ attribute name="title" required="true" %> <%@ attribute name="level" type="java.lang.integer" %>... // level 에따른 starttag= <h1> & endtag= </h1> 셋팅 <%=starttag %>${title}<%= endtag%> JSP 에서의사용법 <tf:header title="<%= article.gettitle() %>" level= 1 /> <tf:header title="${article.title}" /> <tf:header title=" 이글의제목 " /> <jsp:attribute> 액션태그이용속성값전달 태그파일의 attribute 지시어의 fragment 속성이 true 경우 JSP 에서속성에값을전달할때 <jsp:attribute> 사용해야함 태그파일에서는 <jsp:invoke> 를이용해서설정한속성값사용 <%-- header.tag --%> <%@ attribute name="title" fragment="true" %> // 첫번째, <jsp:attribute> 의몸체내용을그대로처리하여출력 <jsp:invoke fragment="title" /> // 두번째, <jsp:attribute> 의몸체내용을처리한결과를 // 지정한영역의속성에저장 <jsp:invoke fragment="title" var="rs" scope="page" /> ${pagescope.rs} <jsp:attribute> 액션태그로값지정 <tf:header> attribute 몸체에서는텍스트, EL, <jsp:include> 사용가능 <jsp:attribute name="title">${article.title}</jsp:attribute> </tf:header> 동적속성 attribute 디렉티브로지정하지않은속성을 Map에저장 상황에따라서동적으로속성을추가할때사용 tag 디렉티브의 dynamic-attributes 속성에동적속성을저장할변수명지정 ( 변수타입은 Map) 동적속성들은 java.util.map 타입의 EL 변수에저장되므로 dynamic-attributes 속성에서명시한 Map 이름으로 Map EL 변수를통해서접근가능 <%@ tag dynamic-attributes="dynamicmap" %>... ${dynamicmap.attrname}.. <!-- attrname 속성값 -->
태그파일이용커스텀태그에몸체내용전달하기 방법 1 - 태그몸체 <tf:sometagfile attr1=" 속성값 "> 여기에몸체내용을입력한다. </tf:sometagfile> 태그파일에서몸체내용사용하기 EL 및태그가처리된몸체내용사용하기 <%@ tag body-content="scriptless" %> <!-- 몸체로전달받은내용을사용 --> <jsp:dobody /> 방법2 - <jsp:body> 액션태그사용 태그파일이용커스텀태그의몸체에는표현식사용불가 <tf:sometagfile attr1=" 속성값 "> <jsp:attribute name="attr2">value</jsp:attribute> <jsp:body> 여기에몸체내용을입력한다. </jsp:body> </tf:sometagfile> 몸체내용을데이터로사용하기 <%@ tag body-content="tagdependent" pageencoding="euc-kr" %> <jsp:dobody var="bodytext" /> variable 지시어와 name-given 을이용한변수추가 variable 지시어를사용해서태그파일을사용하는 JSP/ 태그파일에서사용할 EL 변수추가 variable 지시어의기본문법 <%@ variable name-given="el 변수이름 " variable-class=" 변수타입 " scope=" 변수범위 " /> name-given 속성및 scope 속성에따른 EL 변수특징 name-from-attribute 속성을이용한변수생성 특정속성의값을생성할변수명으로사용 name-from-attribute 속성의사용법 <%@ attribute name="var" rtexprvalue="false" required="true" type="java.lang.string" %> <%@ variable alias="localname" name-from-attribute="var" scope=" 영역 " %>... <c:set var="localname" value="..." /> name-from-attribute 속성에명시한속성의제약조건 rtexprvalue 속성의값이 false required 속성이 true type 속성의값은 java.lang.string alias 속성 : 태그파일에서생성할변수에접근할때사용할 EL 변수명
변수동기화처리 AT_BEGIN NESTED AT_END 태그시작아무것도안함 EL 변수저장아무것도안함 <jsp:dobody> 실행전 태그 페이지복사태그 페이지복사아무것도안함 태그끝태그 페이지복사 EL 변수복구태그 페이지복사