1 / 42

Custom Tag

Custom Tag. Internet Computing Laboratory @ KUT Youn-Hee Han. What is Custom Tag?. Custom Tag 개발자가 필요에 의해서 자신이 스스로 개발하는 태그 JSP 코드의 복잡성을 줄여준다 . 주로 , Action Tag 나 EL 및 JSTL 등으로도 그 복잡성이 해결이 안되는 내용을 별도의 자바 소스로 처리하고 실제 JSP 내에서는 태그하나로 그 내용을 처리하고자 할 때 사용한다 . Custom Tag 의 장점

zasha
Download Presentation

Custom Tag

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. Custom Tag Internet Computing Laboratory @ KUT Youn-Hee Han

  2. What is Custom Tag? • Custom Tag • 개발자가 필요에 의해서 자신이 스스로 개발하는 태그 • JSP 코드의 복잡성을줄여준다. • 주로, Action Tag나 EL 및 JSTL 등으로도 그 복잡성이 해결이 안되는 내용을 별도의 자바 소스로 처리하고 실제 JSP 내에서는 태그하나로 그 내용을 처리하고자 할 때 사용한다. • Custom Tag의 장점 • 한 번 작성한 커스텀 태그는 재사용이 가능하다. • 프로그램의 가독성을 향상 시킬 수 있다. • 업무의 효율성을 향상 시킬 수 있다. • 종류 • JSP 1.2 – 클래식 커스텀 태그 • JSP 2.0 – SimpleTag & Tag File

  3. 자바 클래스파일 TLD 파일 (.tld ) web.xml JSP 페이지 태그파일 (.tag) JSP 페이지 Custom Tag 구현 방법 • 구현방법 • 자바의 클래스 파일 기반으로 구현 (커스텀 태그 핸들러 이용) • JSP 1.2 기반의 클래식 커스텀 태그 • JSP 2.0 기반의 SimpleTag • 태그 파일 기반으로 구현 • JSP 2.0 기반의 태그 파일

  4. 수업시간에 다루는 내용 • 1. 커스텀 태그 라이브러리 • 1.1 커스텀 태그의 이익 • 1.2 커스텀 태그의 종류 • 1.3 커스텀 태그와 관련된 인터페이스 계층도 • 1.4 커스텀 태그의 구성 • 2. 클래식 커스텀 태그 구현 • 2.1 Tag 인터페이스와 IterationTag 인터페이스의 실행 방식 • 2.2 클래식, 단순 커스텀 태그 구현 • 2.3 클래식, 속성을 사용하는 커스텀 태그 • 2.4 클래식, 동적 속성을 사용하는 커스텀 태그(2.0) • 2.5 클래식, 액션 태그를 사용하는 커스텀 태그(2.0) • 2.6 클래식, 선택적으로 몸체 내용을 처리하는 커스텀 태그 • 2.7 클래식, 반복작업을 처리하는 커스텀 태그 • 2.8 클래식, 스크립트의 변수를 생성하는 커스텀 태그 • 2.9 클래식, 몸체 내용을 사용하는 커스텀 태그 • 2.10 클래식, 태그 간의 교류 • 2.11 예외 처리 태그

  5. 수업시간에 다루는 내용 • 3. JSP 2.0의 SimpleTag를 이용한 구현(2.0) • 3.1 SimpleTag의 기본 구현 방법 • 3.2 SimpleTag, 단순 커스텀 태그 및 속성을 사용하는 태그 구현 • 3.3 SimpleTag, 몸체 내용을 출력하는 커스텀 태그 • 3.4 SimpleTag, 반복 작업을 처리하는 커스텀 태그 • 3.5 SimpleTag, 스크립트의 변수를 생성하는 커스텀 태그 • 4. 손쉬운 커스텀 태그 구현: 태그 파일(2.0) • 5. TLD 파일 정리 • 6. 커스텀 태그 배포하기

  6. 자바의 클래스 파일 기반 구현- JSP 1.2 기법 -

  7. Custom Tag 구현 방법 • Tag Handler 관련 클래스 계층도 Body 내용을 처리하지 않을 경우 사용 Body 내용을 처리할 경우 사용

  8. 자바 클래스파일 TLD 파일 (.tld) web.xml JSP 페이지 TagHandler:커스텀 태그 정의 ( 구조 , 로직 ) 자바클래스파일을 태그로 사용할 수 있도록 등록 JSP 페이지에서 사용할 수 있도록 TLD 파일 등록 JSP 페이지에서 태그 사용 WEB-INF\tlds 폴더에 저장한다. 클래스 파일 기반 구현 방법 • 자바의 클래스 파일 기반으로 구현 jsp2.0을 지원하는 tomcat부터는 생략가능

  9. 중요 사항 • Tag Handler 컴파일을 위한 sjc.bat 재정비 • Tag Handler의 중요 메소드 • doStartTag() • JSP 내에서 커스텀 태그의 시작 태그를 만날 때 호출 • doEndTag() • JSP 내에서 커스텀 태그의 끝 태그를 만날 때 호출 • doAfterBody() • 태그의 몸체 내용을 처리한 뒤 호출한다. • 이외 3,4개의 메소드 존재 (p.537의 표 20.1, 표 20.2) 참조 set CLASSPATH= set CLASSPATH=%CLASSPATH%;D:\jakarta-tomcat-5.0.19\webapps\2006777888\WEB-INF\classes;D:\jakarta-tomcat-5.0.19\common\lib\servlet-api.jar; D:\jakarta-tomcat-5.0.19\common\lib\jsp-api.jar javac -d D:\jakarta-tomcat-5.0.19\webapps\2006777888\WEB-INF\classes %1

  10. Java 파일 • Tag Handler Java 파일 (p.539) /2006777888/WEB-INF/src/HeaderListTag.java package kut.ime.tag; import java.io.IOException; import java.util.Enumeration; import javax.servlet.http.HttpServletRequest; import javax.servlet.jsp.JspException; import javax.servlet.jsp.JspWriter; import javax.servlet.jsp.tagext.TagSupport; public class HeaderListTag extends TagSupport { public int doStartTag() throws JspException { JspWriter out = pageContext.getOut(); … … return SKIP_BODY; } public int doEndTag() throws JspException { … … return EVAL_PAGE; } }

  11. Java 파일 • Tag Handler Java 파일에서 return 상수 의미

  12. TLD 파일 • Tag Library Descriptor (TLD) 파일 (p.542) /2006777888/WEB-INF/tlds/classicStyle.tld <?xml version="1.0" encoding="euc-kr" ?> <taglib xmlns="http://java.sun.com/xml/ns/j2ee" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://java.sun.com/xml/ns/j2ee web-jsptaglibrary_2_0.xsd” version="2.0"> <description>클래식 스타일의 커스텀 태그 예제</description> <display-name>클래식스타일예제</display-name> <tlib-version>1.0</tlib-version> <short-name>classicStyle</short-name> <uri>http://javacan.madvirus.net/jsp/classicTag</uri> <tag> <name>headerList</name> <tag-class>kut.ime.tag.HeaderListTag</tag-class> <body-content>empty</body-content> </tag> </taglib>

  13. JSP 파일 구성 방법 • 커스텀 태그 사용 JSP 예 (p.544) /2006777888/headerList.jsp <%@ page contentType = "text/html; charset=euc-kr" %> <%@ taglib prefix="exam" uri="http://javacan.madvirus.net/jsp/classicTag" %> <html> <head><title>HeaderList</title></head> <body> 헤더 목록: <exam:headerList /> </body> </html> 개별적으로 알아서 붙여줌 tld 파일에서 <uri>…</uri>에 명시된 내용을 적어줌 tld 파일에서 <tag><name>…</name></tag>에 명시된 내용을 적어줌

  14. Custom Tag 속성 처리 - Java 파일 • Tag Handler Java 파일 (p.546) /2006777888/WEB-INF/src/HeaderTag.java package kut.ime.tag; import java.io.IOException; import java.util.Enumeration; import javax.servlet.http.HttpServletRequest; import javax.servlet.jsp.JspException; import javax.servlet.jsp.JspWriter; import javax.servlet.jsp.tagext.TagSupport; public class HeaderTag extends TagSupport { private String name; private String defaultValue; public void setName(String name) { this.name = name; } public void setDefault(String defaultValue) { this.defaultValue = defaultValue; } … … }

  15. Custom Tag 속성 처리 - TLD 파일 • Tag Library Descriptor (TLD) 파일 (p.548) /2006777888/WEB-INF/tlds/classicStyle.tld … <tag> <name>headerList</name> <tag-class>kut.ime.tag.HeaderTag</tag-class> <body-content>empty</body-content> </tag> <tag> <name>header</name> <tag-class>kut.ime.tag.HeaderTag</tag-class> <body-content>empty</body-content> <attribute> <name>name</name> <required>true</required> <rtexprvalue>true</rtexprvalue> <type>java.lang.String</type> </attribute> <attribute> <name>default</name> <required>false</required> <rtexprvalue>true</rtexprvalue> </attribute> </tag> </taglib> 필수 옵션

  16. Custom Tag 속성 처리 – JSP 파일 • 커스텀 태그 사용 JSP 예 – 속성처리 /2006777888/header.jsp <%@ page contentType = "text/html; charset=euc-kr" %> <%@ taglib prefix="exam" uri="http://javacan.madvirus.net/jsp/classicTag" %> <html> <head><title>Header</title></head> <body> accept-language: <exam:header name="accept-language" /> <br> no-header: <exam:header name="no-header" /> <br> no-header(with default): <exam:header name="no-header" default="지원안함"/> <br> </body> </html> tld 파일에서 <uri>…</uri>에 명시된 내용을 적어줌 tld 파일에서 <tag><name>…</name></tag>에 명시된 내용을 적어줌

  17. Custom Tag 동적 속성 처리 - Java 파일 • Tag Handler Java 파일 (p.550) /2006777888/WEB-INF/src/DynamicTag.java package kut.ime.tag; import java.io.IOException; import java.util.Enumeration; import javax.servlet.http.HttpServletRequest; import javax.servlet.jsp.JspException; import javax.servlet.jsp.JspWriter; import javax.servlet.jsp.tagext.DynamicAttributes; import javax.servlet.jsp.tagext.TagSupport; public class HeaderTag extends TagSupport implements DynamicAttributes{ private String kind; private Map dynamicAttr = new java.util.HashMap(); public void setKind(String value) { this.kind = value; } public void setDynamicAttribute(String uri, String localName, Object value) throws JspException { dynamicAttr.put(localName, value); } … … }

  18. Custom Tag 동적 속성 처리 - TLD 파일 • Tag Library Descriptor (TLD) 파일 (p.552) /2006777888/WEB-INF/tlds/classicStyle.tld … <tag> <name>dynamicAttr</name> <tag-class>kut.ime.tag.DynamicTag</tag-class> <body-content>empty</body-content> <attribute> <name>kind</name> <required>true</required> </attribute> <dynamic-attributes>true</dynamic-attributes> </tag> </taglib>

  19. Custom Tag 동적 속성 처리 – JSP 파일 • 커스텀 태그 사용 JSP 예 – 동적 속성처리 /2006777888/dynaic.jsp <%@ page contentType = "text/html; charset=euc-kr" %> <%@ taglib prefix="exam" uri="http://javacan.madvirus.net/jsp/classicTag" %> <html> <head><title>동적 속성</title></head> <body> <exam:dynamicAttr kind=“색상“ red=“빨강” blue=“파랑” yellow=“노랑”/> <br> </body> </html>

  20. Custom Tag 몸체 포함처리 - Java 파일 • Tag Handler Java 파일 (p.560) /2006777888/WEB-INF/src/isLoginTag.java package kut.ime.tag; import javax.servlet.jsp.JspException; import javax.servlet.jsp.JspWriter; import javax.servlet.jsp.tagext.TagSupport; public class HeaderTag extends TagSupport { public int doStartTag() throws JspException { HttpSession session = pageContext.getSession(); if (session == null) { return SKIP_BODY; } if (session.getAttribute("MEMBERID") == null) { return SKIP_BODY; } else { return EVAL_BODY_INCLUDE; } } }

  21. Custom Tag 몸체 포함 처리 - TLD 파일 • Tag Library Descriptor (TLD) 파일 (p.561) /2006777888/WEB-INF/tlds/classicStyle.tld … <tag> <name>isLogin</name> <tag-class>kut.ime.tag.IsLoginTag</tag-class> <body-content>JSP</body-content> </tag> </taglib>

  22. Custom Tag 몸체포함 처리 – JSP 파일 • 커스텀 태그 사용 JSP 예 – 몸체 처리 /2006777888/login.jsp <%@ page contentType = "text/html; charset=euc-kr" %> <%@ taglib prefix="exam" uri="http://javacan.madvirus.net/jsp/classicTag" %> <% session.setAttribute("MEMBERID", "madvirus"); %> <exam:isLogin> 첫번째, 로그인하였습니다. </exam:isLogin> <% session.removeAttribute("MEMBERID"); %> <exam:isLogin> 두번째, 로그인하였습니다. </exam:isLogin> <p>두번째는 출력되지 않음. </body> </html>

  23. Custom Tag 몸체 변경처리 - Java 파일 /2006777888/WEB-INF/src/BodyChangeTag.java • Tag Handler Java 파일 (교재 예제 아님, p574 참조) package kut.ime.tag; import java.io.IOException; import javax.servlet.jsp.JspWriter; import javax.servlet.jsp.JspException; import javax.servlet.jsp.tagext.BodyContent; import javax.servlet.jsp.tagext.BodyTagSupport; public class BodyChangeTag extends BodyTagSupport { public int doStartTag() throws JspException { return EVAL_BODY_BUFFERED; } public int doEndTag() throws JspException { String content = bodyContent.getString(); if (content.equals("대한민국")) content = "Korea!!!"; if (content.equals("한국기술교육대학교")) content = "KUT!!!"; try { JspWriter out = pageContext.getOut(); out.print(content); } catch(IOException e) { throw new JspException(e); } return EVAL_PAGE; } }

  24. Custom Tag 몸체 변경 처리 – TLD & JSP 파일 • Tag Library Descriptor (TLD) 파일 • 커스텀 태그 사용 JSP 예 /2006777888/WEB-INF/tlds/classicStyle.tld … <tag> <name>bodychange</name> <tag-class>kut.ime.tag.BodyChangeTag</tag-class> <body-content>tagdependent</body-content> </tag> </taglib> /2006777888/bodychange.jsp <%@ page contentType = "text/html; charset=euc-kr" %> <%@ taglib prefix="exam" uri="http://javacan.madvirus.net/jsp/classicTag" %> <html> <head><title>BodyChange</title></head> <body> 사랑해요! <exam:bodychange>대한민국</exam:bodychange></BR> 사랑해요! <exam:bodychange>한국기술교육대학교</exam:bodychange> </body> </html>

  25. 문제: 구구단 출력 커스텀 태그 • 문제] 다음과 같은 JSP를 구성할 수 있는 커스텀 태그를 구성하기 <%@ page contentType = "text/html; charset=euc-kr" %> <%@ taglib prefix="exam" uri="http://javacan.madvirus.net/jsp/classicTag" %> <html> <head><title>구구단</title></head> <body> <exam:gugu level=“2“/> <br> <exam:gugu level=“3“/> <br> <exam:gugu level=“4“/> <br> <exam:gugu level=“5“/> <br> . . . </body> </html>

  26. 자바의 클래스 파일 기반 구현- JSP 2.0 기법 -

  27. JSP 2.0: SimpleTag사용 • SimpleTag를 사용한 Tag Handler 구현방법 • 실제 구현시에 SimpleTagSupport 클래스를 상속 받아 구현 • 하나의 메소드만 구현함 • 위 메소드는 커스텀 태그의 끝 태그를 만다면 실행 • 리턴형이 void임에 주의 • 즉, returnEVAL_PAGE 등의 코딩은 필요 없음 • 출력할 내용은 다음과 같은 코드를 사용하여 출력함 • 즉, pageContext 변수 활용 못함 public class MySimpleTag extends SimpleTagSupport { … } public void doTag() throws JspException, IOException getJspContext().getOut().print(“……..”);

  28. JSP 2.0: SimpleTag사용 • SimpleTag를 사용한 Tag Handler 구현방법 • 몸체 내용은 getJspBody() 메소드를 통해 JspFragment로 전달받음 • 몸체내용을 아무 변경 없이 response로출력할 때 JspFragment의 invoke(null) 메소드 활용 • 몸체 내용을 저장하여 수정이 필요할 때… • 주의: 위와 같이 몸체 내용을 얻어올 때, 몸체 내용으로 JSP Script는 사용 못함 • 즉, SimpleTag를 사용할 때 <body-content> 값으로 JSP를 가질 수 없음 JspFragment body = getJspBody(); body.invoke(null); StringWriter writer = new StringWriter(); JspFragment body = getJspBody(); body.invoke(writer); String bodyText = writer.toString();

  29. SimpleTag 사용한간단한태그 처리 - Java 파일 • Tag Handler Java 파일 (교재 예제 아님) /2006777888/WEB-INF/src/STag.java package kut.ime.tag; import javax.servlet.jsp.JspException; import javax.servlet.jsp.tagext.SimpleTagSupport; import java.io.IOException; public class STag extends SimpleTagSupport { public void doTag() throws JspException, IOException { getJspContext().getOut().print("Hello SimpleTag!"); } }

  30. SimpleTag 사용한간단한태그 처리 - TLD & JSP 파일 • Tag Library Descriptor (TLD) 파일 • SimpleTag 사용 JSP 예 /2006777888/WEB-INF/tlds/classicStyle.tld … <tag> <name>stag</name> <tag-class>kut.ime.tag.STag</tag-class> <body-content>empty</body-content> </tag> </taglib> /2006777888/simpletag.jsp <%@ page contentType = "text/html; charset=euc-kr" %> <%@ taglib prefix="exam" uri="http://javacan.madvirus.net/jsp/classicTag" %> <html> <body> <exam:stag/> </body> </html>

  31. SimpleTag 사용한몸체 변경처리 - Java 파일 • Tag Handler Java 파일 – 1/2(교재 예제 아님) /2006777888/WEB-INF/src/MySimpleTag.java package kut.ime.tag; import javax.servlet.*; import javax.servlet.jsp.*; import javax.servlet.jsp.tagext.*; import java.util.StringTokenizer; import java.io.*; public class MySimpleTag extends SimpleTagSupport { private String elemSep = ","; private String lineSep = ";"; public void doTag() throws JspException, IOException { StringWriter writer = new StringWriter(); JspFragment body = getJspBody(); body.invoke(writer); String bodyText = writer.toString(); StringBuffer tableOut = new StringBuffer(); StringTokenizer bodyTk = new StringTokenizer(bodyText, lineSep);

  32. SimpleTag 사용한몸체 변경처리 - Java 파일 • Tag Handler Java 파일 – 2/2(교재 예제 아님) /2006777888/WEB-INF/src/MySimpleTag.java tableOut.append("<TABLE>"); while (bodyTk.hasMoreTokens()) { String str = bodyTk.nextToken(); StringTokenizer token = new StringTokenizer(str, elemSep); tableOut.append("<TR>"); while(token.hasMoreTokens()) { tableOut.append("<TD>"); tableOut.append((String)token.nextToken()); tableOut.append("</TD>"); } tableOut.append("</TR>"); } tableOut.append("</TABLE>"); getJspContext().getOut().print(tableOut); } }

  33. SimpleTag 사용한몸체 변경처리 - TLD & JSP 파일 • Tag Library Descriptor (TLD) 파일 • SimpleTag 사용 JSP 예 /2006777888/WEB-INF/tlds/classicStyle.tld … <tag> <name>changeTable</name> <tag-class>kut.ime.tag.MySimpleTag</tag-class> <body-content>tagdependent</body-content> </tag> </taglib> /2006777888/tablechange.jsp <%@ page contentType = "text/html; charset=euc-kr" %> <%@ taglib prefix="exam" uri="http://javacan.madvirus.net/jsp/classicTag" %> <html> <body> <exam:changeTable> 1,2,3,4; 2,12,3,9; </exam:changeTable> </body> </html>

  34. Tag File - JSP 2.0 기법 -

  35. WEB-INF\tags 폴더에 저장한다. 태그파일 (.tag) JSP 페이지 태그 파일을 활용한 커스텀 태그 구현 • 특징 • JSP 2.0 기반에서 제공하는 방법이다. • 커스텀 태그를 정의한 태그 파일을 생성 후 JSP 페이지에서 해당 태그를 사용하는 방법이다. • 해당 태그파일이 내부적으로 태그 핸들러로 변환된다. • 태그파일명이 JSP에서 사용하는 태그이름이 된다.

  36. tag 디렉티브 • 용도 • 태그 파일의 설정 정보를 기술하는데 사용된다. • 사용법 • <%@ tag import=“java.io.*” pageEncoding=“EUC-KR” %> • 속성들

  37. Tag File 실습예제 – body가 없는 경우 Tag File JSP File /2006777888/WEB-INF/tags/FirstTag.tag <%@ tag body-content="empty" pageEncoding="EUC-KR" %> 안녕하세요. Tag File 실습 예제입니다. /2006777888/FirstTagExam.jsp <%@ page contentType = "text/html; charset=euc-kr" %> <%@ taglib prefix="exam" tagdir="/WEB-INF/tags" %> <html> <body> <exam:FirstTag/> </body> </html>

  38. Tag File 실습예제 – body가 있는 경우 Tag File JSP File /2006777888/WEB-INF/tags/SecondTag.tag <%@ tag body-content="scriptless" pageEncoding="EUC-KR" %> 안녕하세요. Tag File 두번 째 실습 예제입니다. <jsp:doBody/> /2006777888/SecondTagExam.jsp <%@ page contentType = "text/html; charset=euc-kr" %> <%@ taglib prefix="exam" tagdir="/WEB-INF/tags" %> <html> <body> <exam:SecondTag>두번째 태그 파일!!!</exam:SecondTag> </body> </html>

  39. attribute 디렉티브 • 용도 • 태그 파일에서 커스텀 태그의 속성을 명시한다. • 사용법 • <%@ attribute name=“size” %> • 속성들

  40. Tag File 실습예제 – 속성 처리 Tag File JSP File /2006777888/WEB-INF/tags/ThirdTag.tag <%@ tag body-content="scriptless" pageEncoding="EUC-KR" %> <%@ tag isELIgnored="false" %> <%@ attribute name="size" %> <font size="${size}" %> 안녕하세요. Tag File 세번 째 실습 예제입니다. <jsp:doBody/> </font> /2006777888/SecondTagExam.jsp <%@ page contentType = "text/html; charset=euc-kr" %> <%@ taglib prefix="exam" tagdir="/WEB-INF/tags" %> <html> <body> <exam:ThirdTagsize="5">세번째 태그 파일!!!</exam:ThirdTag> </body> </html>

  41. Dynamic Attribute • 동적속성으로만 접근 /2006777888/WEB-INF/tags/attrExam.tag <%@ tag body-content="empty" pageEncoding="euc-kr" %> <%@ tag dynamic-attributes="attr" %> ${attr.end}<BR> <c:out value="${attr.delimeter}"/><BR> ${attr.red}<BR> ${attr.blue}<BR> <c:out value="${attr.header}"/><BR> <c:out value="${attr.bottom}"/> <%--<%= end %>--%> /2006777888/tags/dynamicAttr.jsp <%@ page contentType = "text/html; charset=euc-kr" %> <%@ taglib prefix="tf" tagdir="/WEB-INF/tags" %> <html> <body> <tf:attrExam end="4" delimeter="<br>" red="빨강!" blue="파랑“> <jsp:attribute name="header">속성 사용방법</jsp:attribute> <jsp:attribute name="bottom">예제 완료</jsp:attribute> </tf:attrExam> </body> </html>

  42. Dynamic Attribute • 동적속성과정적 속성의 차이 /2006777888/WEB-INF/tags/attrExam.tag <%@ tag body-content="empty" pageEncoding="euc-kr" %> <%@ tag dynamic-attributes="attr" %> <%@ attribute name="end" required="true"%> <%@ attribute name="head" required="true"%> <%@ taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core" %> 1. ${attr.end}<BR> 2. <c:out value="${attr.delimeter}"/><BR> 3. ${attr.red}<BR> 4. ${attr.blue}<BR> 5. <c:out value="${attr.head}"/><BR> 6. <c:out value="${attr.bottom}"/><BR> 7. <%= end %><BR> 8. <%= head %> 9. ${end} 10. ${head}

More Related