1 / 46

Java Web Programming

Java Web Programming. 5 일차. Custom Tag 란. 사용자 정의 태그 useBean, param, setProperty 등의 미리 정의되어있는 태그를 액션 태그라고 한 다 . 커스텀 태그는 액션 태그의 한계성을 극복하여 사용자가 특성에 맞게 스스로 태그를 설계 이렇게 필요한 태그의 특성 , 태그 해석의 방식 , 그리고 태그들을 모아 라이브러리로 묶어 필요한 곳에 사용 . 이 를 Tag Library 라고 한 다. Custom Tag library 의 구성.

winona
Download Presentation

Java Web Programming

An Image/Link below is provided (as is) to download presentation Download Policy: Content on the Website is provided to you AS IS for your information and personal use and may not be sold / licensed / shared on other websites without getting consent from its author. Content is provided to you AS IS for your information and personal use only. Download presentation by click this link. While downloading, if for some reason you are not able to download a presentation, the publisher may have deleted the file from their server. During download, if you can't get a presentation, the file might be deleted by the publisher.

E N D

Presentation Transcript


  1. Java Web Programming 5일차

  2. Custom Tag란 • 사용자 정의 태그 • useBean, param, setProperty 등의 미리 정의되어있는 태그를 액션 태그라고 한다. 커스텀 태그는 액션 태그의 한계성을 극복하여 사용자가 특성에 맞게 스스로 태그를 설계 • 이렇게 필요한 태그의 특성, 태그 해석의 방식, 그리고 태그들을 모아 라이브러리로 묶어 필요한 곳에 사용. 이를Tag Library라고 한다.

  3. Custom Tag library의 구성 • 태그 핸들러 클래스(Tag Handler Class) 태그 핸들러 클래스(Tag Handler Class)는 태그의 의미와 행동을 정의하는 클래스로, JSP 페이지에서 커스텀 태그를 사용할 때 어떤 일을 할 것인지 정의하고, 처리한다. • 태그 라이브러리 서술파일(Tag Library Descriptor TLD) TLD는 태그 라이브러리를 설명해주는 파일로, XML의 표준형식을 따르는 XML 문서로서, XML Element 이름과 태그의 구현을 연결시키는 역할을 한다. 즉, JSP에서 태그가 호출되었을 때 그 태그를 처리하는 태그 핸들러로 연결시켜 주어 관련된 처리를 실행하게 한다. • 태그를 사용하는 JSP 파일 커스텀 태그를 사용하는 JSP 파일로서, 태그를 사용하기 전에 taglib 지시자로 태그의 위치와 접두어를 지정해야 한다.

  4. 태그 핸들러 클래스(Tag Handler Class)

  5. Tag 인터페이스 Tag 인터페이스는 JSP 페이지와 태그 핸들러 사이를 연결하는 기본적인 프로토콜과 메서드를 정의한다. 이것은 단순하고 기본적인 커스텀 태그를 구현하기 위해 만들어졌으며, 커스텀 태그의 Body 부분은 건드리지 않는 것을 원칙으로 한다. 즉, Tag 인터페이스는 태그에 Body 부분이 없거나, Body 부분을 그대로 나타내는 경우에 사용될 수 있다. Tag 인터페이스는 태그 핸들러의 주기를 정의하며, 태그가 시작하고 끝날 때 호출되는 메서드들을 정의하는데 사용한다. • BodyTag 인터페이스 BodyTag는 Tag 인터페이스를 상속한 인터페이스로 태그의 몸체를 다룰 수 있는 메서드를 제공한다. Tag 인터페이스가 제공하는 메서드 외에 부가적인 메서드를 제공합니다.

  6. TagSupport 클래스 TagSupport는 Tag 인터페이스를 구현하는 클래스로, 새로운 태그 핸들러를 생성하는 기본이 되는 클래스입니다. Tag 인터페이스의 메서드 외에 setter,/getter 메서드 등, 태그를 다룰 때 유용하게 쓰일 수 있는 메서드들을 제공하고 있다. • BodyTagSupport 클래스 BodyTagSupport는 TagSupport 클래스를 상속 받고 BodyTag 인터페이스를 구현한 클래스. 이 클래스도 역시 상속 받고 구현된 것 이외에 getBodyContent 메서드등, 여러가지 유용한 메서드들을 가지고 있다. 많은 태그 핸들러들이 BodyTagSupport 클래스를 상속 받아서 몇 가지 소수의 메서드만 재정의해 쓰는 방식으로 만들어 진다. • BodyContent 클래스 BodyContent는 JspWriter 클래스를 상속 받는 추상 클래스로서, 태그의 바디부분을 처리한 것을 캡슐화하고 있는 클래스. 즉, BodyContent의 내용은 Body 부분 처리의 결과로, 그것을 핸들러가 이용할 수 있다. 따라서 BodyContent는 그 내용을 스트링으로 변환하거나, 읽거나, 지울 수 있는 메서드를 가지고 있다.

  7. <간단한 태그 핸들러> HelloTag.java package tags; import java.io.*; import javax.servlet.jsp.*; import javax.servlet.jsp.tagext.*; public class HelloTag implements Tag {   PageContext pageContext;   Tag parent;   public int doStartTag() throws JspException{     try{       JspWriter out = pageContext.getOut();       out.write("Hello Tag!!!");     }catch(IOException e){}     return SKIP_BODY;   }   public int doEndTag() throws JspException{     return EVAL_PAGE;   }

  8. public void release(){}   public void setPageContext(PageContext pg){     pageContext = pg;   }   public void setParent(Tag p){     parent = p;   }   public Tag getParent(){     return parent;   } }

  9. 태그 라이브러리 서술파일(Tag Library Descriptor TLD) noveltag.tld <?xml version="1.0" encoding="ISO-8859-1" ?> <!DOCTYPE taglib         PUBLIC "-//Sun Microsystems, Inc.//DTD JSP Tag Library 1.2//EN"   "http://java.sun.com/j2ee/dtd/web-jsptaglibrary_1_2.dtd"> <taglib>   <tlib-version>1.0</tlib-version>   <jsp-version>1.2</jsp-version>   <short-name>noveljsp</short-name>   <uri></uri>   <description>   novel jsp simple Hello Tag   </description>   <tag>     <name>hello</name>     <tag-class>tags.HelloTag</tag-class>     <description>say Hello~ </description>   </tag>    </taglib>

  10. JSP에서 기본적인 태그의 사용 < 기본적인 커스텀 태그를 사용하는JSP> hellotag.jsp <%@ page contentType="text/html; charset=euc-kr" %>  <%@ taglib uri ="noveltag.tld" prefix = "noveljsp" %>  <html><body>  <h1><noveljsp:hello /></h1>  </body></html>

  11. 속성을 가지는 태그 <속성 사용을 위한 태그 핸들러 > WelcomeTag.java package tags; import java.io.*; import javax.servlet.jsp.*; import javax.servlet.jsp.tagext.*; public class WelcomeTag extends TagSupport {   private String name = "";   private String nation = "";   public int doStartTag() {     try{       JspWriter out = pageContext.getOut();       out.print(name + " from " + nation + "<br>");       out.print("welcome to Korea!!!");     }catch(IOException e){}     return SKIP_BODY;   }

  12.  public void setName(String name){     this.name = name;   }   public void setNation(String nation){     this.nation = nation;   } }

  13. noveltag.tld <!&#8212;위에는 이미 정의된 부분 생략 --> <tag>     <name>welcome</name>     <tag-class>tags.WelcomeTag</tag-class>     <description>say welcome~ </description>     <attribute>       <name>name</name>       <required>true</required>     </attribute>     <attribute>       <name>nation</name>       <required>true</required>     </attribute>   </tag> <!--  WelcomeTag를 위해 추가된 부분 --> </taglib> welcometag.jsp <%@ page contentType="text/html; charset=euc-kr" %> <%@ taglib uri ="noveltag.tld" prefix = "noveljsp" %> <html><body> <h1><noveljsp:welcome name = "Alice" nation = "Wonderland"/></h1> </body></html>

  14. Body를 가지는 태그 <prefix:tagname> body <prefix:tagname> doStartTag 메서드의 리턴 값 • SKIP_BODY : 바디의 내용 유무에 상관없이 무시 • EVAL_BODY_INCLUDE : 바디 내용을 포함 처리 가능하게 함

  15. FontMagic.java package tags; import java.io.*; import javax.servlet.jsp.*; import javax.servlet.jsp.tagext.*; public class FontMagic extends TagSupport {   String color = "black";   String size = "3";   public int doStartTag() {     try{       JspWriter out = pageContext.getOut();       out.print("<font color="+color+" size = "+ size + ">");     }catch(IOException e){}     return EVAL_BODY_INCLUDE;   }   public int doEndTag(){     try{       JspWriter out = pageContext.getOut();       out.print("</font></br>");     }catch(IOException e){}     return EVAL_PAGE;   }   public void setColor(String color){     this.color = color;   }   public void setSize(String size){     this.size = size;   } }

  16. noveltag.tld <! ... ... 앞부분 생략 --> <tag>     <name>fontmagic</name>     <tag-class>tags.FontMagic</tag-class>     <description>adjust font color and font size </description>     <attribute>       <name>color</name>       <required>false</required>     </attribute>     <attribute>       <name>size</name>       <required>false</required>     </attribute>   </tag> <!--  여기까지 FontMagic을 위해 추가된 부분 --> </taglib>

  17. fontmagic.jsp <%@ page contentType="text/html; charset=euc-kr" %> <%@ taglib uri ="noveltag.tld" prefix = "noveljsp" %> <html><body> <noveljsp:fontmagic> 디폴트 값이군요. </noveljsp:fontmagic> <noveljsp:fontmagic color="blue" size="5"> 파란색에 5크기입니다. </noveljsp:fontmagic> <noveljsp:fontmagic color="red" size="7"> 빨강색에 7크기입니다. </noveljsp:fontmagic> </body></html>

  18. 표현 언어란 표현 언어(Expression Language)는 값을 표현하는 데 사용되는 새로운스크립트 언어로서 JSP의 기본 문법을 보완하는 역할을 한다 [표현 언어가 제공하는 기능] • JSP의 네 가지 기본 객체가 제공하는 영역의 속성 사용 • 집합 객체에 대한 접근 방법 제공 • 수치 연산, 관계 연산, 논리 연산자 제공 • 자바 클래스 메소드 호출 기능 제공 • 표현언어만의 기본 객체 제공 JSP 2.0 Programming

  19. 표현 언어의 표현 방법 Syntax ${expr} expr - 표현언어가 정의한 문법에 따라 값을 표현하는 식 Example <jsp:include page="/module/${skin.id}/header.jsp" flush="true" /> <b>${sessionScope.member.id}</b>님 환영합니다. 표현언어는 JSP의 스크립트 요소(스크립트릿, 표현식, 선언부)를 제외한 나머지 부분에서 사용될 수 있으며, 표현식을 통해서 표현식보다 편리하게 값을 출력할 수 있다. JSP 2.0 Programming

  20. 표현 언어의 기본 객체 JSP 2.0 Programming

  21. 표현 언어의 기본 객체 사용 예 Example <%@ page contentType = "text/html; charset=euc-kr" %> <% request.setAttribute("name", "최범균"); %> <html> <head><title>EL Object</title></head> <body> 요청 URI: ${pageContext.request.requestURI} <br> request의 name 속성: ${requestScope.name} <br> code 파라미터: ${param.code} </body> </html> pageContext.getRequest() .getRequestURI() reqeust.getAttribute("name") request.getParameter("code") JSP 2.0 Programming

  22. 자바 메소드 호출하기: 클래스 작성 ※ 표현언어에서 호출할 메소드는 static 메소드이어야 한다. Example package madvirus.util; import java.util.Date; import java.text.SimpleDateFormat; public class DateUtil { private static SimpleDateFormat formatter = new SimpleDateFormat("yyyy-MM-dd"); public static String format(Date date) { return formatter.format(date); } } JSP 2.0 Programming

  23. 자바 메소드 호출하기: TLD 파일 작성 Example <?xml version="1.0" encoding="euc-kr" ?> <taglib ... version="2.0"> ... <function> <description>Date 객체 포맷팅</description> <name>dateFormat</name> <function-class> madvirus.util.DateUtil </function-class> <function-signature> java.lang.String format( java.util.Date ) </function-signature> </function> </taglib> EL에서 사용할 이름 메소드를 정의하고 있는 클래스의 이름 함수의 시그너쳐 JSP 2.0 Programming

  24. 자바 메소드 호출하기: web.xml에 TLD 내용 추가 Example <?xml version="1.0" encoding="euc-kr"?> <web-app ... version="2.4"> ... <taglib> <taglib-uri> /WEB-INF/tlds/el-functions.tld </taglib-uri> <taglib-location> /WEB-INF/tlds/el-functions.tld </taglib-location> </taglib> </web-app> JSP 2.0 Programming

  25. 자바 메소드 호출하기: EL에서 메소드 호출 Example <%@ page contentType = "text/html; charset=euc-kr" %> <%@ page session="true" %> <%@ taglib prefix="elfunc" uri="/WEB-INF/tlds/el-functions.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> 입니다. </body> </html> web.xml의 <taglib-uri> 태그에 정의한 이름 EL에서 메소드 호출 TLD의 <name> 태그에 정의한 이름 JSP 2.0 Programming

  26. 표현 언어의 주요 사용법 • 함수호출을 통한 값의 포매팅 • ${elfunc:dateFormat(date) } • 액션 태그나 커스텀 태그의 값으로 사용 • <jsp:include page="/layout/${layout.moduleName}.jsp" /> • 기본 객체 영역에 저장된 값의 출력 • ${requestScope.name} vs <%= request.getAttribute("name") %> JSP 2.0 Programming

  27. 표현 언어 비활성화(1): web.xml에 비활성화 옵션 Code <?xml version="1.0" encoding="euc-kr"?> <web-app ... version="2.4"> ... <jsp-config> <jsp-property-group> <url-pattern>*.jsp</url-pattern> <el-ignored>true</el-ignored> </jsp-property-group> </jsp-config> </web-app> 지정한 패턴에 속하는 JSP는 표현 언어가 비활성화된다. JSP 2.0 Programming

  28. JSTL이란? JSTL(JSP Standard Tag Library)은 JSP 페이지에서 논리적인 판단, 반복문의 처리, 데이터베이스 등의 처리를 하는 코드를 깔끔하게 작성하기 위해서 작성한 표준화된 커스텀 태그이다. <% if (list.size() > 0) { for (int i = 0 ; i < list.size() ; i++) { Data data = (Data) list.get(i); %> <%= data.getTitle() %> ... <% } } else { %> 데이터가 없습니다. <% } %> JSTL을 사용함으로써 스크립트를 사용할 때의 복잡한 코드를 깔끔하게 작성할 수 있게 된다. <c:if test="!empty ${list}"> <c:foreach varName="data" list="${list}"> ${data.title} </c:foreach> </c:if> <c:if test="empty ${list}"> 데이터가 없습니다. </c> JSP 2.0 Programming

  29. JSTL이 제공하는 태그의 종류 JSP 2.0 Programming

  30. 코어 태그 JSP 2.0 Programming

  31. 코어태그: 변수 지원 태그 - set, remove 변수 설정: 지정한 영역에 변수를 생성한다. Syntax <c:set var="varName" scope="session" value="someValue" /> <c:set var="varName" scope="request"> some Value </c:set> • var - EL에서 사용될 변수명 • scope - 변수값이 저장될 영역(page, request, session, application) • value - 변수값 변수 제거 Syntax <c:remove var="varName" scope="request" /> JSP 2.0 Programming

  32. 코어태그: 변수 지원 태그 - 프로퍼티, 맵의 처리 Syntax <c:set target="${some}" property="propertyName" value="anyValue" /> some 객체가 자바빈일 경우: some.setPropertyName(anyvalue) some 객체가 맵(map)일 경우: some.put(propertyName, anyValue); • target -<c:set>으로 지정한 변수 객체 • property - 프로퍼티 이름 • value - 새로 지정할 프로퍼티 값 JSP 2.0 Programming

  33. 코어 태그: 흐름제어 태그 - if Syntax <c:if test="조건"> ... ... </c:if> test의 조건이 true이면 몸체 내용을 처리한다. Example <%@ taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core" %> <c:if test="true"> 무조건 수행<br> </c:if> <c:if test="${param.name == 'bk'}"> name 파라미터의 값이 ${param.name} 입니다.<br> </c:if> <c:if test="${18 < param.age}"> 당신의 나이는 18세 이상입니다. </c:if> JSP 2.0 Programming

  34. 코어 태그: 흐름제어 태그 - choose Syntax <c:choose> <c:when test="조건1" > ... </c:when> <c:when test="조건2" > ... </c:when> <c:otherwise> ... </c:otherwise> </c:choose> 조건1이 true일 때 실행 조건2가 true일 때 실행 앞의 <c:when>의 조건들이 모두 만족하지 않을 때에 실행된다. JSP 2.0 Programming

  35. 코어 태그: 흐름제어 태그 - forEach 배열 및 Collection에 저장된 요소를 차례대로 처리한다. Syntax <c:forEach var="변수" items="아이템" [begin="시작번호"] [end="끝번호"]> ... ${변수} ... </c:forEach> • var - EL에서 사용될 변수명 • items - 배열, List, Iterator, Enumeration, Map 등의 Collection • begin - items에 지정한 목록에서 값을 읽어올 인덱스의 시작값 • end - item에 지정한 목록에서 값을 읽어올 인덱스의 끝값 item이 Map인 경우 변수에 저장되는 객체는 Map.Entry이다. 따라서, 변수값을 사용할 때는 ${변수.key}와 ${변수.value}를 사용해서 맵에 저장된 항목의 <키, 값> 매핑에 접근할 수 있다. JSP 2.0 Programming

  36. 코어 태그: 흐름제어 태그 - import 지정한 URL에 연결하여 결과를 지정한 변수에 저장한다. Syntax <c:import url="URL" charEncoding="캐릭터인코딩" var="변수명" scope="범위" > <c:param name="파라미터이름" value="파라미터값" /> </c:import> • url - 결과를 읽어올 URL • charEncoding - 읽어온 결과를 저장할 때 사용할 캐릭터 인코딩 • var - 읽어온 결과를 저장할 변수명 • scope - 변수를 저장할 영역 • <c:param> 태그는 url 속성에 지정한 사이트에 연결할 때 전송할 파라미터를 입력한다. Example <c:import url="http://media.daum.net/" charEncoding="euc-kr" var="daumNews" scope="request" > <c:param name="_top_G" value="news" /> </c:import> JSP 2.0 Programming

  37. 코어 태그: 흐름제어 태그 - url URL을 생성해서 변수에 저장한다. Syntax <c:url var="변수명" value="재작성할URL" scope="저장범위" > <c:param name="파라미터이름" value="파라미터값" /> </c:url> • var - 생성한 URL이 저장될 변수명 • value - 생성할 URL • scope - 변수를 저장할 범위 지정. Example <c:url var="url1" value="../shopping.do" /> <c:url var="url2" value="/shopping.do" > <c:param name="Add" value="isdn-001" /> </c:url> <c:url var="url3" value="http://localhost:8080/jstl/setTag.jsp" /> JSP 2.0 Programming

  38. 코어 태그: 흐름제어 태그 - redirect 지정한 페이지로 리다이렉트한다. response.sendRedirect()와 비슷 Syntax <c:redirect url="리다이렉트할URL"> <c:param name="파라미터이름" value="파라미터값" /> </c:redirect> • url - 리다이렉트 URL • <c:param>은 리다이렉트할 페이지에 전달할 파라미터 지정 Example <c:redirect url="/ifTag.jsp"> <c:param name="name" value="bk" /> </c:redirect> JSP 2.0 Programming

  39. 코어 태그: 기타 태그 - out JspWriter에 데이터를 출력한다 Syntax <c:out value="value" escapeXml="{true|false}" default="defaultValue" /> • value - JspWriter에 출력할 값을 나타낸다. 일반적으로 value 속성의 값은 String과 같은 문자열이다. 만약 value의 값이 java.io.Reader의 한 종류라면 out 태그는 Reader로부터 데이터를 읽어와 JspWriter에 값을 출력한다. • escapeXml - 이 속성의 값이 true일 경우 아래 표와 같이 문자를 변경한다. 생략할 수 있으며, 생략할 경우 기본값은 true이다. • default - value 속성에서 지정한 값이 존재하지 않을 때 사용될 값을 지정한다 [표] escapeXml 속성이 true일 경우 변환되는 문자 JSP 2.0 Programming

  40. 코어 태그: 기타 태그 - catch 태그 몸체에서 발생한 예외를 변수에 저장한다. Syntax <c:catch var="exName"> ... 예외가 발생할 수 있는 코드 ... </c:catch> ... ${exName} 사용 에러가 발생하면 에러가 exName 변수에 저장된다. • var - 예외 객체를 저장할 변수명 JSP 2.0 Programming

  41. 국제화 태그 JSP 2.0 Programming

  42. 국제화 태그: 로케일 지정 - setLocale, requestEncoding setLocale: 국제화 태그에 적용될 로케일을 지정한다. Syntax <fmt:setLocale value="로케일" scope="영향미치는범위" /> • value - Locale을 지정한다. 두 글자로 된 언어 코드를 반드시 지정해주어야 하며, 두 글자로 된 국가 코드를 추가로 지정할 수 있다. • scope - 지정한 Locale이 영향을 미치는 범위를 지정한다. requestEncoding: 요청 파라미터의 인코딩을 지정 Syntax <fmt:requestEncoding value="캐릭터인코딩" /> • value - 캐릭터 인코딩 JSP 2.0 Programming

  43. 국제화 태그: 메시지 태그 - bundle, message bundle이 지정한 리소스 번들로부터 메시지를 읽어와 출력한다. Syntax <fmt:bundle basename="리소스번들" prefix="기본키접두어"> ... <fmt:message key="키값1" /> ... <fmt:message key="키값2" /> ... </fmt:bundle> • basename- 리소스 번들의 이름 • prefix - message 태그의 key 속성의 값 앞에 자동으로 붙게 될 문자열 • key - 리소스 번들에 저장된 메시지 키 값 * bundle 태그의 몸체에 중첩되어 사용된다. JSP 2.0 Programming

  44. 국제화 태그: 메시지 태그 - setBundle, message setBundle이 지정한 리소스 번들로부터 메시지를 읽어와 출력한다. Syntax <fmt:setBundle var="변수명" basename="리소스번들" /> ... <fmt:message bundle="${변수명}" key="키값" /> • var - 리로스 번들을 저장할 변수명 • basename- 리소스 번들의 이름 • bundler - 참조할 리소스 번들 변수명 • key - 리소스 번들에 저장된 메시지 키 값 * bundler 속성을 사용하면, message 태그가 bundle 태그의 몸체에 중첩될 필요가 없다. JSP 2.0 Programming

  45. 함수 JSTL은 EL에서 사용할 수 있는 함수를 제공한다 Syntax ${fn:함수명(인자 목록)} [표] JSTL이 제공하는 주요 함수 JSP 2.0 Programming

More Related