jsp JSTL
주의사항
1. 태그 이름과 문법
TLD에는 속성이 필수인지 옵션 사항인지, 태크가 몸체를 가질 수 있는지, 가진다면 그 안에 들어갈 수 있는 하위 태그는 무었이 있는지, 태그 안에 들어가는 속성 타입은 어떻게 되는지, 속성에 표현식을 쓸 수 있는지 아니면 그냥 문자열만 써야 하는지 등
2. 라이브러리 URI
taglib지시자에 바로 이 URI값을 사용합니다. 컨테이너는 이 값으로 웹 어플리케이션에 있는 여러 TLD파일 가운데서 정확한 것으로 찾아갑니다.
TLD
<tlib-version></tlib-version> 태그 라이프러리 버전을 선언하는 곳
<short-name></short-name>
<function>
<name></name>
<function-class></function-class>
<function-signature></function-signature>
</function>
<uri></uri> taglib지시자에서 사용할 자신을 나타내는 유일한 이름
<tag>
<description></description>
<name></name> 태그안에 쓸 이름
<tag-class></tag-class> jsp에서 태그를 사용한 경우 컨테이너가 호출할 클래스
<body-content></body-content> 태그의 몸체
empty : 몸체 없음, scriptless :스크립팅은 올 수 없음, tagdependent : 문자를 무조건 텍스트로 취급, JSP : jsp 안에 들어 갈 수 있ㄴ은 것이라면 무엇이든지 가능.
<attribute> 태그의 속성이 있다면 속성을 정의 하는 곳
<name></name> 속성 이름
<required></required> 필수 여부
<rtexprvalue></rtexprvalue> 속성에는 런타임 표현값이 들어간다
</attribute>
</tag>
커스텀 태그 핸들러
SimpleTagSupport 를 상속하고
public void doTog() throws JspException, IOException
: jsp가 태그를 실행하면 컨테이너는 doTag() 메소드 호출
public void setUser(String user)
: 태그 속성값을 설정하기 위하여 컨테이너가 호출하는 메소드
몸체가 없는 태그 호출하는 3가지 방법 <body-content> empty</body-content>
<mine:advice user="${userName}" />
<mine:advice user="${userName}" /></mine:advice>
<mine:advice>
<jsp:attribute name="user">${userName}</jsp:attribute>
</mine:advice>
심플태크 핵심 정리
- 태그 핸들러는 태그 기능을 자바 태그 핸들러 클래스로 구현하지만, 태그 파일은 패이지로 태그 기능을 구현한다는 차이가 있습니다.
- 태그 핸들러는 다음 두 가지 타입이 있습니다.: 클래식, 심플
- 심플 태그 핸들러를 만들려면, SimpleTagSupport를 상속하면 됩니다.
- 심플 태그 핸들러를 배포하려면, JSTL이나 다른 커스텀 태그 라이브러리를 배포할 때 사용하던 <tag>항목을 사용해서 TLD를 정의해야 합니다.
- 몸체가 있는 태그를 사용하려면, TLD<tag>항목의<body-content>를 "empty"가 아닌 다른 값으로 설정해야 합니다. 그 다음 몸체를 실행 하려면 getJspBody().invoke()를 호출
- 사실 SimpleTag 인터페이스에 정의된 메소드 대부분이 SimpleTagSupport클래스에 구현되어 있습니다. 여기에 추가로 getJspBody()를 포함한 3가지 편리한 메소드를 제공합니다. getJspBody를 이용하여 태그 바디 내용을 읽을 수 있습니다.
- 심플 태그 생명 주기 : 컨테이너는 심플 태그 핸들러를 재사용하지 않습니다. 따라서 JSP에서 태그를 호출할 때마다, 새로운 태그 핸들러 인스턴스가 생성되며, setJspContext() 메소드도 매번 호출됩니다. 그 다음 다른 태그 안에서 태그를 호출했다면, setParent() 메소드가 호출됩니다. 호출할 때 태그 속성이 있다면 빈 스타일의 속성 설정자가 속성별로 호출됩니다. 태그 몸체가 있다면, setJspBody()메소드가 호출됩니다. 제일 마지막으로 doTag()메소드가 호출되고 나면, 모든 작업이 끝이 납니다. 재사용하지 않는다고 했으니 당연히 destroy()가 호출
- 태그 몸체가 있을 때만 setJspBody() 메소드가 호출됩니다.
- 심플 태그 doTag() 메소드에서도 태그 몸체에서 쓰도록 속성을 정의할수 있다. getJspContext().setAttribute()메소드를 호출한 다음 getJspBody().invoke()를 호출
- doTag() 메소드를 보면 JspException IOException을 던지도록 되어 있습니다. 따라서 JspWriter의 writer메소드를 쓸때 try/catch로 둘러 쌀 필요가 없다.
- 심플 태그에서 바디 내용을 반속해서 출력하려면, 루핑문 안에서 getJspBody().invoke()를 호출하면 됩니다.
- 태그 속성을 정의하려면, 먼저 TLD <attribute>항목을 정의하고, 태그 핸들러 클래스에 빈 스타일 속성 설정자를 만들어야 합니다. JSP에서 태그를 호출하면 컨테이너가 자동으로 doTag()전에 설정자를 호출합니다.
- getJspBody()의 반환값인 JspFragment 객체에는 다음 두 메소드가 있습니다. invoke(java.io.Writer), getJspContext() 여기서 getJspContext() 메소드는 태그 핸들러가 PageContext API를 사용할 수 있는 JspContext를 리턴합니다.
- 응답 출력 스트림으로 그냥 출력하려면, invoke()메소드에 null을 넘기면 되고, 몸체 내용을 직접 생성하려면 새로운 Writer를 넘기면 됩니다.
- 현재 페이지의 치리를 중지하려면 SkipPageException을 던지면 됩니다. 다른 페이지에서 이 페이지를 포함한다면, 포함된 파일의 처리가 중간에서 멈추지만, 포함한 원 페이지는 끝까지 멈춤 없이 실행됩니다.
DynamicAttributes
- DynamicAttributes 인터페이스를 사용하면 아무리 태그 속성이 많아도 태그 핸들러 클래스에서 다 처리할 수 있습니다.
- TLD 태구 선언 부분에 <dynamic-attributes>항목이 꼭 있어야 합니다.
- 명시적으로 선언한 태그 속성은 설정자(setter)메소드가 반드시 있어야 합니다.
- 일반적으로 setDynamicAttribute()메소드를 사용해서 동적인 속성의 이름/값을 저장하려면 hashmap을 사용합니다.
- 태그 파일에도 동적인 속성을 사용할 수 있습니다.
- 태그 지시자에 dynamic-attributes 속성을 사용하세요.
- dynamic-attributes에 들어 있는 값은 동적인 속성의 hashmap입니다.
- 일반적으로 위의 맵에서 값을 뽑아낼 때는 JSTL forEach 커스텀 태그를 사용합니다.
댓글
댓글 쓰기