반응형
01. TLD파일(Tag Library Descriptor)만드는법
- TLD 파일 : 메서드를 정의해 놓은 자바 클래스와 메서드를 호출하는 JSP 파일을 연결해 주는 교량 역할
- /WEB-INF 디렉토리에 tld 확장자를 가지고 이름을 정하여 저장
- TLD 파일의 위치 : 반드시 /WEB-INF에 만들어야 함
- 단 /WEB-INF의 서브 디렉토리(하위폴더)에 만들어도 상관없음
step1. XML 파일 선택
- dtd 파일도 있지만, dtd파일보다는 xml 스키마 파일이 더 강력하니 이것을 권장
- 우리는 XML 파일 선택할 것임
step2. 확장자 : .tld (Tag Library Descriptor의 약자) 로 반드시 작성 >> next 클릭
step3. 만들어진 tld 파일 확인
- web-jsptaglibrary_2_1.xsd 스키마 파일에서 제공되는 엘리먼트만 사용 가능!!
- 이클립스 버그로 에러 떨어지면 http -> Http로 변경하기 , 그러면 자동완성이 안됨ㅠ
<?xml version="1.0" encoding="UTF-8"?>
<taglib version="2.1" xmlns="<http://java.sun.com/xml/ns/javaee>" xmlns:xml="<http://www.w3.org/XML/1998/namespace>" xmlns:xsi="<http://www.w3.org/2001/XMLSchema-instance>" xsi:schemaLocation="<http://java.sun.com/xml/ns/javaee> <http://java.sun.com/xml/ns/javaee/web-jsptaglibrary_2_1.xsd> ">
<description>EL 함수를 선언하기 위한 TLD 파일</description>
<tlib-version>1.0</tlib-version>
<short-name>EL</short-name>
</taglib>
02. EL함수(EL Function) 만드는 법
- EL 함수란 EL에서는 사용자가 메소드를 만들어 사용하기 위한 기능을 제공함
사용자가 직접 메소드를 만들기 위해서는??
- 💛 정적 메소드가 선언된 자바 클래스 필요
- 💛 TLD 파일필요
- 💛 JSP 문서에 taglib 디렉티브 넣고 호츌
1) 정적 메소드가 선언된 자바 클래스 필요
xyz.itwill.el > HelloEL.java => 메소드는 반드시 public static 메소드로 작성
package xyz.itwill.el;
//EL 함수를 사용할 경우 호출될 메소드가 선언된 클래스
public class HelloEL {
//EL 함수를 사용할 경우 호출될 메소드 - 반드시 정적 메소드로 선언
public static String hello(String name) {
return name+"님, 안녕하세요.";
}
}
2) TLD 파일필요
el.tld
<?xml version="1.0" encoding="UTF-8"?>
<taglib version="2.1" xmlns="<Http://java.sun.com/xml/ns/javaee>" xmlns:xml="<http://www.w3.org/XML/1998/namespace>" xmlns:xsi="<http://www.w3.org/2001/XMLSchema-instance>" xsi:schemaLocation="<http://java.sun.com/xml/ns/javaee> <http://java.sun.com/xml/ns/javaee/web-jsptaglibrary_2_1.xsd> ">
<!-- description : TLD 파일에 대한 설명을 제공하는 엘리먼트 (생략가능) -->
<description>EL 함수를 선언하기 위한 TLD 파일</description>
<!-- tlib-version : TLD 파일에 대한 버전을 등록하기 위한 엘리먼트 (생략가능) -->
<!-- 버전은 우리 마음대로 가능, 나중에 추가 시 버전업데이트하여 작성하면됨 -->
<tlib-version>1.0</tlib-version>
<!-- short-name : TLD 파일의 이름을 등록하기 위한 엘리먼트 (생략가능, 식별자아님, 단순히 파일이름 설정) -->
<!-- taglib Directive의 prefix와 동일하게 작성하면 나중에 찾기 편하긴하지만
우선 EL로 설정, prefix는 elfun으로 설정할 것임 -->
<short-name>EL</short-name>
<!-- JSP 문서에서 TLD 파일을 불러오기 위해 사용하는 식별자를 등록하기 위한 엘리먼트 (필수) -->
<!-- 웹 자원을 구분하기 위한 [식별자] 역할 -->
<uri><http://www.itwill.xyz/mvc/el></uri>
<!-- function : EL 함수를 등록하기 위한 엘리먼트 -->
<function>
<!-- name : EL 함수의 이름을 설정하기 위한 엘리먼트 (우리 마음대로 지정 가능) -->
<name>hello</name>
<!-- function-class : EL 함수 사용시 호출될 메소드가 선언된 자료형(클래스)을 설정하기 위한 엘리먼트 -->
<!-- 주의) 클래스의 패키지명까지 다 작성해야함 -->
<function-class>xyz.itwill.el.HelloEL</function-class>
<!-- function-signature : EL 함수 사용시 객체에 의해 호출되는 메소드의 머릿부를 설정하기 위한 엘리먼트 -->
<!-- 주의) 반환형이나 매개변수의 자료형의 패키지명까지 다 작성해야함 -->
<!-- 매개변수는 작성할 필요없지만, 자료형은 반드시 작성 -->
<function-signature>java.lang.String hello(java.lang.String)</function-signature>
</function>
</taglib>
3) JSP 문서에 taglib 디렉티브 넣고 호츌
el_function.jsp
<%@ page language="java" contentType="text/html; charset=UTF-8"
pageEncoding="UTF-8"%>
//<%-- taglib 디렉티브를 사용하여 TLD 파일을 제공받아 JSP 문서에서 EL 함수 또는 커스텀 태그를
//사용할 수 있도록 설정 --%>
//<%-- taglib Directive : JSP 문서에 TLD 파일에 등록된 EL 함수 또는 커스텀 태그를 제공하는 지시어 --%>
//<%-- prefix 속성 : EL 함수 또는 커스템 태그를 사용하기 위한 접두사를 속성값으로 설정 (마음대로 지정가능) --%>
//<%-- uri 속성 : TLD 파일의 식별자(uri 엘리먼트값)을 속성값으로 설정 --%>
//<%-- => 자동 완성 기능 사용[ctrl] + [space] (만약 TLD 파일 여러개 있으면 그 중 하나 선택 가능) --%>
<%@taglib prefix="elfun" uri="<http://www.itwill.xyz/mvc/el>" %>
<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title>MVC</title>
</head>
<body>
<h1>EL function</h1>
<hr />
<p>EL 함수 : EL 표현식에서 사용하기 위한 함수</p>
<p>EL 함수를 사용할 경우 호출될 메소드가 선언된 클래스를 작성하고 TLD 파일에서 클래스의
메소드를 EL 함수로 등록 후 JSP 문서에서 taglib 디렉티브를 이용하여 EL 함수를 제공받아 사용</p>
<hr />
<p>${elfun:hello("홍길동") }</p>
<p>${elfun:hello("임꺽정") }</p>
</body>
</html>
03. EL의 커스텀태그의 개념
1) 커스텀태그란?
- 기존 jsp1에서 아래와 같은 방식으로 반복문이나 조건문 사용함
<td width=200 align=center bgcolor="ffffff">
<% if(userinfo.getEmail()!=null) { %>
<%=userinfo.getEmail() %>
<% } %>
</td>
- EL 언어에서는 커스템태그로 자바명령을 태그로 만들어 사용할 수 있음
- 즉, 커스텀태그는 반복문, 조건문의 역할 할 수 있음
- 커스템 태그를 호출하면 자바 명령이 실행됨
2) 커스텀 태그와 관련된 인터페이스 게층도
- Tag : 단순한 처리를 한는 커스텀태그
- IterationTag : 반복적인 작업을 처리하는 커스텀태그
- BodyTag : 태그의 몸체내용을 사용하는 커스텀태그
- 커스텀태그를 구현할때는 용도에 맞게 이들 인터페이스를 구현 하면 되는데 실제로는 이들 인터페이스를 미리 구현해놓은 클래스를 사용하게 됨
- 즉, TagSupport클래스 , BodyTagSupport클래스 , SimpleTagSupport클래스 : 클래스를 상속받아 필요한 기능만 구현해서 사용
3) 커스텀태그 기본 사용 예시
xyz.itwill.custom > HelloTag.java
package xyz.itiwll.custom;
import javax.servlet.jsp.JspException;
import javax.servlet.jsp.tagext.TagSupport;
//커스텀 태그(Custom Tag) : JSP 문서에서 스크립트 요소 대신 사용하기 위해 프로그래머가 직접 만든 태그
// => 태그클래스 작성 >> TLD 파일에 커스텀 태그 등록 >> JSP 문서에 커스템 태그 사용
//태그 클래스 : JSP 문서에서 커스텀 태그를 사용할 경우 호출될 메소드가 선언된 클래스
// => TagSupport 클래스 , BodyTagSupport 클래스 , SimpleTagSupport 클래스 중 하나를 상속받아 작성
// => 커스템 태그 사용 시 호출되는 메소드는 부모클래스의 메소드를 오버라이드 선언하여 작성
// => 필요한 메소드만 오버라이드해 작성하기
//태그 속성과 태그 내용이 없는 커스텀 태그의 클래스
public class HelloTag extends TagSupport{
private static final long serialVersionUID = 1L;
//JSP 문서에서 커스텀 태그를 최초로 사용할 경우 태그 클래스 객체를 생성하기 위해 한번만 호출되는 기본 생성자
public HelloTag() {
System.out.println("HelloTag 클래스의 기본 생성자 호출 - 객체 생성");
}
//JSP 문서에서 커스텀 태그의 시작태그를 사용할 때마다 자동 호출되는 메소드
@Override
public int doStartTag() throws JspException {
System.out.println("HelloTag 클래스의 doStartTag() 메소드 호출");
return super.doStartTag();
}
//JSP 문서에서 커스텀 태그의 태그내용을 사용할 때마다 자동 호출되는 메소드
//=> 우리가 만들 커스텀태그에는 태그내용이 없기 때문에 호출되지는 않음
@Override
public int doAfterBody() throws JspException {
System.out.println("HelloTag 클래스의 doAfterBody() 메소드 호출");
return super.doAfterBody();
}
//JSP 문서에서 커스텀 태그의 종료태그를 사용할 때마다 자동 호출되는 메소드
@Override
public int doEndTag() throws JspException {
System.out.println("HelloTag 클래스의 doEndTag() 메소드 호출");
return super.doEndTag();
}
}
src.main.webapp > WEB-INF > custom.tld
<?xml version="1.0" encoding="UTF-8"?>
<taglib version="2.1" xmlns="<Http://java.sun.com/xml/ns/javaee>" xmlns:xml="<http://www.w3.org/XML/1998/namespace>" xmlns:xsi="<http://www.w3.org/2001/XMLSchema-instance>" xsi:schemaLocation="<http://java.sun.com/xml/ns/javaee> <http://java.sun.com/xml/ns/javaee/web-jsptaglibrary_2_1.xsd> ">
<description>단순한 형태의 커스텀 태그 구현</description>
<tlib-version>1.0</tlib-version>
<short-name>simple</short-name>
<uri><http://www.itwill.xyz/mvc/custom></uri>
<!-- tag: 커스텀 태그를 등록하기 위한 엘리먼트 -->
<tag>
<!-- name : 커스텀 태그의 이름을 등록하기 위한 엘리먼트 -->
<name>hello</name>
<!-- tag-class : 커스텀 태그 사용 시 생성될 객체의 태그 클래스를 설정하기 위한 엘리먼트 -->
<tag-class>xyz.itiwll.custom.HelloTag</tag-class>
<!-- body-content : 커스텀 태그에서 사용 가능한 태그내용을 설정하기 위한 엘리먼트 -->
<!-- => empty : 태그내용이 없는 커스텀 태그를 설정하기 위한 엘리먼트 값 -->
<body-content>empty</body-content>
</tag>
</taglib>
xyz.itwill.custom > hello_tag.jsp
<%@ page language="java" contentType="text/html; charset=UTF-8"
pageEncoding="UTF-8"%>
//<%-- taglib 디렉티브를 사용하여 TLD 파일을 제공받아 JSP 문서에서 커스텀 태그 사용 가능 --%>
<%@taglib prefix="simple" uri="<http://www.itwill.xyz/mvc/custom>" %>
<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title>MVC</title>
</head>
<body>
<h1>Custom Tag - NoAtrribute And NoBody</h1>
<hr />
<!-- <%-- 태그내용이 있는 경우 시작태그와 종료태그를 따로 작성 --%>-->
<!-- <%-- <simple:hello></simple:hello> --%> -->
<!-- <%-- 태그내용이 없는(empty) 경우 시작태그와 종료태그를 같이 작성 --%>-->
<simple:hello/>
<simple:hello/> <!-- simple이라는 TLD 안에 있는 hello 태그 출력! -->
<simple:hello/>
<simple:hello/>
<simple:hello/>
</body>
</html>
04. 태그속성과 태그내용에 따른 EL 커스텀태그
1) custom.tld
<?xml version="1.0" encoding="UTF-8"?>
<taglib version="2.1" xmlns="<Http://java.sun.com/xml/ns/javaee>" xmlns:xml="<http://www.w3.org/XML/1998/namespace>" xmlns:xsi="<http://www.w3.org/2001/XMLSchema-instance>" xsi:schemaLocation="<http://java.sun.com/xml/ns/javaee> <http://java.sun.com/xml/ns/javaee/web-jsptaglibrary_2_1.xsd> ">
<description>단순한 형태의 커스텀 태그 구현</description>
<tlib-version>1.0</tlib-version>
<short-name>simple</short-name>
<uri><http://www.itwill.xyz/mvc/custom></uri>
🍑hello
<!-- tag: 커스텀 태그를 등록하기 위한 엘리먼트 -->
<!-- 🍑hello-->
<tag>
<!-- name : 커스텀 태그의 이름을 등록하기 위한 엘리먼트 -->
<name>hello</name>
<!-- tag-class : 커스텀 태그 사용 시 생성될 객체의 태그 클래스를 설정하기 위한 엘리먼트 -->
<tag-class>xyz.itiwll.custom.HelloTag</tag-class>
<!-- body-content : 커스텀 태그에서 사용 가능한 태그내용을 설정하기 위한 엘리먼트 -->
<!-- => empty : 태그내용이 없는 커스텀 태그를 설정하기 위한 엘리먼트 값 --
<body-content>empty</body-content>
</tag>
🍓helloMessag
<!-- 🍓helloMessage -->
<tag>
<name>helloMessage</name>
<tag-class>xyz.itiwll.custom.HelloMessageTag</tag-class>
<body-content>empty</body-content>
<!-- attribute : 태그 속성을 등록하기 위한 엘리먼트 -->
<attribute>
<!-- name : 태그 속성명을 설정하는 엘리먼트 -->
<!-- 주의) 태그 클래스의 필드명과 같은 이름으로 작성!!! -->
<name>name</name>
<!-- required : 커스텀 태그의 속성에 대한 필수 여부를 설정하기 위한 엘리먼트 -->
<!-- [false]: 선택적속성(생략가능 - 기본값) [true]: 필수속성 -->
<required>true</required><!-- name 속성은 무조건 써야합니다!!! -->
</attribute>
<!-- 태그 속성이 더 있다면 attribute태그 추가하기 -->
<!-- <attribute></attribute> -->
</tag>
🍏helloBody
<!-- 🍏helloBody-->
<tag>
<name>helloBody</name>
<tag-class>xyz.itiwll.custom.HelloBodyTag</tag-class>
<!-- body-content 엘리먼트 값으로 [JSP]를 설정하면 태그내용으로 JSP 명령 사용 가능 -->
<!-- empty, JSP, scriptless , tagdependent 중 하나 설정 가능 -->
<body-content>JSP</body-content>
<attribute>
<!-- 태그 클래스의 필드명(test)과 반드시 같은 이름 -->
<name>test</name>
<required>true</required>
<!-- rtexprvalue : 태그 속성값으로 JSP Expression 또는 EL 사용 여부를 설정하기 위한 엘리먼트 -->
<!-- => [false] : 사용불가능(기본), [true] : 사용가능 -->
<!-- runtime expression value의 약자 - 실행할 때 expression 값을 사용하 수 있나요? -->
<rtexprvalue>true</rtexprvalue>
</attribute>
</tag>
</taglib>
2) 태그속성X 태그내용X
🍑HelloTag.java
package xyz.itiwll.custom;
import java.io.IOException;
import javax.servlet.jsp.JspException;
import javax.servlet.jsp.tagext.TagSupport;
//커스텀 태그(Custom Tag) : JSP 문서에서 스크립트 요소 대신 사용하기 위해 프로그래머가 직접 만든 태그
// => 태그클래스 작성 >> TLD 파일에 커스텀 태그 등록 >> JSP 문서에 커스템 태그 사용
//태그 클래스 : JSP 문서에서 커스텀 태그를 사용할 경우 호출될 메소드가 선언된 클래스
// => TagSupport 클래스 , BodyTagSupport 클래스 , SimpleTagSupport 클래스 중 하나를 상속받아 작성
// => 커스템 태그 사용 시 호출되는 메소드는 부모클래스의 메소드를 오버라이드 선언하여 작성
// => 필요한 메소드만 오버라이드해 작성하기
//태그 속성과 태그 내용이 없는 커스텀 태그의 클래스
public class HelloTag extends TagSupport{
private static final long serialVersionUID = 1L;
//JSP 문서에서 커스텀 태그를 최초로 사용할 경우 태그 클래스 객체를 생성하기 위해 한번만 호출되는 기본 생성자
public HelloTag() {
//System.out.println("HelloTag 클래스의 기본 생성자 호출 - 객체 생성");
}
//JSP 문서에서 커스텀 태그의 시작태그를 사용할 때마다 자동 호출되는 메소드
@Override
public int doStartTag() throws JspException {
//System.out.println("HelloTag 클래스의 doStartTag() 메소드 호출");
try {
//부모클래스(TagSupport)에서 제공받은 PageContext 객체(pageContext 변수에 저장)를
//이용하여 웹프로그램 실행에 필요한 객체를 반환받아 명령 작성
//PageContext.getOut() : 응답결과를 생성하기 위한 출력스트림(JspWriter 객체)을 반환하는 메소드
pageContext.getOut().println("<div>안녕하세요.</div>");
}catch (IOException e) {
e.printStackTrace();
}
//doStartTag() 태그의 반환값(정수값) : 부모클래스(TagSupport)에서 제공되는 상수 사용
// => SKIP_BODY, EVAL_BODY_INCLUDE , EVAL_BODY_AGAIN 중 하나를 선택하여 반환
// => SKIP_BODY : 태그내용을 클라이언트에게 전달하지 않을 경우 사용하는 상수 - 기본값
//TLD파일의 empty를 다른 내용(ex. JSP)으로 변경되어도 실제 태그내용이 클라이언트에게 전달되지 않음
// => EVAL_BODY_INCLUDE : 태그내용을 클라이언트에게 전달할 경우 사용하는 상수
// => EVAL_BODY_AGAIN : 태그내용을 클라이언트에게 다시 한번 전달할 경우 사용하는 상수
return SKIP_BODY;
}
//JSP 문서에서 커스텀 태그의 태그내용을 사용할 때마다 자동 호출되는 메소드
//=> 우리가 만들 커스텀태그에는 태그내용이 없기 때문에 호출되지는 않음
@Override
public int doAfterBody() throws JspException {
//System.out.println("HelloTag 클래스의 doAfterBody() 메소드 호출");
//doAfterBody()태그의 반환값(정수값) : doStartTag() 태그의 반환값과 동일
return super.doAfterBody();
}
//JSP 문서에서 커스텀 태그의 종료태그를 사용할 때마다 자동 호출되는 메소드
@Override
public int doEndTag() throws JspException {
//System.out.println("HelloTag 클래스의 doEndTag() 메소드 호출");
//doEndTag() 태그의 반환값(정수값) : 부모클래스(TagSupport)에서 제공되는 상수 사용
// => SKIP_PAGE, EVAL_PAGE 중 하나를 선택하여 반환
// => SKIP_PAGE : 종료 태그 실행 후 JSP 문서를 강제로 종료할 때 사용하는 함수
//한번 실행 후 그 아래의 명령들은 실행이 안됨 즉, 안녕하세요가 딱 1번만 출력됨
//JSP model1에서 return 명령으로 종료할 수 있게 만든 것과 동일한 효과
// => EVAL_PAGE : 종료 태그 실행 후 JSP 문서를 계속 실행할 때 사용하는 함수 - 기본값
return EVAL_PAGE;
}
}
🍑hello_tag.jsp
<%@ page language="java" contentType="text/html; charset=UTF-8"
pageEncoding="UTF-8"%>
//<%-- taglib 디렉티브를 사용하여 TLD 파일을 제공받아 JSP 문서에서 커스텀 태그 사용 가능 --%>
<%@taglib prefix="simple" uri="<http://www.itwill.xyz/mvc/custom>" %>
<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title>MVC</title>
</head>
<body>
<h1>Custom Tag - NoAtrribute And NoBody</h1>
<hr />
//1.
//<%-- 태그내용이 있는 경우 시작태그와 종료태그를 따로 작성 --%>
//<%-- 하지만, 지금 만든 커스텀태그에는 태그내용이 없기 때문에 2번째처럼 만들기 권장 --%>
//<%-- <simple:hello></simple:hello> --%>
//2.
//<%-- 태그내용이 없는 경우(empty) 시작태그와 종료태그를 같이 작성 --%>
//<!-- simple이라는 TLD 안에 있는 hello 태그 출력! -->
<simple:hello/>
<simple:hello/>
<simple:hello/>
<simple:hello/>
<simple:hello/>
</body>
</html>
3) 태그속성O 태그내용X
🍓HelloMessageTag.java
package xyz.itiwll.custom;
import java.io.IOException;
import javax.servlet.jsp.JspException;
import javax.servlet.jsp.tagext.TagSupport;
//태그 속성이 있으며 태그 내용이 없는 커스텀 태그의 클래스
public class HelloMessageTag extends TagSupport{
private static final long serialVersionUID = 1L;
//태그 속성값을 저장하기 위한 필드 선언 - 태그의 속성명(name)과 같은 이름으로 필드(name)를 선언
private String name;
//생성자에서는 객체 생성에 필요한 초기화 작업에 대한 명령 작성 - 필드 초기값 설정
public HelloMessageTag() {
//커스텀 태그에서 속성을 생략할 경우 기본적으로 사용될 속성값을 필드에 자동 저장하기 위해 작성
// => 태그 속성이 필수인 경우 필드 기본값 설정 생략
name="홍길동";
}
//사실 Getter는 필요없고 Setter만 이용할 것임
public String getName() {
return name;
}
//커스텀 태그에서 태그의 속성을 사용하여 속성값을 설정할 경우 Setter 메소드 자동 호출
// => 매개변수로 속성값을 제공받아 필드값 변경
public void setName(String name) {
this.name = name;
}
//커스텀 태그 사용시 실행될 명령이 있는 경우에만 메소드를 오버라이드 선언하여 작성
// => 메소드를 오버라이드 선언하지 않으면 자동으로 부모클래스의 명령이 없는 메소드 호출
@Override
public int doStartTag() throws JspException {
try {
if(name.equals("홍길동")) {
pageContext.getOut().println("<h3>관리자님, 안녕하세요.</h3>");
} else {
pageContext.getOut().println("<h3>"+name+"님, 안녕하세요.</h3>");
}
} catch (IOException e) {
throw new JspException(e.getMessage()); //콘솔 뿐만 아니라 브라우저에도 출력됨
//System.out.println(e.getMessage()); //콘솔에만 출력됨
}
return super.doStartTag();
//return SKIP_BODY;
}
}
🍓hello_message_tag.jsp
<%@ page language="java" contentType="text/html; charset=UTF-8"
pageEncoding="UTF-8"%>
<%@ taglib prefix="simple" uri="<http://www.itwill.xyz/mvc/custom>" %>
<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title>MVC</title>
</head>
<body>
<h1>Custom Tag - AnyAtrribute And NoBody</h1>
<hr />
//<%-- 커스텀 태그의 속성을 생략한 경우 태그 클래스의 생성자에서 설정한 기본값을 속성값으로 사용 --%>
//<%-- =>하지만 커스텀 태그의 속성이 필수로 설정된 경우 속성을 생략하면 error 발생 --%>
//<%-- <simple:helloMessage/> --%>
//<%-- 커스텀 태그의 속성이 필수로 설정된 경우 태그 사용 시 속성 자동 완성 --%>
<simple:helloMessage name="홍길동"/>
//<%-- 커스템 태그의 속성을 사용하여 속성값을 설정한 경우 태그 클래스의 필드에 대한 Setter 메소드를
//자동 호출하여 속성값을 전달받아 필드값 변경 --%>
//<%-- 태그 클래스에 필드에 대한 Setter 메소드가 없는 경우 500 에러 발생 --%>
<simple:helloMessage name="임꺽정"/>
</body>
</html>
4) 태그속성O 태그내용O
🍏HelloBodyTag.java
package xyz.itiwll.custom;
import java.io.IOException;
import javax.servlet.jsp.JspException;
import javax.servlet.jsp.tagext.TagSupport;
//태그 속성과 태그 내용이 있는 커스텀 태그의 클래스
public class HelloBodyTag extends TagSupport{
private static final long serialVersionUID = 1L;
//커스텀 태그의 속성값을 저장하기 위한 필드
//=> 태그 속성이 필수인 경우 생성자를 이용하여 필드 초기화 작업 생략
private boolean test;
//Getter
public boolean isTest() {
return test;
}
//Setter
public void setTest(boolean test) {
this.test = test;
}
@Override
public int doStartTag() throws JspException {
try {
if(test) {//만약 test값이 true라면
pageContext.getOut().println("<h3>");
} else {
pageContext.getOut().println("<p>");
}
}catch (IOException e) {
throw new JspException(e.getMessage());
}
return EVAL_BODY_INCLUDE; //태그 내용을 포함해서 전달
}
@Override
public int doEndTag() throws JspException {
try {
if(test) {//만약 test값이 true라면
//=> 실제 만든다면 조건문, 반복문 등등 다양히 이용함
pageContext.getOut().println("님, 안녕하세요</h3>");
} else {
pageContext.getOut().println("님, 반갑습니다.</p>");
}
}catch (IOException e) {
throw new JspException(e.getMessage());
}
return super.doEndTag(); //기본값이용 EVAL_PAGE;
}
}
🍏 hello_body_tag.jsp
<%@ page language="java" contentType="text/html; charset=UTF-8"
pageEncoding="UTF-8"%>
<%@taglib prefix="simple" uri="<http://www.itwill.xyz/mvc/custom>" %>
<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title>MVC</title>
</head>
<body>
<h1>Custom Tag - AnyAtrribute And AnyBody</h1>
<hr>
<simple:helloBody test="true">홍길동</simple:helloBody>
<simple:helloBody test="false">임꺽정</simple:helloBody>
<hr>
<%
String name="전우치";
request.setAttribute("name", "일지매");
%>
<simple:helloBody test="true"><%=name %></simple:helloBody>
<simple:helloBody test="false">${name }</simple:helloBody>
<hr>
<%
boolean sw=true;
request.setAttribute("sw", false);
%>
<simple:helloBody test="<%=sw %>">장길산</simple:helloBody>
//<%-- 커스텀태그의 속성값으로는 JSP Expression 또는 EL 사용이 불가능하므로 500 에러 떨어지지만,
//TLD파일의 rtexprvalue 속성값을 true로 주면 사용 가능 --%>
<simple:helloBody test="${sw}">홍경래</simple:helloBody>
</body>
</html>
반응형
'jsp' 카테고리의 다른 글
[jsp] 29. 회원정보 관리 프로그램(MVC) (0) | 2024.07.18 |
---|---|
[jsp] 28. JSTL(Java Standard Tag Library) (0) | 2024.07.18 |
[jsp] 26. filter클래스 만드는법 (context-param VS init-param) (0) | 2024.07.16 |
[jsp] 25. EL의 내장객체 (0) | 2024.07.16 |
[jsp] 24. EL(Expression Language)의 개념 (0) | 2024.07.15 |