[jsp]나만의 custom tag 만들기

지금은 jsp로 페이지를 개발할 때, jstl등을 많이 쓰겠지만 필요에 따라서는 나만의

커스텀태그를 만들어사용하면 jsp내에서도 코드의 모듈화가 가능해지고 코드도

훨씬 깔끔하다. 그래서 간단하게 테스트해보았다.

(1)  커스텀태그를 수행할 클래스 만들기

public class TagFunctionTest {
	public static Integer plus(Integer x, Integer y) {
		return x+y;
	}

	public static Integer times(Integer x, Integer y) {
		return x*y;
	}
}

public class GreetCustumTagTest extends SimpleTagSupport {
	private String username;

	public void setUsername(String username) {
		this.username = username;
	}

	@Override
	public void doTag() throws JspException, IOException {
		if ("bluepoet".equals(username)) {
			getJspBody().invoke(null);
		}
	}
}

이때, 주의할 것은 메서드의 리턴값이든 인자값이든 모두 primitive 타입은 안된다.

int 대신 Integer 랩퍼클래스를 사용해야 한다.

그리고, SimpleTagSupport를 상속받은 클래스는 doTag 메서드를 실행하며,

속성으로 받은 값을 setter method로 가져와서 사용하게 된다.

(2) WEB-INF/ 밑 적절한 위치에 .tld 파일 만들기

*hello.tld
<short-name>hello</short-name>
<uri>http://glider.com/helloglider</uri>
<tag>
	<name>greet</name>
	<tagclass>com.glider.framework.tags.GreetCustumTagTest</tagclass>
	<bodycontent>scriptless</bodycontent>
	<attribute>
		<name>username</name>
		<required>true</required>
		<rtexprvalue>false</rtexprvalue>
	</attribute>
</tag>

*function.tld
<short-name>gdf</short-name>
<uri>http://glider.com/gdftags</uri>

<function>
	<name>plus</name>
	<function-class> com.glider.framework.tags.TagFunctionTest</function-class>
	<function-signature>
		java.lang.Integer plus(java.lang.Integer, java.lang.Integer)
	</function-signature>
</function>

<function>
	<name>times</name>
	<function-class> com.glider.framework.tags.TagFunctionTest</function-class>
	<function-signature>
		java.lang.Integer times(java.lang.Integer, java.lang.Integer)
	</function-signature>
</function>

(3) 사용하고자 하는 jsp에서 커스텀태그 선언후 사용하기

<%@ page language="java" contentType="text/html; charset=utf-8" pageEncoding="utf-8"%>
<%@taglib prefix="gdf"  uri="http://glider.com/gdftags"%>
<%@taglib prefix="hello"  uri="http://glider.com/helloglider"%>
<html>
<body>
[커스텀태그 테스트]
* 플러스 커스텀태그 테스트 : ${gdf:plus(1,2)}

* 곱하기 커스텀태그 테스트 : ${gdf:times(2,2)}

* 커스텀 문자열 인사 :
<hello:greet username="bluepoet">bluepoet 너 맞구나!!!</hello:greet>
</body>
</html>

(4) 결과

username 속성에 “bluepoet”을 주지 않게 되면

bluepoet 너 맞구나!!! 문자열이 보이지 않게 된다^^

* 참고사이트

 

Advertisements